Watchtower Docker 自动更新教程

在搬瓦工 VPS 上运行 Docker 容器时,保持镜像版本更新是安全运维的重要环节。手动逐个检查和更新容器既耗时又容易遗漏。Watchtower 是一款专门用于自动更新 Docker 容器的工具,它会定期检查运行中容器使用的镜像是否有新版本,如果有则自动拉取新镜像并使用相同参数重新创建容器。本文将详细介绍 Watchtower 的部署和配置方法。

一、Watchtower 工作原理

Watchtower 本身也是一个 Docker 容器,它的工作流程如下:

  • 按照设定的时间间隔检查所有运行中容器的镜像。
  • 如果发现远程仓库中有更新的镜像版本,则拉取新镜像。
  • 优雅地停止当前容器(发送 SIGTERM 信号)。
  • 使用原容器的启动参数和新镜像重新创建容器。
  • 自动清理旧的镜像(可选)。

整个过程对服务的影响很小,通常只有几秒钟的停机时间。

二、快速部署

2.1 Docker 命令启动

docker run -d \
  --name watchtower \
  --restart unless-stopped \
  -v /var/run/docker.sock:/var/run/docker.sock \
  containrrr/watchtower

默认情况下,Watchtower 每 24 小时检查一次所有容器的镜像更新。

2.2 Docker Compose 部署(推荐)

mkdir -p /opt/watchtower && cd /opt/watchtower
cat > docker-compose.yml <<'EOF'
services:
  watchtower:
    image: containrrr/watchtower
    container_name: watchtower
    restart: unless-stopped
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - WATCHTOWER_CLEANUP=true
      - WATCHTOWER_POLL_INTERVAL=86400
      - WATCHTOWER_INCLUDE_STOPPED=false
      - WATCHTOWER_REVIVE_STOPPED=false
      - TZ=Asia/Shanghai
EOF
docker compose up -d

2.3 验证运行状态

docker ps | grep watchtower
docker logs watchtower

三、更新策略配置

3.1 调整检查频率

通过 WATCHTOWER_POLL_INTERVAL 环境变量设置检查间隔(单位:秒):

    environment:
      # 每6小时检查一次
      - WATCHTOWER_POLL_INTERVAL=21600
      # 或使用 cron 表达式:每天凌晨3点检查
      - WATCHTOWER_SCHEDULE=0 0 3 * * *

建议选择低流量时段执行更新,避免影响用户访问。

3.2 仅监控指定容器

如果不想让 Watchtower 更新所有容器,可以通过标签控制:

# 方法一:仅更新带有指定标签的容器
docker run -d \
  --name watchtower \
  -v /var/run/docker.sock:/var/run/docker.sock \
  containrrr/watchtower \
  --label-enable

# 需要被更新的容器添加标签
docker run -d \
  --label com.centurylinklabs.watchtower.enable=true \
  --name myapp \
  myimage:latest
# 方法二:在命令行指定容器名称
docker run -d \
  --name watchtower \
  -v /var/run/docker.sock:/var/run/docker.sock \
  containrrr/watchtower \
  nginx redis myapp

3.3 排除特定容器

给不想被更新的容器添加禁用标签:

# 在 Docker Compose 中排除
services:
  critical-db:
    image: postgres:15
    labels:
      - "com.centurylinklabs.watchtower.enable=false"

数据库容器通常不建议自动更新,因为版本升级可能涉及数据迁移。

四、通知配置

Watchtower 支持在执行更新后发送通知,让你及时了解更新情况。

4.1 邮件通知

    environment:
      - WATCHTOWER_NOTIFICATIONS=email
      - WATCHTOWER_NOTIFICATION_EMAIL_FROM=watchtower@example.com
      - WATCHTOWER_NOTIFICATION_EMAIL_TO=admin@example.com
      - WATCHTOWER_NOTIFICATION_EMAIL_SERVER=smtp.example.com
      - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=587
      - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=user@example.com
      - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=your-password
      - WATCHTOWER_NOTIFICATION_EMAIL_SUBJECTTAG=[Watchtower]

4.2 Webhook 通知

适用于对接 Slack、钉钉、Telegram 等消息平台:

    environment:
      - WATCHTOWER_NOTIFICATIONS=shoutrrr
      - WATCHTOWER_NOTIFICATION_URL=telegram://token@telegram?channels=chatid

4.3 仅通知不更新(监控模式)

如果你只想知道哪些镜像有更新,但不想自动执行更新:

    environment:
      - WATCHTOWER_MONITOR_ONLY=true
      - WATCHTOWER_NOTIFICATIONS=shoutrrr
      - WATCHTOWER_NOTIFICATION_URL=your-notification-url

这种模式下 Watchtower 只负责检测,更新操作由你手动决定。

五、完整配置示例

以下是一个包含常用配置的完整 Docker Compose 文件:

services:
  watchtower:
    image: containrrr/watchtower
    container_name: watchtower
    restart: unless-stopped
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - TZ=Asia/Shanghai
      - WATCHTOWER_CLEANUP=true
      - WATCHTOWER_SCHEDULE=0 0 3 * * *
      - WATCHTOWER_ROLLING_RESTART=true
      - WATCHTOWER_TIMEOUT=30s
      - WATCHTOWER_LIFECYCLE_HOOKS=true
      - WATCHTOWER_LABEL_ENABLE=true
      - WATCHTOWER_NOTIFICATIONS=shoutrrr
      - WATCHTOWER_NOTIFICATION_URL=telegram://token@telegram?channels=chatid
      - WATCHTOWER_NOTIFICATION_REPORT=true
    command: --debug

六、手动触发更新

除了定时检查,Watchtower 还支持通过 HTTP API 手动触发更新:

# 启用 HTTP API
docker run -d \
  --name watchtower \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -e WATCHTOWER_HTTP_API_TOKEN=your-secret-token \
  -p 8080:8080 \
  containrrr/watchtower \
  --http-api-update

# 手动触发更新
curl -H "Authorization: Bearer your-secret-token" \
  http://localhost:8080/v1/update

七、私有仓库认证

如果你的容器使用私有镜像仓库,需要提供认证信息:

# 挂载 Docker 认证配置
docker run -d \
  --name watchtower \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v ~/.docker/config.json:/config.json:ro \
  containrrr/watchtower

八、安全注意事项

  • 数据库容器:强烈建议排除数据库容器(MySQL、PostgreSQL 等),大版本升级可能需要手动迁移数据。
  • 生产环境:考虑使用监控模式,收到通知后在维护窗口手动更新。
  • 备份策略:在 Watchtower 执行更新前,确保有完善的数据备份机制。
  • 版本锁定:使用固定版本标签(如 nginx:1.25)而非 latest,可以更好地控制更新节奏。

总结

Watchtower 是搬瓦工 VPS 上 Docker 容器自动化运维的重要工具。合理配置更新策略和通知机制,可以在保证安全的前提下大幅减少手动维护工作。如果你更倾向于仅接收更新通知而不自动更新,可以参考 DIUN 镜像更新通知工具。更多 Docker 管理工具请参考 LazyDockerDozzle 日志查看器。选购搬瓦工 VPS 请访问 bwh81.net,购买时使用优惠码 NODESEEK2026 可享受 6.77% 的折扣。

关于本站

搬瓦工VPS中文网(bwgvps.com)是非官方中文信息站,整理搬瓦工的方案、优惠和教程。我们不销售主机,不提供技术服务。

新手必读
搬瓦工优惠码

NODESEEK2026(优惠 6.77%)

购买时填入即可抵扣。