Docker更新太麻烦?NAS部署Watchtower,实现全自动无感升级
大家好,我是飘雷。
很多喜欢折腾NAS的兄弟,都会在设备上跑上各种各样的Docker容器。比如咱们之前教程里分享过的影视服务器、下载软件、各类辅助工具等等。
但是随着容器越装越多,有个让人头疼的问题就来了,怎么给这些Docker容器更新升级?
在部署的Docker容器较少时,咱们可以采用手动更新,只是步骤往往比较繁琐,得去镜像站拉取最新镜像,然后停止当前容器,删除旧容器后用相同的参数重新部署新容器。
可以想象,如果有十几个甚至几十个容器,隔三差五这么搞一次更新的话,就属实有点太麻烦了
那么,有没有什么办法能让我们一劳永逸,让NAS自动帮我们在后台默默升级这些Docker容器呢?
有的兄弟,有的。
今天咱们就来分享一款在Github上斩获24.7k收藏的免费开源神器Watchtower,只要把它部署起来,NAS就拥有了自动升级Docker容器的超能力。
https://github.com/containrrr/watchtower

一、Watchtower是什么?

Watchtower翻译成中文就是瞭望塔,它的本质其实是一个极其轻量级的Docker容器,在运行后,会像一个尽职尽责的哨兵一样,监控着你NAS上运行的其他Docker容器。
它会定时去DockerHub之类的镜像仓库拉取比对镜像的版本信息,一旦发现某个容器有了新版本的镜像,就会自动拉取新镜像,关闭旧容器,然后使用你最初部署时的完全相同的参数启动新容器,全程无需人工干预。
Watchtower在监控的自由度也相当高,咱们可以让它监控所有容器,也可以通过黑白名单或直接指定名称的方式,精准控制更新范围,绝不误伤核心数据容器。
对于喜欢折腾各种Docker的朋友来说,这绝对是一个能让你事半功倍的效率神器。今天咱们就手把手教大家,在NAS上把它跑起来。
二、NAS部署Watchtower流程
接下来我们来看看如何在NAS上通过Docker Compose的方式部署Watchtower,这里用到的设备依然是威联通最新的8盘位旗舰型号Qu805,N355处理器性能强劲,搭配可替换的16GB内存,跑再多Docker也没压力。

这里使用Docker Compose的方式来部署最为方便,一键复制粘贴代码即可,参数修改清晰可见,非常轻松。
打开威联通 Container Station,点击左侧的「应用程序」,然后点击右侧黑色「创建」按钮,输入以下代码:
services:
watchtower:
image: containrrr/watchtower:latest
container_name: watchtower
restart: always
environment:
# 设置时区为上海
- TZ=Asia/Shanghai
# 每天凌晨4点自动检查并更新
- WATCHTOWER_SCHEDULE=0 0 4 * * *
volumes:
- /var/run/docker.sock:/var/run/docker.sock
这里需要注意,必须映射/var/run/docker.sock,它赋予了Watchtower与NAS底层Docker守护进程通信的权限,加入这行Watchtower才能接管和控制其他容器,千万别删别改。

点击「创建」后,耐心等待NAS拉取镜像并部署完成。在Container Station中看到状态显示正在运行即可。

三、Watchtower的使用和配置
Watchtower的部署过程非常简单,但它没有提供部署后的设置功能,所以有特殊需求的话,咱们需要通过在部署时添加相应命令才能实现。
为了让Watchtower更符合咱们个人的使用习惯,建议大家掌握以下几个核心的配置技巧,这也是官方文档中极为推荐的做法。
1. 修改自动检查更新的频率与时区
在上面的Docker Compose代码中,我们使用了 WATCHTOWER_SCHEDULE=0 0 4 * * *,代表每天凌晨4点整执行检查。
这里有两个细节需要特别注意。
首先,Watchtower使用的是6位的Cron表达式(比 Linux 常见的 5位 多了最前面的秒),第一位必须填代表秒数的数字。
举例来说,如果我们想改成每周日凌晨3点更新,可以修改为:0 0 3 * * 0。
另外,时区变量(TZ)极其重要,如果咱们在环境变量中不配置TZ=Asia/Shanghai,Watchtower就会默认使用UTC时间。
因为北京时间比UTC快8小时,在不手动指定时区的情况下,在原始代码中设定的凌晨4点,实际触发时间会变成咱们当地的中午12点。
所以一定要加上时区环境变量,才能保证它按咱们设定的本地时间准确干活。
不放心的话,可以在部署完成后去Container Station看一眼容器日志,如果出现了预期的时间和+0800 CST,就代表时区和定时任务都完美生效了。

2. 灵活选择监控Docker容器的范围
默认情况下,Watchtower会监控并更新NAS上所有的容器,但在实际使用时大家都知道,并非所有的Docker都适合无脑自动更新。
比如Nextcloud、MySQL等数据库类容器,跨版本大更新如果不提前备份,有可能会导致数据崩溃。
为了安全,Watchtower官方给出了三种精准控制的方法:
(1)直接指定容器名称
如果我们只想更新极个别的几个容器,可以直接在DockerCompose里通过command参数来指定容器名字,只需要在咱们刚才的代码最下面加上一行即可,多个容器名中间用空格隔开。
比如,如果我们只想更新名为nginx和redis的容器:
volumes:
- /var/run/docker.sock:/var/run/docker.sock
# 在这里直接写上你要监控的容器名,空格隔开
command: nginx redis
加上这一行后,Watchtower就会完全无视其他的应用,变成nginx和redis的专属升级保姆。
(2)黑名单模式(排除法)
如果我们大部分Docker容器都想自动更新,只有少数几个不想动。只需要在部署那个不想被更新的Docker容器时,给它加上这行 labels 标签:
labels:
- "com.centurylinklabs.watchtower.enable=false"
Watchtower监控时看到这个标签,就会直接忽略它。
(3)白名单模式(指定法)
如果我们希望统一通过标签来管理更新权限,可以在Watchtower的环境变量中加入一行:
- WATCHTOWER_LABEL_ENABLE=true
此时Watchtower默认不会更新任何容器。
然后,只需要在想被更新的容器上加上下面的白名单标签,Watchtower就会只针对有这条标签的容器进行更新:
labels:
- "com.centurylinklabs.watchtower.enable=true"
这种机制容错率更高,也更适合NAS老手来使用。
3. 更新后自动移除旧镜像
Docker的运行机制是这样的,拉取新版本镜像后,旧版本镜像并不会自动删除,而是会变成名为 的悬空镜像(Dangling images)。
随着咱们容器不断更新,如果不加干预,这些废弃的旧镜像可能会大量挤占NAS的硬盘空间。
为了解决这个痛点,我们只需要在Watchtower中加入环境变量:
- WATCHTOWER_CLEANUP=true
开启这个选项后,一旦 Watchtower成功拉取新镜像并重启了容器,它就会顺手把遗留下来的旧版本镜像彻底删除,释放NAS上的硬盘空间。
4. 一次性手动运行模式
如果有兄弟不想让它常驻后台,只想在需要的时候更新一下,我们可以在代码的环境变量部分把WATCHTOWER_SCHEDULE 删掉,加上变量:
- WATCHTOWER_RUN_ONCE=true
同时删除自动重启命令:
restart: always
此时Watchtower在部署后会运行一次,完成检查与更新任务后会自动退出,丝毫不占用NAS的日常内存,非常干净利落。
下一次想要手动更新时,只需要在Container Station选中它,再次启动即可。
总结
总体来说,Watchtower这个项目完美地解决了NAS玩家后期维护Docker容器的痛点,它就像一个默默无闻的后台大管家,替咱们完成最耗时、最繁琐的版本追踪和重启工作,并且凭借灵活的配置项,咱们也可以把它调教得极其顺手。
如果你也被繁琐的手动更新折磨过,强烈建议花个3分钟把它部署在NAS里试试。
以上就是本期的全部内容了,如果大家在部署过程中遇到什么问题,欢迎在评论区留言交流。也欢迎给飘雷来个点赞、收藏加关注三连击,我们下期再见!

太子长琴
校验提示文案
太子长琴
校验提示文案