|
更新方法 [size=font-size: 1.5rem,1.5rem]让 [size=font-size: 1.5rem,1.5rem]Docker [size=font-size: 1.5rem,1.5rem]容器优雅的实现自动更新[size=font-size: 1.125rem,1.125rem]折腾 Docker 可以说是 NAS 玩家最大的乐趣之一,不过很多小伙伴可能部署成功之后就不会再管它了,殊不知的是, Docker 容器其实就和我们的手机 APP 一样,也会不停地更新与升级。[size=font-size: 1.125rem,1.125rem]传统的 Docker 容器更新其实有些繁琐,还需要手动停止容器,然后重新拉取最新镜像,在对着原路径再配置一次,最后重启容器。 虽说步骤不多,但是如果自己 NAS 上的 Docker 容器 很多的话,操作起来还是很费功夫的。[size=font-size: 1.125rem,1.125rem]对于极空间我很早就分享了它上面一个很好用的 Docker 更新神器『 docker copilot 』,不过不能自动更新略有遗憾,今天就为大家分享一种逼格更高(全程命令化操作),可以全自动监控和更新 Docker 容器的神器『 Watchtower 』[size=font-size: 1.333rem,1.333rem]关于 [size=font-size: 1.333rem,1.333rem]Watchtower[size=font-size: 1.125rem,1.125rem] [size=font-size: 1.125rem,1.125rem][size=font-size: 1.125rem,1.125rem] [size=font-size: 1.125rem,1.125rem]Watchtower [size=font-size: 1.125rem,1.125rem]是一个免费 开源项目 ,主要用于自动更新运行中的 Docker 容器。 它可以监控容器中的镜像,如果检测到更高版本的镜像可用, Watchtower 会自动拉取最新的镜像并重新启动容器,以确保使用的是最新的版本。[size=font-size: 1.125rem,1.125rem]它主要的作用为:- [size=font-size: 1.125rem,1.125rem]自动检查更新 [size=font-size: 1.125rem,1.125rem]:定期或者随时检查托管的容器镜像,以发现是否有新的版本。
- [size=font-size: 1.125rem,1.125rem]镜像拉取 [size=font-size: 1.125rem,1.125rem]:当发现新的镜像版本时,自动拉取最新的 [size=font-size: 1.125rem,1.125rem]镜像 [size=font-size: 1.125rem,1.125rem]并自动配置。
- [size=font-size: 1.125rem,1.125rem]容器重启 [size=font-size: 1.125rem,1.125rem]:在拉取完新镜像后,自动停止并重启相应的容器,以应用更新。
- [size=font-size: 1.125rem,1.125rem]配置灵活性 [size=font-size: 1.125rem,1.125rem]:支持通过 [size=font-size: 1.125rem,1.125rem]环境变量 [size=font-size: 1.125rem,1.125rem]进行多种配置,用户可根据需求自定义更新策略(比如指定更新,全部更新等)。
[size=font-size: 1.125rem,1.125rem]它的工作原理为:[size=font-size: 1.125rem,1.125rem]Watchtower [size=font-size: 1.125rem,1.125rem]在运行之后会监视 NAS 中正在运行的容器以及相关的镜像(可以是全部也可以是我们指定的),当它发现 运行容器 中的镜像已经有变动并需要更新的时候,它会以发送 SIGTERM 信号的方式,先结束运行中容器运行,然后会根据我们设定的指令(其实就是一条命令行),用该容器镜像最开始相同的参数自动重新启动相应的容器,甚至包括 Watchtower 本身,就是这么简单![size=font-size: 1.125rem,1.125rem]还不理解? 你就把它看作是我们手机上的应用市场,而 Docker 容器就是手机上的 APP ,应用市场实际上也是一个 APP ,但是通过它可以更新手机上所有的 APP 。[size=font-size: 1.333rem,1.333rem]Watchtower [size=font-size: 1.333rem,1.333rem]部署[size=font-size: 1.333rem,1.333rem][size=font-size: 1.125rem,1.125rem] [size=font-size: 1.125rem,1.125rem][size=font-size: 1.125rem,1.125rem] [size=font-size: 1.125rem,1.125rem]Watchtower [size=font-size: 1.125rem,1.125rem]的部署需要我们开启极空间的 SSH ,位置在“系统设置 -- [size=font-size: 1.125rem,1.125rem]远程协助 [size=font-size: 1.125rem,1.125rem]/SSH [size=font-size: 1.125rem,1.125rem]”。 开启之后还需要使用 SSH 终端工具连接到 极空间 ,具体的连接方案请看我之前极空间 SSH 教程的专题介绍。[size=font-size: 1.125rem,1.125rem][size=font-size: 1.125rem,1.125rem] [size=font-size: 1.125rem,1.125rem]连接成功之后,需要输入命令“ sudo -i ”,再输入一遍管理员的密码(输入密码没有显示,输入完成直接回车即可),切换到 root 账户(提升操作权限)。[size=font-size: 1.125rem,1.125rem]然后这里需要说明的是, Watchtower 是根据不同的命令操作来执行不同的更新效果,也就是说,我们需要根据自己的需求来执行不同的命令。 下面我一个一个的来讲解。[size=font-size: 1.125rem,1.125rem]需求一:快速更新全部容器(不推荐)[size=font-size: 1.125rem,1.125rem][size=font-size: 1.125rem,1.125rem]这个是 Watchtower 默认的命令(原始命令),在这个命令下,我们可以一键快速部署 Watchtower 程序并更新所有 NAS 上的 Docker 容器。[size=font-size: 1.125rem,1.125rem] [size=font-size: 1.125rem,1.125rem][size=font-size: 1.125rem,1.125rem] [size=font-size: 1.125rem,1.125rem]命令为:[size=font-size: 1.125rem,1.125rem]Docker Run-D --名称 watchtower -v/var/run/docker.soc:/var/run/docker.sock 集装箱/瞭望塔[size=font-size: 1.125rem,1.125rem]我为什么不推荐这种方案? 首先并不是最新版本就是最好的,可能会导致不稳定(和我们手机版本更新是一个道理),另一个就是,如果说你 NAS 里面部署的 Docker 容器非常多,特别是有 Docker Compose 堆栈容器, 它们之间都是相互关联的,如果你更新到不同的版本,极大可能会出问题。[size=font-size: 1.125rem,1.125rem]所以,这里建议大家【指定更新容器】,也就是说,只更新自己需要更新的。[size=font-size: 1.125rem,1.125rem]需求二:指定更新容器[size=font-size: 1.125rem,1.125rem][size=font-size: 1.125rem,1.125rem] [size=font-size: 1.125rem,1.125rem][size=font-size: 1.125rem,1.125rem] [size=font-size: 1.125rem,1.125rem]在更新指定的容器前,我们需要知道我们需要更新容器的名字。 输入命令【 docker ps 】,在后面“ NAMES ”下面便是我们 NAS 中运行的所有 Docker 容器的名字。[size=font-size: 1.125rem,1.125rem] [size=font-size: 1.125rem,1.125rem] [size=font-size: 1.125rem,1.125rem]我这里以更新 [size=font-size: 1.125rem,1.125rem]portainer [size=font-size: 1.125rem,1.125rem]为例来作演示,它的命令为:[size=font-size: 1.125rem,1.125rem]docker stop watchtower # [size=font-size: 1.125rem,1.125rem]因为我前面已经部署运行了 watchtower 容器,所以这里先要“停止 watchtower 容器”,首次操作这步忽略(下同) Docker RM Watchtower # 接着“删除 watchtower 容器”,首次操作这步忽略(下同) 停靠运行 -D --named watchtower -v/var/run/docker.soc:/var/run/docker.sock Container/Watchtower Portain # 运行容器并更新 Portain[size=font-size: 1.125rem,1.125rem]简单来说,我们需要在命令后面加上想要更新的容器名字即可。 并且它支持一次更新多个容器,我们只需要继续往后加上容器名字,中间用空格隔开即可。[size=font-size: 1.125rem,1.125rem]需求三:指定更新容器的同时删除旧镜像[size=font-size: 1.125rem,1.125rem][size=font-size: 1.125rem,1.125rem]我们使用 Docker 的时间越长,更新 Docker 的次数越多,它之前的旧 镜像文件 还占据着我们 NAS 的空间。 我们可以在使用 watchtower 更新 Docker 容器的时候加上“ --cleanup ”的参数选项,就能在更新容器的同时删除之前的旧镜像。[size=font-size: 1.125rem,1.125rem] [size=font-size: 1.125rem,1.125rem][size=font-size: 1.125rem,1.125rem] [size=font-size: 1.125rem,1.125rem]这里依然以 portainer 为例,它的命令为:[size=font-size: 1.125rem,1.125rem]docker run -d --name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower --清理 portainer[size=font-size: 1.125rem,1.125rem]需求四:指定更新容器的频率(时间)[size=font-size: 1.125rem,1.125rem][size=font-size: 1.125rem,1.125rem]watchtower [size=font-size: 1.125rem,1.125rem]默认是 24 小时监控一次,如果有更新就会自动更新。 不过我们可以根据自己的需求自定义它监控和更新的时间频率,这里有两种方案:[size=font-size: 1.125rem,1.125rem] [size=font-size: 1.125rem,1.125rem] [size=font-size: 1.125rem,1.125rem]一个方案是设置更新时间间隔,单位为秒,加入的命令参数为“ --interval ”。 比如说我们需要设定每一个小时检查一次 portainer 的更新,它的命令为:[size=font-size: 1.125rem,1.125rem]docker run -d --name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower --清理 --interval 3600 portainer[size=font-size: 1.125rem,1.125rem]【 --interval 3600 】就是我们指定的更新频率,一小时为 3600 秒。[size=font-size: 1.125rem,1.125rem] [size=font-size: 1.125rem,1.125rem] [size=font-size: 1.125rem,1.125rem]另一个方案是置定时检测,格式为 6 字段 Cron 表达式,加入的命令参数为“ --schedule ”。 比如我们需要每天凌晨 3 点种检查 portainer 的更新,它的命令为:[size=font-size: 1.125rem,1.125rem]docker run -d --name watchtower -v /var/run/docker.sock:/var/run/docker.shoe containrrr/watchtower --cleanup --schedule [size=font-size: 1.125rem,1.125rem]“ 0 0 3 * * * “ portainer[size=font-size: 1.125rem,1.125rem]【 --schedule “ 0 0 3 * * * ”】就是我们指定的更新频率,每天凌晨 3 点种的 6 字段 Cron 表达式为“ 0 0 3 * * * ”(自己找网站转换即可)。[size=font-size: 1.125rem,1.125rem]需求五:手动更新[size=font-size: 1.125rem,1.125rem][size=font-size: 1.125rem,1.125rem]可能有些小伙伴只是想更新一次容器,然后让 watchtower 退出,下次更新再次打开即可。 虽说可以直接在 Docker 管理器中手动停止 watchtower 容器,其实我们也可以直接通过加入命令参数“ --run-once ”来搞定。[size=font-size: 1.125rem,1.125rem] [size=font-size: 1.125rem,1.125rem] [size=font-size: 1.125rem,1.125rem]比如说我需要更新一次 portainer ,并且更新好之后退出 watchtower 。 它的命令为:[size=font-size: 1.125rem,1.125rem]docker run -d --name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower --cleanup --run-once portainer[size=font-size: 1.125rem,1.125rem] [size=font-size: 1.333rem,1.333rem]Watchtower [size=font-size: 1.333rem,1.333rem]体验[size=font-size: 1.333rem,1.333rem][size=font-size: 1.125rem,1.125rem] [size=font-size: 1.125rem,1.125rem] [size=font-size: 1.125rem,1.125rem]说了那么多,我现在以我 NAS 上的实际 Docker 容器为例为大家演示一次。 比如说同样是神器的 Lucky ,目前我安装的版本为 2.11.1 ,现在的最新版本为 2.13.4 。[size=font-size: 1.125rem,1.125rem] [size=font-size: 1.125rem,1.125rem] [size=font-size: 1.125rem,1.125rem]我目前的需求就是更新 Lucky 容器的同时删掉旧容器,完成之后 Watch-tower 退出。 按照前面所说的命令格式,它的完整命令为:[size=font-size: 1.125rem,1.125rem]docker run -d --name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower --清理 --run-once lucky[size=font-size: 1.125rem,1.125rem][size=font-size: 1.125rem,1.125rem] [size=font-size: 1.125rem,1.125rem][size=font-size: 1.125rem,1.125rem] [size=font-size: 1.125rem,1.125rem]搞定之后我们再次打开 Lucky 容器,可以看到 Lucky 的版本已经更新到最新的 2.14.0 ,甚至比它自己给出的版本还要高 ~~[size=font-size: 1.125rem,1.125rem] [size=font-size: 1.125rem,1.125rem][size=font-size: 1.125rem,1.125rem] [size=font-size: 1.125rem,1.125rem]并且 Watch-tower 也已经退出,就是这么简单 ~ ![size=font-size: 1.333rem,1.333rem]最后[size=font-size: 1.333rem,1.333rem][size=font-size: 1.125rem,1.125rem]Watchtower [size=font-size: 1.125rem,1.125rem]的自动化、灵活性、安全性和易用性使其成为一个非常实用的 Docker 容器管理工具,可以说是 NAS 必装神器之一。 但是,这里需要再次强调的是,并不是所有的 Docker 容器都适合第一时间更新,因为有些 Docker 容器是求稳,有些是需要特定功能。
|