Skip to content

如果你已经厌倦了每次修改代码后都要手动 docker pulldocker stopdocker rmdocker run,那么 Watchtower 就是为你这种“追求效率”的开发者准备的神器。

简单来说,Watchtower 是一个专门用来自动更新 Docker 容器的开源应用。它本身也是一个 Docker 容器。

一、核心功能:容器的“自动进化”

Watchtower 的工作逻辑非常纯粹:

  1. 监控:它会定期检查你正在运行的容器。
  2. 比对:它会去镜像仓库(比如你的阿里云私有仓库)看看有没有更新版本的镜像。
  3. 更替:如果发现新镜像,它会优雅地关闭旧容器,删掉它,然后用完全相同的参数(端口映射、环境变量、挂载卷等)启动一个新容器。

二、为什么它在 CI/CD 中不可或缺?

在你目前的 GitHub Actions + 阿里云 ACR 流程中,Watchtower 扮演了“最后一公里”的角色:

  • 传统方式:镜像传到阿里云后,你得登录服务器手动重启。
  • Watchtower 方式:它发现阿里云上有新镜像了,直接在服务器上帮你“神不知鬼不觉”地完成了替换。

三、常用启动命令与参数解释

这是一个标准的 Watchtower 启动模板:

bash
docker run -d \
  --name watchtower \
  --restart always \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /root/.docker/config.json:/config.json \
  containrrr/watchtower \
  --cleanup \
  --interval 30 \
  my-server

参数详细拆解(不含符号说明):

  1. 挂载 docker.sock 这是 Watchtower 的心脏。通过挂载这个文件,Watchtower 容器获得了控制宿主机 Docker 引擎的权限。没有它,它就无法停止或启动其他容器。

  2. 挂载 config.json 因为你的镜像在阿里云私有仓库,需要账号密码才能拉取。挂载这个文件是为了让 Watchtower 共享你的登录凭证。

  3. cleanup 更新完新镜像后,自动删掉那个已经没用的旧镜像。这能极大地节省服务器磁盘空间。

  4. interval 30 轮询间隔。这里设置的是每 30 秒检查一次仓库。你可以根据需求改为一小时或一天。

  5. 指定容器名 在命令最后加上 my-server。这告诉 Watchtower:只管这个容器,别的容器(比如数据库)不要乱动。

四、使用Watchtower的建议

  • 生产环境慎用全自动:如果你对稳定性要求极高,建议不要让它全自动更新,因为新版本代码可能有 Bug。
  • 日志监控:通过 docker logs -f watchtower 可以看到它每一次检查仓库和替换容器的过程,非常解压。