如果你已经厌倦了每次修改代码后都要手动 docker pull、docker stop、docker rm 再 docker run,那么 Watchtower 就是为你这种“追求效率”的开发者准备的神器。
简单来说,Watchtower 是一个专门用来自动更新 Docker 容器的开源应用。它本身也是一个 Docker 容器。
一、核心功能:容器的“自动进化”
Watchtower 的工作逻辑非常纯粹:
- 监控:它会定期检查你正在运行的容器。
- 比对:它会去镜像仓库(比如你的阿里云私有仓库)看看有没有更新版本的镜像。
- 更替:如果发现新镜像,它会优雅地关闭旧容器,删掉它,然后用完全相同的参数(端口映射、环境变量、挂载卷等)启动一个新容器。
二、为什么它在 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参数详细拆解(不含符号说明):
挂载 docker.sock 这是 Watchtower 的心脏。通过挂载这个文件,Watchtower 容器获得了控制宿主机 Docker 引擎的权限。没有它,它就无法停止或启动其他容器。
挂载 config.json 因为你的镜像在阿里云私有仓库,需要账号密码才能拉取。挂载这个文件是为了让 Watchtower 共享你的登录凭证。
cleanup 更新完新镜像后,自动删掉那个已经没用的旧镜像。这能极大地节省服务器磁盘空间。
interval 30 轮询间隔。这里设置的是每 30 秒检查一次仓库。你可以根据需求改为一小时或一天。
指定容器名 在命令最后加上
my-server。这告诉 Watchtower:只管这个容器,别的容器(比如数据库)不要乱动。
四、使用Watchtower的建议
- 生产环境慎用全自动:如果你对稳定性要求极高,建议不要让它全自动更新,因为新版本代码可能有 Bug。
- 日志监控:通过
docker logs -f watchtower可以看到它每一次检查仓库和替换容器的过程,非常解压。