OpenWRT 安装 Docker 服务管理工具的方法

在 OpenWRT 上安装 Docker 容器离不开 Luci-app-dockerman,它是用于管理 Docker 容器、镜像、网络、存储卷的服务管理插件,但由于 OpenWRT 官方将 Docker-ce 拆分为 Dockerd 和 Docker 两个包,安装时候要特别注意所需的依赖。

所需依赖

ttyd 用作于 Docker 控制台

luci-lib-docker 为核心依赖

dockerd 用作于 Docker 客户端

luci-lib-jsonc 为核心依赖

docker 用作于 Docker 控制台

安装方法

1、设备空间不足的情况下,建议插个外置硬盘或者扩容个硬盘并挂载到 /opt 分区,作为储存 Docker 数据分区使用,挂载完成重启,不会挂载的,可以查看挂载外置移动硬盘教程,如下图:

2、更换 OPKG 配置内的发行版软件源,注意架构,演示为 aarch64_cortex-a53 架构,自行替换即可,比方将 aarch64_cortex-a53 替换为 x86_64 架构,只需要打开链接查找修改即可,如下图:

# 以下为 aarch64_cortex-a53 架构使用
src/gz openwrt_base https://archive.openwrt.org/releases/packages-22.03/aarch64_cortex-a53/base
src/gz openwrt_luci https://archive.openwrt.org/releases/packages-22.03/aarch64_cortex-a53/luci
src/gz openwrt_packages https://archive.openwrt.org/releases/packages-22.03/aarch64_cortex-a53/packages
src/gz openwrt_routing https://archive.openwrt.org/releases/packages-22.03/aarch64_cortex-a53/routing
src/gz openwrt_telephony https://archive.openwrt.org/releases/packages-22.03/aarch64_cortex-a53/telephony

3、安装 Dockerman 所需依赖,分别为 TTYD、Luci-lib-docker、Dockerd、Luci-lib-jsonc 和 Docker,除 TTYD 外单独安装,其他所需依赖的安装建议使用强制安装,自动补齐 Dockerd 的核心依赖,如下图:

# 更新组件
opkg update

# 安装TTYD
opkg install ttyd

# 强制依赖,--force-depends 为强制命令
opkg install luci-lib-docker dockerd luci-lib-jsonc docker --force-depends

# 查看版本,有输出就说明成功了
docker --version

4、通过本站提供的 Github 地址下载最新的 Luci-app-dockerman 插件,通过 SFTP 上传到 root 目录下,执行命令进行安装,安装完成就可以在 LuCI 内看到 Docker 服务管理工具了,如下图:

# 下载插件,演示时为 0.5.25
https://github.com/lisaac/luci-app-dockerman

# 安装插件,可用 Tab 补齐
opkg install luci-app-dockerman_*_all.ipk

5、安装完成重启设备就会发现不自启,执行以下命令启动 Dicker 并设置自启即可,有人喜欢用 S100docker,个人使用了 S99docker,如下图:

# 启动命令
/etc/init.d/dockerd start

# 自启命令
ln -s /etc/init.d/dockerd /etc/rc.d/S99docker //本站使用
ln -s /etc/init.d/dockerd /etc/rc.d/S100docker //他人使用

已知问题

因固件差异化,可能部分固件存在 Docker 重启不自起的问题,不是不能解决,可以将正在运行的容器设为自启来解决,以下提供了 Docker的 –restart 参数,和将自启动的容器设置和取消自启的命令,命令如下:

--restart 参数
no //默认策略,在容器退出时不重启容器
on-failure //非正常退出时(退出状态非0),才会重启容器
on-failure:3 //非正常退出时重启容器,最多重启3次
always //退出时总是重启容器
#开机自启
unless-stopped //退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
# 一般推荐使用always参数
--restart=always

# 将正在运行的容器设为自
docker update --restart=always [CONTAINER ID] //docker update --restart=always 容器名或容器ID
docker update --restart=always tomcat //例如将tomcat设为自启动

# 将自启动的容器取消自启
docker update --restart=no [CONTAINER ID] //docker update --restart=no 容器名或容器ID
docker update --restart=no tomcat //例如取消tomcat的自启动

禁止 WAN 访问容器映射的端口是基于 Docker 自带的 DOCKER-USER 链,由于 19.03.3 的 这个BUG,可能会不成功,建议更新 Docker-ce 版本。

镜像页面涉及的导入/载入镜像操作,当用于上传.tar文件时,在某些老版本的 LuCI 中,包括LEAN版,会导致不成功,表现为一直 loading/importing,无法上传,是由于 LuCI 库的问题。

由于 luci-lib-jsonc 在转化成 json 字符串时,会将 INT64 的数字转化成 DOUBLE,这个 BUG 导致在使用 <编辑容器/新建容器> 中,提交 CPU 数量/内存限制时,数值介于 INT_MAX 至 INT64 之间的数字转成 DOUBLE,Docker engine 无法接收,会导致出错。