Categories: docker

别再手动更新 Docker 容器了,Watchtower帮你监视并自动更新

🤦 你还在手动更新容器?

正常情况更新docker,我们都是手动 docker stopdocker rmdocker pulldocker run 四连操作更新一个容器。

一个两个容器还好,手上跑着十几个服务的时候,你就知道什么叫”运维的尽头是重复劳动”。

而 Watchtower,就是那个替你干活的人。

🗼 Watchtower 是什么?

Watchtower 是一个开源的 Docker 容器自动更新工具。它做的事情用一句话就能说清楚:

监控你正在运行的容器,发现镜像有新版了,自动帮你更新。

就这么简单。它会:

  • ✅ 拉取最新镜像
  • ✅ 用完全相同的启动参数 重新创建容器
  • ✅ 干净利落,绝不拖泥带水
  • ✅ 连它自己也能自动更新(这种精神你学学)

GitHub 项目地址:https://github.com/containrrr/watchtower,开源免费。

🚀 一行命令,天下太平

最简启动(监控所有容器)

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

就这么一行。从现在开始,你服务器上所有容器都会每 24 小时 自动检查一次更新,有新版就更新。

注意:如果你是生产环境,直接无差别全量更新可能有点刺激。别急,后面有”精准打击”方案。

只更新指定容器

不是所有容器都适合自动更新。数据库这种万一更新了配置不兼容,你怕是要连夜爬起来修。

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

命令最后加上容器名,只更新你指定的那几个。放心多了吧?

Docker Compose 方式(推荐)

用 Compose 管理的话更优雅:

version: "3.8"  
services:  
watchtower:  
    image:containrrr/watchtower:latest  
    container_name:watchtower  
    restart:unless-stopped  
    volumes:  
      -/var/run/docker.sock:/var/run/docker.sock  
    command:  
      -"--interval"         # 检查间隔(秒)  
      -"86400"              # 86400秒 = 24小时  
      -"--cleanup"          # 更新后自动清理旧镜像,防止磁盘被 none 镜像吃满  
      -"nginx"              # 指定要监控的容器名  
      -"redis"  
    environment:  
      -TZ=Asia/Shanghai     # 设置时区

⚠️ 重点提醒--cleanup(或者 -c)参数一定要加上。不然每次更新都会在本地留一个 <none> 的旧镜像,时间一长磁盘空间就跟你的耐心一样,告急。

⏰ 定时策略:可以自定义

默认 24 小时检查一次,其实对大多数人来说已经够用了。但如果你想更灵活,可以使用interval参数:

docker run -d \  
  --name watchtower \  
  --restart unless-stopped \  
  -v /var/run/docker.sock:/var/run/docker.sock \  
  containrrr/watchtower \  
  --interval 3600  # 每小时检查一次

单位是秒。常用的几个值:

间隔| 秒数
—|—
5 分钟| 300
1 小时| 3600
6 小时| 21600
12 小时| 43200
24 小时| 86400

🧪 先跑一次试试

不想设置常驻服务?先测试一下:

docker run --rm \  
  -v /var/run/docker.sock:/var/run/docker.sock \  
  containrrr/watchtower \  
  --cleanup \  
  --run-once \  
  nginx redis

--run-once 让 Watchtower 只执行一次检查就退出,--rm 让它执行完自动删除容器。适合第一次尝鲜。

⚠️ 这些坑可能会踩到

  1. 磁盘空间 :不加 --cleanup,你的 /var/lib/docker 会慢慢被 <none> 镜像塞满。别问我怎么知道的。
  2. 数据库容器 :MySQL、PostgreSQL、MongoDB 这些,不要 加入自动更新。镜像升级可能涉及数据格式变更,更新前务必手动备份。
  3. 配置变更 :如果新版镜像的环境变量或挂载路径有变化,Watchtower 只会用旧参数启动新镜像,可能运行异常。

💡 写在最后

Watchtower 不是一个”要不要用”的问题,而是一个”怎么用”的问题。

对于个人开发、NAS、测试环境,它是真正的运维神器 。每天省下的手动更新时间,够你摸不少鱼了。

而对于生产环境,建议用”白名单 + 定时 + 排除标签”的组合拳,在自动化和安全之间找到你自己的平衡点。


参考链接:

  • Watchtower GitHub:https://github.com/containrrr/watchtower
  • Watchtower 官方文档:https://containrrr.github.io/watchtower/

📚 往期精彩文章推荐


🌟 与你互动

嗨~这里是【医工学习日志】的温暖小窝!
📩 随时戳一戳 :后台留言任何问题,树树会带着光速回复闪现!
💡 奇思妙想征集令
👉 遇到有趣资源?戳我分享!
👉 想看的硬核测评?甩题过来!
🔥 你的脑洞,可能成为下期爆款文章哦~

如需有偿部署服务或商务,请加V注明来意,不闲聊:



📝 栏目信息
策划编辑 ✨ 树树 ✨

技术支撑 @恩山无线论坛 & Github & 瀚思彼岸


📜 版权声明
内容说明:

  1. 原创文章转载请私信授权;

  2. 部分素材源自网络,版权归属原作者;

  3. 如觉侵权,请凭权属证明联系删除

cqshushu

Recent Posts

IPTV-Spider v2.0.9 docker已推送

大家好,我是你们的老朋友医工。…

1 天 ago

IPTV-Spider v2.0.9 docker已推送

大家好,我是你们的老朋友医工。…

1 天 ago

关于 IPTV-Spider 的一些统一回复(附日常优化小更新)

大家好,我是你们的老朋友医工。…

4 天 ago