【抄作业】如何优雅的更新 Docker 容器?使用Watchtower让Docker容器实现自动更新
我们在折腾NAS上 Docker 的时候,一般更新容器还需要手动停止容器,然后重新映射文件夹配置端口,重新拉取一次镜像,最后还要在重启容器。虽说步骤不多,但是如果Docker 容器比较多的话,操作起来还是很麻烦的。
今天就教大家一种可以利用Watchtower这款神器,实现Docker容器自动更新的小技巧,有需要的小伙伴先收藏,再观看!
🔺今天使用的NAS为威联通TS-464C,作为家用型4盘位旗舰款,它搭载了Intel 四核心处理器,支持Intel OpenVINO AI引擎,配置了双2.5GbE口,NVMe双M.2插槽,再加上USB3.2和HDMI2.0的加入,不管是玩Docker还是折腾虚拟机都游刃有余!
关于Watchtower
👉什么是Watchtower?
Watchtower 是一款自由开源的应用,它本身自己也是一个 Docker 镜像,主要作用是用来监控运行中的容器最初启动时的镜像是否需要更新。
👉Watchtower如何工作?
Watchtower在运行之后会监视NAS中正在运行的容器以及相关的镜像(可以是全部也可以是我们指定的),当它发现运行容器中的镜像已经有变动并需要更新的时候,它会以发送 SIGTERM 信号的方式,先结束运行中容器运行,然后会根据我们设定的指令(其实就是一条命令行),用该容器镜像最开始相同的参数自动重新启动相应的容器,甚至包括Watchtower本身,就是这么简单!
还不理解?你就把它看作是我们手机上的应用市场,而Docker容器就是手机上的APP,应用市场实际上也是一个APP,但是通过它可以更新手机上所有的APP。
部署Watchtower
前面说过,Watchtower的运行仅需一条命令即可完成,所有我们想要什么样的Docker 更新效果就在于我们命令的参数。所以接下来我将从各种需求来教大家如何设定Watchtower的部署命令!
为了让小伙伴们更好的抄作业,以下命令全部都在SSH连接的模式下进行。SSH连接工具请自备(Putty,XShell,FinalShell等),我演示的为FinalShell。
👉快速更新全部容器(不推荐)
这个是Watchtower默认的命令(原始命令),在这个命令下,我们可以快速的部署Watchtower程序。
🔺命令为:
docker run -d —name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower
但是这个命令默认更新的是所有运行中的容器,包括Watchtower自己。如果说你NAS中就部署了几个Docker容器,并且也确实需要让它们全部保持最新,这个命令就适合你,但是如果你NAS里面的Docker容器非常多,并且还有多个容器联动达到一个目的(比如搭建影音库就需要多个Docker容器联动),或者说有些容器已经很稳定我们不需要更新,全部更新可能会出现问题。
👉指定更新容器
通过这种方法,我们可以更新指定的容器,而没有被指定的容器则不会被更新。
🔺在更新指定的容器前,我们需要知道我们需要更新容器的名字。命令为:
docker ps
在后面“NAMES”下面便是我们NAS中运行的所有Docker容器的名字。
假设我们需要监控并更新的容器为 librespeed-1和 portainer,我们需要的操作为:
🔺命令为:
docker run -d —name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower librespeed-1 portainer
简单来说,它只需要在Watchtower默认的命令后面加上我们指定的容器名字即可,并且多个容器名字只用空格隔开即可,就这么简单!
👉自动清除旧镜像
默认命令如果长期使用会堆积非常多的标签为 none 的旧镜像,这些旧镜像占用的可是我们NAS中的磁盘空间,这个时候我们只需要在命令后面加上“ —cleanup ”的参数选项,这样每次更新都会把旧的镜像清理掉。
🔺命令为:
docker run -d —name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower —cleanup XXXX
XXXX为指定容器名字。
👉指定更新频率
这里有两种方式可供选择,两种方式任选其一便可!
❶设置更新时间间隔,单位为秒,加入的命令参数为“ —interval ”。比如说我们需要设定每一个小时检查一次更新的频率:
🔺命令为:
docker run -d —name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower —cleanup —interval 3600 XXXX
XXXX为指定容器名字。
❷设置定时检测,格式为 6 字段 Cron 表达式,加入的命令参数为“ —schedule ”。比如我们需要每天凌晨 3 点种检查更新:
🔺命令为:
docker run -d —name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower —cleanup —schedule “0 0 3 *” XXXX
XXXX为指定容器名字。
👉前台模式(手动更新)
前面介绍的更新Watchtower都是以 detached(后台)模式运行的,而 foreground(前台)模式可以说是手动模式,也就是说Watchtower运行一次就自动退出容器,下次需要的时候在次启动便可,这个对于更新次数比较少的容器还是非常有用的。这个模式需要加入的命令参数为“ —run-once ”
举例说明,我们需要检查更新librespeed-1和 portainer ,并且更新好之后退出本次运行创建的 Watchtower 容器:
🔺命令为:
docker run -d —name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower —cleanup —run-once XXXX
XXXX为指定容器名字。
🔺通过威联通的Container Staion可以发现,Watchtower 确实为退出状态。
实操演示
说了那么多,还是为小伙伴们展示一次实操结果吧!
🔺比如说我NAS上的qbittorrentee镜像目前在DockerHub上的最新版本为4.5.2.10
🔺但是我NAS上部署的容器显示的版本为4.5.1.10,很明显低一个版本。
🔺我的需求是只更新一次qbittorrentee容器,之让Watchtower退出。按照前面所说的命令格式,它的完整命令为:
docker run -d —name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower —cleanup —run-once qbittorrentee
🔺大概过了30秒,等我在次打开qbittorrentee界面,版本已经为最新的4.5.2.10
🔺并且Watchtower已退出,就是这么简单~!
🔺对于刚刚命令的运行结果,我们还可以查看日志。命令为:
docker logs -f watchtower
一步小心我又杠到深夜了,为了满足不同需求的小伙伴,以上每个命令我都需要不停的删除,然后重新部署才得以完成,难度不大,但是非常的耗费时间。
本篇文章也是我特意为NAS上玩Docker开设的个人专栏第一篇,还请小伙伴们多多支持!后续会有更多精彩的内容分享给大家!
好了,以上就是今天给大家分享的内容,我是爱分享的Stark-C,如果今天的内容对你有帮助请记得收藏,顺便点点关注,我会经常给大家分享各类有意思的软件和免费干货!谢谢大家~

















校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案