Watchtower 自动更新 Docker 镜像与容器

1035 字
5 分钟
Watchtower 自动更新 Docker 镜像与容器

前言#

在服务器上部署 Docker 容器有一种在手机上装 APP 的感觉,但 Docker 容器并不会像手机 APP 那样会自动更新,而如果我们需要更新容器一般需要以下三个步骤:

  1. 停止并删除容器:docker rm -f <CONTAINER>
  2. 更新镜像:docker pull <IMAGE>
  3. 启动容器:docker run <ARG> ... <IMAGE>

如果部署了大量的容器需要更新使用这种传统的方式工作量是巨大的。

docker-update.png
docker-update.png

Watchtower 是一个可以实现自动化更新 Docker 基础镜像与容器的实用工具。它监视正在运行的容器以及相关的镜像,当检测到reg­istry中的镜像与本地的镜像有差异时,它会拉取最新镜像并使用最初部署时相同的参数重新启动相应的容器,一切好像什么都没发生过,就像更新手机上的APP一样。

快速开始#

Watch­tower本身被打包为Docker镜像,因此可以像运行任何其他容器一样运行它:

Terminal window
docker run -d \
--name watchtower \
-v /var/run/docker.sock:/var/run/docker.sock \
containrrr/watchtower

然后所有容器都会自动更新,也包括Watch­tower本身。

自动清除旧镜像#

官方给出的默认启动命令在长期使用后会堆积非常多的标签为none的旧镜像,如果放任不管会占用大量的磁盘空间。要避免这种情况可以加入--cleanup选项,这样每次更新都会把旧的镜像清理掉。

Terminal window
docker run -d \
--name watchtower \
--restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
containrrr/watchtower \
--cleanup

选择性自动更新#

某些容器可能需要稳定的运行,经常更新或重启可能会造成一些问题,这时我们可以使用一些参数来选择与控制容器的更新。

假设我们需要更新容器名称为nginxredis这两个容器,我们可以把容器名称追加到启动命令的最后面,就像下面这个例子:

Terminal window
docker run -d \
--name watchtower \
--restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
containrrr/watchtower \
--cleanup \
nginx redis

如果需要排除某些容器,可以将com.centurylinklabs.watchtower.enable设置为false。即在docker run命令中加入--label=com.centurylinklabs.watchtower.enable=false参数。在下面这个例子中,除了容器名称为nginxredis以外的容器都会自动更新:

Terminal window
docker run -d \
--name watchtower \
--restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
--label=com.centurylinklabs.watchtower.enable=false \
containrrr/watchtower \
--cleanup \
nginx redis

设置自动更新频率#

默认情况下Watch­tower5分钟会轮询一次,如果你觉得这个频率太高了可以使用如下选项来控制更新的频率:

  • --interval,-i:设置间隔更新时间。默认 300 秒( 5 分钟)
  • --schedule,-s:设置定时更新时间。格式为6位的 Cron 表达式,比如--schedule "0 0 4 * * *"

比如每小时检查一次更新:

Terminal window
docker run -d \
--name watchtower \
--restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
containrrr/watchtower \
--cleanup \
-i 3600

每天凌晨 1 点更新(北京时间),注意追加环境变量 -e TZ=Asia/Shanghai

docker run -d \
--name watchtower \
--restart=always \
-e TZ=Asia/Shanghai \
-v /var/run/docker.sock:/var/run/docker.sock \
containrrr/watchtower \
--cleanup \
-s "0 0 1 * * *"

手动更新#

前面的使用方式都是让Watch­towerdetached(后台)模式在运行并自动更新容器,而Watch­tower也支持以foreground(前台)模式来使用,即运行一次退出并删掉容器,来实现手动更新容器。这对于偶尔更新一次那些在自动更新中被排除的容器非常有用。

对于foreground模式,需要加上--run-once这个专用的选项。下面的例子Docker会运行一次Watch­tower并检查容器名称为nginx容器的基础镜像更新,最后删掉本次运行创建的Watch­tower容器。

Terminal window
docker run --rm \
-v /var/run/docker.sock:/var/run/docker.sock \
containrrr/watchtower \
--cleanup \
--run-once \
nginx

同样的手动更新你也可以排除某些容器,更新其它的容器:

Terminal window
docker run --rm \
-v /var/run/docker.sock:/var/run/docker.sock \
--label=com.centurylinklabs.watchtower.enable=false \
containrrr/watchtower \
--cleanup \
--run-once \
nginx

后记#

官方文档:Watchtower Document

常见问题#

若 Watchtower 报错Could not do a head request for xxx , falling back to regular pull. 导致无法自动更新容器的问题与注册表相关,请取消自定义注册表镜像。

微信公众号

搜一搜 IMMOEWAH

技术/人文/思辨/随笔

微信公众号

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!

赞助
Watchtower 自动更新 Docker 镜像与容器
https://blog.moewah.com/posts/3863/
作者
MoeWah
发布于
2020-06-13
许可协议
CC BY-NC-SA 4.0
相关文章 智能推荐
1
DIUN:Docker镜像更新通知神器
虚拟化与运维 如何监控Docker镜像更新而不自动升级?DIUN是一款专注通知的轻量级工具,帮助你主动查看镜像变更日志,避免盲目更新导致容器异常,确保系统稳定运行。
2
从手动挂载到自动挂载:Autofs 挂载 NFS 的真香体验
虚拟化与运维 如何解决NFS挂载导致系统启动卡死的问题?本文详细分享使用Autofs实现智能自动挂载的实战方案,解决fstab依赖问题,提升系统稳定性与资源利用率。
3
Ubuntu/Debian 卸载命令全解:apt remove/purge/autoremove 的区别
虚拟化与运维 apt remove、apt purge、apt autoremove 三个卸载命令的区别详解:remove 保留配置、purge 清除配置、autoremove 清理孤儿依赖,附 --simulate 预览技巧与官方文档出处,Ubuntu/Debian 用户避坑指南。
4
Docker Volume 与 Bind Mount 怎么选?区别、性能对比、双向迁移实战
虚拟化与运维 Docker Volume 和 Bind Mount 有什么区别?性能差距大吗?一文讲透数据卷与绑定挂载的管理边界、适用场景与迁移便捷性,附双向转换完整命令:卷迁宿主机目录、目录转数据卷,全部实测可抄。数据库用卷、开发热重载用绑定挂载,自部署选型不再纠结。
5
SSH 终端下 nano/vim 编辑器卡死问题:terminfo 不兼容排查修复
虚拟化与运维 SSH 连接服务器后 nano/vim 打开即卡死、乱码,方向键退格失效,但 ls/cat 正常?根因是 TERM 环境变量与服务器 terminfo 数据库不兼容。本文给出 4 步排查法、TERM=xterm 修复命令与 256 色保留方案。
随机文章 随机推荐

评论区

Profile Image of the Author

关于作者

MoeWah

我是 MoeWah,喵斯基部落的作者。一个折腾自托管、群晖 NAS、虚拟化运维与 SEO/GEO 实践的独立博主,10 年以上的企业站运维与SEO优化经验,文章来自真实部署与踩坑记录。为自己记录,为同路人分享。
专题
分类
站点统计
文章
205
分类
9
标签
449
总字数
413,918
运行时长
0
最后活动
0 天前

目录