通常在服务器上部署的Docker容器并不会自动更新,而如果我们需要更新容器一般需要以下三个步骤:
停止并删除容器:docker rm -f
更新镜像:docker pull
启动容器:docker run …
但如果部署了大量的容器需要更新使用这种传统的方式工作量是巨大的。
Watchtower 是一个可以实现自动化更新 Docker 基础镜像与容器的实用工具,它监视正在运行的容器以及相关的镜像,当检测到registry中的镜像与本地的镜像有差异时,它会拉取最新镜像并使用最初部署时相同的参数重新启动相应的容器,非常的方便。
更新方法
Watchtower本身被打包为Docker镜像,因此可以像其他容器一样运行:
docker run -d \
--name watchtower \
-v /var/run/docker.sock:/var/run/docker.sock \
containrrr/watchtower
然后所有容器都会自动更新,也包括Watchtower本身。
自动清除旧镜像
由于官方给出的默认启动命令在长期使用后会堆积非常多的标签为none的旧镜像,如果放任不管会占用大量的磁盘空间。要避免这种情况可以加入–cleanup选项,这样每次更新都会把旧的镜像清理掉。
docker run -d \
--name watchtower \
--restart unless-stopped \
-v /var/run/docker.sock:/var/run/docker.sock \
containrrr/watchtower \
--cleanup
–cleanup 选项可以简写为 -c
选择性自动更新
某些容器可能需要稳定的运行,经常更新或重启可能会造成一些问题,这时我们可以使用一些参数来选择与控制容器的更新。
假设我们需要更新nginx、redis这两个容器,我们可以把容器名称追加到启动命令的最后面,就像下面这个例子:
docker run -d \
--name watchtower \
--restart unless-stopped \
-v /var/run/docker.sock:/var/run/docker.sock \
containrrr/watchtower -c \
nginx redis
如果需要排除某些容器,可以将com.centurylinklabs.watchtower.enable设置为false。即在docker run命令中加入–label=com.centurylinklabs.watchtower.enable=false参数。
在下面这个例子中,除了nginx、redis以外的容器都会自动更新:
docker run -d \
--name watchtower \
--restart unless-stopped \
-v /var/run/docker.sock:/var/run/docker.sock \
--label=com.centurylinklabs.watchtower.enable=false \
containrrr/watchtower \
--cleanup \
nginx redis
设置自动更新频率
默认情况下Watchtower每5分钟会轮询一次,如果你觉得这个频率太高了可以使用如下选项来控制更新的频率,但二者只能选择其一。
–interval,-i:设置间隔更新时间,单位为秒。默认 300 秒( 5 分钟)
–schedule,-s:设置定时更新时间,格式为 Cron 表达式,比如–schedule “0 0 4 * * *”
比如每小时检查一次更新:
docker run -d \
--name watchtower \
--restart unless-stopped \
-v /var/run/docker.sock:/var/run/docker.sock \
containrrr/watchtower \
--cleanup \
-i 3600
手动更新
前面的使用方式都是让Watchtower以 detached(后台)模式在运行并自动更新容器,而Watchtower也支持以foreground(前台)模式来使用,即运行一次退出并删掉容器,来实现手动更新容器。这对于偶尔更新一次那些在自动更新中被排除的容器非常有用。
对于foreground模式,需要加上–run-once这个专用的选项。下面的例子Docker会运行一次Watchtower并检查nginx容器的基础镜像更新,最后删掉本次运行创建的Watchtower容器。
docker run --rm \
-v /var/run/docker.sock:/var/run/docker.sock \
containrrr/watchtower \
--cleanup \
--run-once \
nginx
同样的手动更新你也可以排除某些容器,更新其它的容器:
docker run --rm \
-v /var/run/docker.sock:/var/run/docker.sock \
--label=com.centurylinklabs.watchtower.enable=false \
containrrr/watchtower \
--cleanup \
--run-once \
nginx
–run-once 可以简写为 -R
PS:在群晖里,可以通过[任务计划]来运行。
本文地址: Watchtower自动更新Docker容器