2026.03.10 运维

用 Docker 和 Watchtower 让服务器自己更新自己

手动 pull 镜像、重启容器是一件让人厌倦的事。配好 Watchtower 之后,我的服务器上所有容器都会在深夜自动拉取最新镜像、优雅重启,第二天醒来一切都是最新的。

用 Docker 和 Watchtower 让服务器自己更新自己

运维工作里有很多"有价值但无聊"的事:定期检查镜像更新、手动拉取、逐个重启容器。这类工作不难,但繁琐,而且很容易因为"懒得更新"导致容器跑着几个月前的旧镜像,悄悄积累安全漏洞。

Watchtower 是什么

Watchtower 本身就是一个 Docker 容器,它定期检查宿主机上所有运行中的容器,对比镜像 digest,发现有更新就自动 pull 新镜像并重建容器,整个过程不需要人工介入。

基础部署

docker run -d 
  --name watchtower 
  --restart unless-stopped 
  -v /var/run/docker.sock:/var/run/docker.sock 
  containrrr/watchtower 
  --schedule "0 3 * * *" 
  --cleanup

--schedule "0 3 * * *" 表示每天凌晨 3 点执行。--cleanup 会在更新后删除旧镜像,避免磁盘被占满。

只更新指定容器

不是所有容器都适合自动更新。数据库、有状态服务建议手动管控。可以给不想自动更新的容器加 label:

labels:
  - "com.centurylinklabs.watchtower.enable=false"

然后启动 Watchtower 时加上 --label-enable,它就只更新有 enable=true 标签的容器。

更新通知

Watchtower 支持通过 Telegram、Slack、邮件等方式推送更新通知。我接了 Telegram Bot,每次有容器更新都会收到一条消息,既能自动化,又没有完全失去感知:

-e WATCHTOWER_NOTIFICATION_URL="telegram://token@telegram?chats=@chatid"
自动化不是让人什么都不管,而是把重复劳动交给机器,把注意力留给真正需要判断的事。

配合 Docker Compose 管理服务、Watchtower 自动更新、Telegram 推送通知,我的服务器现在基本处于"自我维护"状态。一个月可能只需要登录两三次。