这里是青柠的《零基础玩转docker》开篇教程!不用记复杂命令,小白也能轻松上手的保姆级指南来啦~
【神器登场】Watchtower - Docker党的自动更新管家
它就像你手机里的「应用商店自动更新」功能!简单来说:
Docker Hub ≈ 手机应用商店(存放所有镜像的仓库)
Watchtower ≈ 手机系统更新服务(24小时待命的智能管家)
Docker容器 ≈ 你安装的APP(比如微信/支付宝)
举个栗子:
当微信推出新版本时,你的手机会自动检测→下载→静默更新。而Watchtower正是把这种「无感更新」带到Docker世界!它会定时扫描容器对应的镜像版本,发现更新立即执行「镜像拉取→容器重建→无缝切换」三连击,全程无需手动敲命令!
三大核心功能
智能监控:自动检测所有运行中容器的镜像更新
灵活策略:支持立即更新/定时更新/手动确认模式
无缝切换:采用滚动更新机制确保服务不中断
适合哪些人?
▫️总忘记更新容器的小迷糊
▫️同时管理多台nas的极客玩家
▫️想彻底摆脱命令行操作的小白用户
️ 注意事项
① 数据库类容器(如MySQL)慎用自动更新
② 建议先为关键容器设置更新通知(教程后续会教)
③ 可通过标签控制特定容器的更新策略
拓展阅读:Watchtower官方文档 (青柠提示:文档虽好但全英文哦!)
watchtower 的使用
注意:镜像更新只能更新版本是 latest 的镜像,无法更新带版本号的镜像!
更新镜像的几种模式
以下这几种模式各有利弊,按照自己需求进行选择哈!
- 模式一:发现更新提醒我,然后由我手动选择更新;
这种模式的问题在于,发现更新镜像后,虽然提醒我们了,但是还需要我们去使用SSH手动执行命令来进行镜像更新,非常的不方便,时间久了就懒得更新了。
sudo docker run -d
--name watchtower
-v /var/run/docker.sock:/var/run/docker.sock
containrrr/watchtower
使用上面命令,可以部署 watchtower,会自动监控全部镜像是否有可用更新,当有可用更新时,自动更新。
- 模式二:立即更新全部可更新镜像;
这种模式的问题在于,不想更新的镜像,也会给更新了,就比如某个镜像我就想用指定的版本,但是使用这种模式,会强制自动更新最新的镜像。
# 以下命令是:检查更新 linuxserver-radarr-1和 portainer ,并且更新好之后退出本次运行创建的 Watchtower 容器然后删除镜像文件,多个容器在后面加空格隔开即可 注意 : linuxserver-radarr-1和 portainer 这两个名称,是容器的名称,或在SSH中使用 sudo docker ps 查看。
sudo docker run --rm -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower --cleanup --run-once linuxserver-radarr-1 portainer
- 模式三:某一个时间集中更新指定的应用;
这种模式相对友好,不过需要每次新增镜像后,也同时更新一下镜像更新配置,这样即可发现指定镜像需要更新后,自动集中更新。
在群晖中的配置如下:
以 每日定时 检查 指定镜像,并进行更新为例,做一个演示
- 依次打开:控制面板 - 任务计划,在 任务计划 中
- 点击 新增 - 计划的任务 - 用户定义的脚本
- 在常规设置中,任务名称可以自己随便起,不过必须是英文和数字,用户选择root
- 在计划设置中,设置任务运行的周期以及时间,想每天更新的可以选择每天重复,我觉得没有必要每天都去更新,就选择了每周二的凌晨2:00进行更新,因为这个时间我不会使用Docker,避免更新而造成的使用的中断
- 在任务设置中,输入我们的命令,其中qinglong 和 netdata 是指定要更新的容器的名称;注意: 如果为空的话是全部更新,我只是指定了我需要更新的容器,避免一些重要的Docker因更新造成运行不稳定。如果多个容器需要更新,可填写多个名称,中间用空格隔开
如何我们不想发送邮件,可以使用查看日志的方式,了解任务的执行情况,将上面的脚步该项一下, 注意,这里的/volume2/docker/docker_bak/日志路径换成你自己机器上面的哈!
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower --cleanup --run-once --trace qinglong-1 showdoc > /volume2/docker/docker_bak/watchtower.log 2>&1
补充知识
利用 API 接口对镜像进行更新操作。
要启用此模式,请使用标志--http-api-update,默认情况下,启用此模式可防止定期轮询(即使用--interval或指定的轮询--schedule)。要运行定期更新,请传递--http-api-periodic-polls。
请注意,有一个名为 WATCHTOWER_HTTP_API_TOKEN 的环境变量。为了防止外部服务意外触发镜像更新,所有请求都必须在其标头中包含一个 “Token” 字段,其值为 WATCHTOWER_HTTP_API_TOKEN 中定义的令牌。在这种情况下,有一个端口绑定到主机,允许请求 localhost:8080 到达 Watchtower。
version: '3'
services:
app-monitored-by-watchtower:
image: myapps/monitored-by-watchtower
labels: - "com.centurylinklabs.watchtower.enable=true"
watchtower:
image: containrrr/watchtower
volumes: - /var/run/docker.sock:/var/run/docker.sock
command: --debug --http-api-update
environment: - WATCHTOWER_HTTP_API_TOKEN=定义一个Token
labels: - "com.centurylinklabs.watchtower.enable=false"
ports: - 8080:8080
- 触发全部镜像的更新
curl -H "Authorization: Bearer 上面定义的Token" localhost:8080/v1/update
- 更新指定镜像
curl -H "Authorization: Bearer 上面定义的Token" localhost:8080/v1/update?image=foo/bar,foo/baz
下期预告:《极空间/绿联/飞牛NAS实战丨可视化Docker升级手把手教程》,关注青柠不迷路~
作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~
,