这里是青柠的《零基础玩转docker》开篇教程!不用记复杂命令,小白也能轻松上手的保姆级指南来啦~

【神器登场】Watchtower - Docker党的自动更新管家

它就像你手机里的「应用商店自动更新」功能!简单来说:
Docker Hub ≈ 手机应用商店(存放所有镜像的仓库)
Watchtower ≈ 手机系统更新服务(24小时待命的智能管家)
Docker容器 ≈ 你安装的APP(比如微信/支付宝)

举个栗子
当微信推出新版本时,你的手机会自动检测→下载→静默更新。而Watchtower正是把这种「无感更新」带到Docker世界!它会定时扫描容器对应的镜像版本,发现更新立即执行「镜像拉取→容器重建→无缝切换」三连击,全程无需手动敲命令!

三大核心功能
智能监控:自动检测所有运行中容器的镜像更新
灵活策略:支持立即更新/定时更新/手动确认模式
无缝切换:采用滚动更新机制确保服务不中断

适合哪些人?
▫️总忘记更新容器的小迷糊
▫️同时管理多台nas的极客玩家
▫️想彻底摆脱命令行操作的小白用户

注意事项
① 数据库类容器(如MySQL)慎用自动更新
② 建议先为关键容器设置更新通知(教程后续会教)
③ 可通过标签控制特定容器的更新策略

拓展阅读:Watchtower官方文档 (青柠提示:文档虽好但全英文哦!)


watchtower 的使用

注意:镜像更新只能更新版本是 latest 的镜像,无法更新带版本号的镜像!

群晖/威联通Docker升级指南丨零基础容器更新技巧手把手教程

更新镜像的几种模式

以下这几种模式各有利弊,按照自己需求进行选择哈!

  1. 模式一:发现更新提醒我,然后由我手动选择更新;

这种模式的问题在于,发现更新镜像后,虽然提醒我们了,但是还需要我们去使用SSH手动执行命令来进行镜像更新,非常的不方便,时间久了就懒得更新了。

sudo docker run -d

--name watchtower

-v /var/run/docker.sock:/var/run/docker.sock

containrrr/watchtower

使用上面命令,可以部署 watchtower,会自动监控全部镜像是否有可用更新,当有可用更新时,自动更新。

  1. 模式二:立即更新全部可更新镜像;

这种模式的问题在于,不想更新的镜像,也会给更新了,就比如某个镜像我就想用指定的版本,但是使用这种模式,会强制自动更新最新的镜像。

# 以下命令是:检查更新 linuxserver-radarr-1和 portainer ,并且更新好之后退出本次运行创建的 Watch­tower 容器然后删除镜像文件,多个容器在后面加空格隔开即可 注意 : 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

  1. 模式三:某一个时间集中更新指定的应用;

这种模式相对友好,不过需要每次新增镜像后,也同时更新一下镜像更新配置,这样即可发现指定镜像需要更新后,自动集中更新。

群晖中的配置如下:

以 每日定时 检查 指定镜像,并进行更新为例,做一个演示

  • 依次打开:控制面板 - 任务计划,在 任务计划 中
  • 点击 新增 - 计划的任务 - 用户定义的脚本
  • 在常规设置中,任务名称可以自己随便起,不过必须是英文和数字,用户选择root
  • 在计划设置中,设置任务运行的周期以及时间,想每天更新的可以选择每天重复,我觉得没有必要每天都去更新,就选择了每周二的凌晨2:00进行更新,因为这个时间我不会使用Docker,避免更新而造成的使用的中断
  • 在任务设置中,输入我们的命令,其中qinglong 和 netdata 是指定要更新的容器的名称;注意: 如果为空的话是全部更新,我只是指定了我需要更新的容器,避免一些重要的Docker因更新造成运行不稳定。如果多个容器需要更新,可填写多个名称,中间用空格隔开

群晖/威联通Docker升级指南丨零基础容器更新技巧手把手教程
群晖/威联通Docker升级指南丨零基础容器更新技巧手把手教程
群晖/威联通Docker升级指南丨零基础容器更新技巧手把手教程
群晖/威联通Docker升级指南丨零基础容器更新技巧手把手教程
群晖/威联通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

  1. 触发全部镜像的更新

curl -H "Authorization: Bearer 上面定义的Token" localhost:8080/v1/update

  1. 更新指定镜像

curl -H "Authorization: Bearer 上面定义的Token" localhost:8080/v1/update?image=foo/bar,foo/baz

下期预告:《极空间/绿联/飞牛NAS实战丨可视化Docker升级手把手教程》,关注青柠不迷路~

作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~

,

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。