戳下方名片,关注并星标

回复“1024”获取2TB学习资源!

👉体系化学习:运维工程师打怪升级进阶之路 4.0

—   特色专栏  —

MySQL/PostgreSQL/MongoDB

ElasticSearch/Hadoop/Redis

Kubernetes/Docker/DevOps

Kafka/RabbitMQ/Zookeeper

监控平台/应用与服务/集群管理

Nginx/Git/Tools/OpenStack

大家好,我是民工哥!

容器化如此发达的今天,万物皆可容器化。

也因如此,我们日常工作中,使用容器化部署应用再平常不过了,其中 docker 镜像更新是容器化部署过程的核心环节。其本质就是通过替换或重建镜像来获取新功能、修复漏洞或优化性能。

一般的操作步骤就是:停止容器——备份数据——拉取新镜像——重建新容器并启动,这类操作方式适合临时使用场景下单容器部署。在多容器部署的场景下,我们也可以使用 Docker Compose 批量更新,但总归都不是很方便。

所以,今天,民工哥给就大家介绍一款自动化的更新工具,它就是:Watchtower !

简单来说,Watchtower 是一个用于自动化 Docker 容器镜像更新的开源工具,通过监控容器的镜像变动去触发自动拉取新镜像,然后以旧容器的同等配置来启动新容器,实现全过程自动化,无需人工干预。

Watchtower 的核心优势就是:

  • 无需手动停止容器、拉取镜像、重启服务,适合开发/测试环境快速迭代

  • 支持自定义检查间隔、通知渠道、监控范围等,适应多样化需求。

  • 本身作为 Docker 容器运行,资源占用低,兼容所有标准 Docker 容器。

  • 官网:https://containrrr.dev/watchtower/

  • Github:https://github.com/containrrr/watchtower

核心功能

自动检测更新

通过定期轮询 Docker 镜像仓库(如 Docker Hub 或私有仓库),去检查容器镜像是否有新版本。

默认每 24 小时检查一次,可通过 --interval 参数自定义间隔(如 --interval 300 表示每 5 分钟检查一次)。

自动拉取与重启

发现新版本后,自动拉取最新镜像,并优雅地停止旧容器,使用新镜像重新启动容器。保留原有配置(如卷、网络、环境变量等),确保服务无缝升级。

通过 --cleanup 参数启用删除旧镜像功能,避免磁盘空间占用。

通知与告警

支持邮件、Slack、Discord 等通知渠道,需配置环境变量(如 WATCHTOWER_NOTIFICATIONS=slack 和 WATCHTOWER_NOTIFICATION_SLACK_HOOK_URL)。

灵活监控范围

默认监控所有容器,可通过命令行参数指定目标容器(如 watchtower nginx redis)或排除特定容器(通过标签 --label=com.centurylinklabs.watchtower.enable=false 或参数 --exclude-containers)。

部署与使用

直接使用 Docker 部署方式:

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

定时更新:vk 每天凌晨 3 点检查更新

docker run -d \
  --name watchtower \
  -v /var/run/docker.sock:/var/run/docker.sock \
  containrrr/watchtower --schedule "0 0 3 * * *"

watchtower 默认是从Docker Hub 上拉取新镜像,如果实际环境中是从私有 Docker  Hub 拉取镜像,则需要配置相关认证(配置这两个参数:REPO_USER和REPO_PASS),如:

docker run -d \
  --name watchtower \
  -e REPO_USER=username \
  -e REPO_PASS=password \
  -v /var/run/docker.sock:/var/run/docker.sock \
  containrrr/watchtower container_to_watch --debug

如果实际业务环境中是要从私有仓库中拉取镜像,首先需要调用 docker 登录才能访问。提供的认证凭据是存储在一个名为 <PATH_TO_HOME_DIR>/.docker/config.json 的配置文件中。

首先我们需要生成一个随机字符串并使用base64编码:

echo -n 'username:password' | base64

手工创建一个config.json配置文件:

{
    "auths": {
        "<REGISTRY_NAME>": {#仓库名称
            "auth": "XXXXXXX" #上面生成的字符串
        }
    }
}

然后,需要将配置文件传递给 watchtower Docker 容器。

#命令格式
docker run [...] -v <PATH>/config.json:/config.json containrrr/watchtower

#实例
docker run -d \
  --name watchtower \
  -v /path/to/config.json:/config.json \
  containrrr/watchtower \

监控远程主机,可以使用下面的命令:

docker run -d \
  --name watchtower \
  containrrr/watchtower --host "tcp://10.0.0.1:2375"
#或
docker run -d \
  --name watchtower \
  -e DOCKER_HOST="tcp://10.0.0.1:2375" \
  containrrr/watchtower

默认情况下,Watchtower 会清理其他实例,不允许多个实例在同一 Docker 主机或群集群上运行。

我们可以通过配置作用域来解决这个问题,在容器启动时通过配置 --scope 参数或 WATCHTOWER_SCOPE 环境变量,并将你想包含在该实例作用域中的容器(包括实例本身)设置相同的 com.centurylinklabs.watchtower.scope 标签值。

实例:Docker Compose 配置

version: '3'

services:
  app-with-scope:
    image: myapps/monitored-by-watchtower
    labels: [ "com.centurylinklabs.watchtower.scope=myscope" ]

  scoped-watchtower:
    image: containrrr/watchtower
    volumes: [ "/var/run/docker.sock:/var/run/docker.sock" ]
    command: --interval 30 --scope myscope
    labels: [ "com.centurylinklabs.watchtower.scope=myscope" ] 

  unscoped-app-a:
    image: myapps/app-a

  unscoped-app-b:
    image: myapps/app-b
    labels: [ "com.centurylinklabs.watchtower.scope=none" ]

性能监控与日志

如需临时更新,可以配置一次手动触发更新,运行一次后退出:

docker run --rm \
  -v /var/run/docker.sock:/var/run/docker.sock \
  containrrr/watchtower --run-once
适用场景
  • 个人/开发环境:快速保持容器最新,减少手动操作。

  • 测试环境:统一团队容器版本,减少环境差异。

结语

总体来说,Watchtower 是一款轻量且高效的 Docker 容器镜像自动化更新工具,通过简化镜像检测、拉取与重启流程,显著降低了容器维护成本,尤其适合开发、测试或非关键业务场景。

其灵活的配置选项(如自定义检查间隔、通知机制和监控范围)能满足多样化需求,但生产环境需谨慎使用——自动更新可能引发兼容性问题或服务中断,建议结合滚动更新策略、健康检查及版本标签管理来平衡便利性与稳定性。

对于追求零手动运维的个人用户或小型团队,Watchtower 是值得尝试的利器。而在高可用性要求严格的场景中,仍需依赖 Kubernetes 等编排工具的成熟方案。

都看到这里了,觉得不错的话,随手点个赞👍 、推荐、转发分享三连吧,如果想第一时间收到推送,也可以给我个星标⭐~

公众号读者专属技术群

构建高质量的技术交流社群,欢迎从事后端开发、运维技术进群(备注岗位,已在技术交流群的请勿重复添加微信好友,无备注一律者不通过)。主要以技术交流、内推、行业探讨为主,请文明发言。广告人士勿入,切勿轻信私聊,防止被骗。

扫码加我好友,拉你进群

PS:因为公众号平台更改了推送规则,如果不想错过内容,记得读完点一下在看,加个星标,这样每次新文章推送才会第一时间出现在你的订阅列表里。点在看支持我们吧!

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐