用 WUD 替代 Watchtower:构建可控的 Docker 自动更新方案

前言:为什么必须替换 Watchtower

Watchtower 官方已于 2025 年 12 月 17 日停止更新,并正式归档其 GitHub 仓库。

这意味着项目将:

  • 不再有新功能
  • 不再修复安全漏洞
  • 代码仓库只读,仅供参考

虽然现有 Watchtower 实例仍然可以继续运行,但从长期运维角度看,继续依赖一个已归档的基础设施组件,本身就构成风险。

因此,社区开始推荐更活跃的替代方案,例如 Linuxiac 推荐的 WUD(What’s Up Docker),或由 Nicholas Fedor 维护的 Fork 版本。

本文只聚焦 WUD,并以”稳态替代 Watchtower”为目标,而不是盲目自动更新。

目标效果

  • 用 WUD 替代 Watchtower
  • 默认不自动更新任何容器
  • 只对明确打标签的容器启用监控/自动更新
  • 定时扫描(每 12 小时)
  • 更新后自动清理旧镜像
  • Web UI 仅作为辅助查看

0. 前置条件

验证:

docker --version
docker compose version

准备目录:

mkdir -p /opt/wud
cd /opt/wud

1. WUD 的 docker-compose 配置

创建 docker-compose-wud.yml:

# version: "3.8"

services:
  wud:
    image: getwud/wud:latest
    container_name: wud
    restart: unless-stopped
    ports:
      - "3000:3000"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./store:/store
    environment:
      - TZ=Asia/Shanghai

      # 本机 Docker watcher
      - WUD_WATCHER_LOCAL_SOCKET=/var/run/docker.sock

      # 关键:默认不监控任何容器
      - WUD_WATCHER_LOCAL_WATCHBYDEFAULT=false

      # 每 12 小时扫描一次
      - WUD_WATCHER_LOCAL_CRON=0 */12 * * *

      # 自动更新 + 更新后清理旧镜像
      - WUD_TRIGGER_DOCKER_AUTO_PRUNE=true

启动:

docker compose -f docker-compose-wud.yml up -d

确认日志:

docker logs -n 100 wud

正常情况下你会看到:

watchbydefault:false
trigger.docker.auto ... Registering for auto execution
Cron scheduled (0 */12 * * *)
Listening to docker events

2. Web UI(仅作辅助查看)

访问:

http://服务器IP:3000

默认匿名访问,仅用于辅助查看。

3. 核心设计:一切由标签决定

因为设置了:

WUD_WATCHER_LOCAL_WATCHBYDEFAULT=false

所以:

  • 没有标签的容器 = 完全不受影响
  • WUD 不会”误更新”任何服务

这是它优于 Watchtower 的关键点。

4. 两个最重要的标签规则

4.1 只监控(不自动更新)

labels:
  - "wud.watch=true"

效果:只监控容器状态,不自动更新。

4.2 监控 + 自动更新(Watchtower 的等价替代)

labels:
  - "wud.watch=true"
  - "wud.trigger.include=docker.auto"

含义很明确:只有被点名的容器,才允许自动更新。

5. 示例:让一个 nginx 服务自动更新

services:
  web:
    image: nginx:latest
    container_name: demo-nginx
    restart: unless-stopped
    ports:
      - "8080:80"
    labels:
      - "wud.watch=true"
      - "wud.trigger.include=docker.auto"

应用变更:

docker compose up -d

WUD 会自动发现,无需重启自身。

6. 清理旧镜像策略

已启用:

WUD_TRIGGER_DOCKER_AUTO_PRUNE=true

效果等同于:

watchtower --cleanup

只在更新发生后清理旧镜像。

长期运行环境,可额外偶尔执行:

docker image prune -f

7. 使用建议

  • wud.watch=true + wud.trigger.include=docker.auto = 监控并自动更新
  • wud.watch=true = 仅监控,不自动更新

WUD 的正确用法不是”全自动”,而是”可控自动”。

8. 与 Watchtower 的对比

特性 Watchtower WUD
默认行为 监控所有容器 不监控任何容器(除非明确标记)
更新策略 全自动 可控(通过标签)
Web UI
项目状态 已归档 活跃维护
配置灵活性

总结

WUD 是一个功能强大的 Docker 容器更新管理工具,作为已停止维护的 Watchtower 的理想替代品。通过设置 WATCHBYDEFAULT=false 和使用标签控制,您可以精确控制哪些容器需要自动更新,哪些只需要接收通知。这种”可控自动”的设计理念使您能够安全地管理各种类型的容器,确保系统安全的同时避免意外的数据丢失或服务中断。