主题模式
Are you an LLM? You can read better optimized documentation at /fe/docker/watchtower.md for this page in Markdown format
如何使用 Watchtower 自动更新 Docker 容器与旧镜像自动清理
在家庭实验室(Homelab)或云服务器上,我们常常会部署几十个 Docker 容器。随着时间的推移,手动运行 docker pull、删除旧容器并重新创建来升级每个服务会变得非常痛苦。
Watchtower(由 Containrrr 开发)是目前最流行、最好用的 Docker 容器自动更新工具。它本身也是一个轻量的 Docker 容器,通过监听宿主机的 docker.sock,定期检查你正在运行的其他容器是否有新版本镜像。如果有,它会自动拉取新镜像、优雅地关闭旧容器,并使用完全相同的启动参数(包括挂载卷、网络配置、环境变量)重新启动新容器,整个过程完全自动化且近乎无感。
本文将带你手把手配置 Watchtower,并解锁自动清理旧镜像、排除敏感容器(如数据库)、以及配置 Telegram 通知推送等进阶玩法。
🛠️ 第一步:极速启动 Watchtower(命令行版)
如果你只想简单地试一下或者进行一次性更新,可以直接运行以下命令:
bash
docker run -d \
--name watchtower \
-v /var/run/docker.sock:/var/run/docker.sock \
--restart unless-stopped \
containrrr/watchtower \
--cleanup \
--interval 86400💡 关键参数解析:
-v /var/run/docker.sock:/var/run/docker.sock:核心参数。让 Watchtower 能够调用宿主机的 Docker API 来管理其他容器。--cleanup(或环境变量WATCHTOWER_CLEANUP=true):强烈推荐。在拉取新镜像并启动新容器后,自动删除旧的无用镜像,防止服务器硬盘被堆积的旧镜像塞满。--interval 86400(单位:秒):设置检查更新的频率。86400代表每 24 小时检查一次。如果不设置,默认是每 5 分钟检查一次(过于频繁,不推荐)。
🐳 第二步:使用 Docker Compose 部署(推荐)
对于长期运行的服务器,建议使用 Docker Compose 进行配置管理。创建一个 docker-compose.yml 文件:
yaml
services:
watchtower:
image: containrrr/watchtower:latest
container_name: watchtower
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- WATCHTOWER_CLEANUP=true
- WATCHTOWER_POLL_INTERVAL=86400 # 每 24 小时检查一次
- TZ=Asia/Shanghai # 设置时区运行 docker compose up -d 启动即可。
🔒 第三步:进阶安全配置(排除敏感容器)
在生产环境或运行重要服务时,无差别的全自动更新是非常危险的。例如:
- 数据库容器(如 MySQL、PostgreSQL):数据库大版本升级可能会导致数据表结构不兼容,甚至损坏数据。
- 关键业务容器:升级可能引入未知的 Bug,导致系统崩溃。
方案 A:只更新带有特定标签的容器(首选)
我们可以设置 Watchtower 默认不更新任何容器,只有当我们明确给某个容器打了标签时才进行更新。
- 启动 Watchtower 时,添加环境变量
WATCHTOWER_LABEL_ENABLE=true:yamlenvironment: - WATCHTOWER_LABEL_ENABLE=true - WATCHTOWER_CLEANUP=true - WATCHTOWER_POLL_INTERVAL=86400 - 在你想更新的容器(例如 Nginx)的
docker-compose.yml中,添加标签com.centurylinklabs.watchtower.enable=true:yamlservices: nginx: image: nginx:alpine labels: - 'com.centurylinklabs.watchtower.enable=true'
方案 B:排除特定容器(黑名单机制)
如果你希望默认更新所有容器,但排除数据库容器:
在不想更新的容器(如 MySQL)配置中,添加标签 com.centurylinklabs.watchtower.enable=false:
yaml
services:
mysql:
image: mysql:8.0
labels:
- 'com.centurylinklabs.watchtower.enable=false' # 告诉 Watchtower 忽略此容器🔔 第四步:配置 Telegram 自动更新通知
当服务器上的容器更新时,我们希望第一时间收到推送。Watchtower 内置了丰富的通知模块,支持邮件、Slack、Discord、Telegram 以及 Bark 等。
以 Telegram Bot 为例,只需在 Watchtower 中加入以下环境变量:
yaml
environment:
- WATCHTOWER_CLEANUP=true
- WATCHTOWER_POLL_INTERVAL=86400
- WATCHTOWER_NOTIFICATIONS=telegram
- WATCHTOWER_NOTIFICATION_TELEGRAM_CHAT_ID=你的TG群组或个人ID
- WATCHTOWER_NOTIFICATION_TELEGRAM_TOKEN=你的TG_Bot_Token配置成功后,每次 Watchtower 完成更新,你的手机 Telegram 就会立刻收到一条精美的格式化消息,告诉你哪些容器已被成功升级,哪些旧镜像已被清理。
📋 常用运维指令
1. 手动运行一次性更新并立即退出
如果你不想在后台运行一个常驻的 Watchtower 容器,只想在需要时手动帮所有容器升个级,可以运行:
bash
docker run --rm \
-v /var/run/docker.sock:/var/run/docker.sock \
containrrr/watchtower \
--run-once \
--cleanup--run-once 会让 Watchtower 扫描更新一次后,自动销毁并退出。
2. 查看更新日志
如果想确认 Watchtower 是否正常在后台运行,可以查看其日志:
bash
docker logs -f watchtower💬 总结
使用 Watchtower 配合 Docker Compose,能让你的 Homelab 服务器维持在最新的安全版本,同时免去了手动维护的繁琐。
- 原则:对无状态的轻量应用(如 Alist、Jellyfin、Nezha 监控等)开启自动更新;对有状态的数据存储服务(MySQL、Redis)坚决关闭自动更新,手动备份后再升级。
相关文章推荐:
- 复制即用的 Docker 常用模板:Docker Compose 模板库。
- 搭建你的容器监控底座:Prometheus + Grafana 监控部署。
