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

一般的操作步骤就是:停止容器——备份数据——拉取新镜像——重建新容器并启动,这类操作方式适合临时使用场景下单容器部署。在多容器部署的场景下,我们也可以使用 Docker Compose 批量更新,但总归都不是很方便。
所以,今天,民工哥给就大家介绍一款自动化的更新工具,它就是:Watchtower !
简单来说,Watchtower 是一个用于自动化 Docker 容器镜像更新的开源工具,通过监控容器的镜像变动去触发自动拉取新镜像,然后以旧容器的同等配置来启动新容器,实现全过程自动化,无需人工干预。

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 等编排工具的成熟方案。