Docker 配置容器自动更新(使用 Watchtower)

Docker 配置容器自动更新(使用 Watchtower)

GT610 Lv3

📌 背景

在日常运维中,保持 Docker 容器更新至最新版本至关重要。手动更新既繁琐又容易遗漏,特别是在管理多个容器时。Watchtower 作为轻量级解决方案,可自动监控并更新运行中的容器。

什么是 Watchtower?

Watchtower 是开源的 Docker 容器自动更新工具,通过定期检查 Docker Hub 或其他镜像仓库的更新,自动拉取新镜像并重启容器,确保服务始终运行最新版本。

Watchtower 不适用于 Podman。Podman 容器的自动更新是通过 podman-auto-update 实现的。

Watchtower 需要主机具有访问 Docker 守护进程的权限

🛠️ 安装与运行

基础运行方式

1
2
3
4
5
docker run -d \
--name watchtower \
--restart unless-stopped \
-v /var/run/docker.sock:/var/run/docker.sock \
containrrr/watchtower

参数说明

参数 说明
-d 后台运行,推荐使用。
–name watchtower 指定容器名称。可自行更改。
–restart unless-stopped 除非主动停止,否则容器异常退出时自动重启。此项可选,但推荐启用。
-v /var/run/docker.sock:/var/run/docker.sock 挂载 Docker 守护进程的 socket 文件。必须保留且不能修改

使用 Docker Compose

创建 docker-compose.yml 文件:

1
2
3
4
5
6
7
8
version: "3"
services:
watchtower:
image: containrrr/watchtower
container_name: watchtower
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock

启动服务:

1
docker-compose up -d

⚙️ 配置选项

定时更新

通过环境变量设置 cron 表达式,可实现计划更新:

1
2
# 从容器启动开始,每 6 小时更新
-e "WATCHTOWER_SCHEDULE=0 */6 * * *"

此项同样适用于 Docker Compose:

1
2
3
# 每天凌晨 3 点更新
environment:
- WATCHTOWER_SCHEDULE="0 0 3 * * *"

选择性更新

为不需要自动更新的容器添加标签:

1
docker run --label=com.centurylinklabs.watchtower.enable=false container_name

如果你只想让 Watchtower 只更新特定容器,你也可以反过来做:

在 Watchtower 的运行命令中添加 --label-enable,那么 Watchtower 将只更新那些带有标签 com.centurylinklabs.watchtower.enable=true 的容器。这种情况下,你只需要在你想要 Watchtower 更新的容器上添加这个标签即可,其他没有这个标签的容器都会被 Watchtower 忽略。

1
2
3
4
5
docker run -d \
--name=watchtower \
--restart=unless-stopped \
-v /var/run/docker.sock:/var/run/docker.sock \
containrrr/watchtower --label-enable

只更新特定容器

只需要在命令中添加你希望更新的容器的名称或者 ID 即可。

例如我只想让 Watchtower 更新名为 my-container 的容器:

1
2
3
4
5
docker run -d \
--name=watchtower \
--restart=unless-stopped \
-v /var/run/docker.sock:/var/run/docker.sock \
containrrr/watchtower my-container

自动删除旧镜像

如果需要 Watchtower 在自动更新容器时,删除旧的镜像以节约存储空间,直接在命令结尾添加 --cleanup 参数即可。

1
2
3
4
5
docker run -d \
--name=watchtower \
--restart=unless-stopped \
-v /var/run/docker.sock:/var/run/docker.sock \
containrrr/watchtower --cleanup

手动立即更新

向 Watchtower 容器发送一个 SIGHUP 信号来让它立即检查更新。

1
docker kill -s SIGHUP watchtower

kill 命令的作用是发送信号,而不是结束进程。

这个命令不会停止 Watchtower 容器,也不会影响计划更新任务,相当于额外手动进行一次更新。

📝 验证与监控

检查 Watchtower 日志:

1
docker logs watchtower --since 5m

典型更新日志示例:

1
2
3
time="2025-07-14T03:00:01Z" level=info msg="Found new nginx:latest image"
time="2025-07-14T03:00:02Z" level=info msg="Stopping /web-server with SIGTERM"
time="2025-07-14T03:00:07Z" level=info msg="Creating /web-server"

💎 写在最后

Watchtower 为 Docker 容器提供了简单高效的自动化更新方案,特别适合以下场景:

  • 开发测试环境快速迭代
  • 安全补丁的及时应用
  • 无人值守的服务器维护

当然,生产环境不容得任何闪失,所以在更新之前最好还是确认容器的健康状态,做好备选方案,避免更新后出现新的问题。

如有任何问题,欢迎交流讨论!

(封面图片由 AI 生成)

  • 标题: Docker 配置容器自动更新(使用 Watchtower)
  • 作者: GT610
  • 创建于 : 2025-07-17 00:15:59
  • 更新于 : 2025-09-23 15:09:18
  • 链接: https://gt-610.dpdns.org/2025/07/16/docker-auto-update/
  • 版权声明: 本文章采用 CC BY 4.0 进行许可。
评论