在 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 无法接收,会导致出错。