1. 当前位置: 网站首页 >  NAS >  NAS的Docker容器怎么升级更新?重启一下是不管用的,五步走完数据一点不丢

NAS的Docker容器怎么升级更新?重启一下是不管用的,五步走完数据一点不丢

NAS的Docker容器升级五步流程图:重启容器与升级容器的区别、镜像升级步骤、旧镜像清理与Watchtower取舍

Jellyfin后台角落弹了个「有新版本」的黄条,我顺手把容器点了个重启,十分钟后进设置一看,版本号纹丝没动。当时我就纳闷了,重启都重启了,怎么升不上去?后来才搞明白,容器重启是把同一个餐盒端下去又端上来,菜还是那盘旧菜。这篇就把容器升级这件事从头到尾捋一遍,参数怎么抄、镜像怎么拉、数据为什么不会丢,都给你说明白。

先把这事想通:重启是重启,升级是升级

之前写Docker入门那篇的时候打过个比方:镜像是安装包,容器是拿安装包跑起来的程序。升级这件事,卡就卡在这个关系上。

你点「重启」,路由器也好NAS也好,做的只是把现在这个容器停掉再开起来,用的还是硬盘里那份旧镜像。开发者发了新版本,等于做了一份新安装包,你不去把它拉下来,重启一百次也还是老版本。所以升级的真面目是:拉一份新镜像,把旧容器删掉,照着原来的参数用新镜像重新开一个。

我第一次听懂这个流程,下意识的反应是「那我容器里那些配置不全得重填?」——这是新手最容易犯的误会。配置和数据压根就不该待在容器里面。装容器时做过的「目录挂载」,就是把NAS硬盘上的文件夹接进容器当它的数据目录。容器随便删、随便重建,外面硬盘上的东西纹丝不动。只要当初挂载做对了,换餐盒这道工序伤不到你一根菜。

反过来说,如果哪个容器当初没挂载配置目录,升级就是一次清零。我早期装下载器吃过这个亏,两个月的下载记录说没就没,这事写过教训不再重复。升级前先看一眼挂载列表,比什么都重要。

动手前只做一件事:把参数抄下来

删容器之前,有三样东西必须抄全,少一样重建完就少一样功能:

要抄的东西抄的时候盯什么
端口映射左边是NAS对外的口,右边是容器内部的口,左右别抄反
挂载目录两列路径,左边NAS真实路径,右边容器内部路径,一格一格对
环境变量有的容器靠它传密码和参数,一行都别落下

我家那台飞牛,进容器详情页,这几样一页页翻着抄就行,嫌手抄慢就截图。帮表弟那台群晖弄的时候更省心,Container Manager里点进容器详情,端口、挂载、环境变量都在一屏里,重建的时候向导还记着上回的配置,基本一路下一步。

走命令行的有捷径,SSH进NAS敲一条docker inspect 容器名,参数一股脑全吐出来,重定向到文本文件存着就行。SSH怎么开之前写过,这里不展开。

五步走完一次升级

道理通了,动作其实就五步,我按这个顺序升了两年:

步骤干什么容易翻车的点
第一步抄参数截图存底,别凭记忆
第二步拉新镜像标签要跟原来对上,见下文
第三步停用并删掉旧容器是删除不是停止,停止了新容器开不起来
第四步照抄参数重建挂载路径一列列核对,别串行
第五步进后台看版本号版本变了才算升级完成

第二步的标签最容易糊弄人。当初装容器的时候建议过能锁具体版本号的就别用latest,这样升级时要多做一个动作:把镜像标签从旧版本号改成新版本号再拉。比如原来钉的是2.5.0,官方出了2.6.0,你就拉2.6.0。用latest的倒是省事,直接重新拉一次latest就是新的——代价是版本什么时候变、变成什么样,全不由你。

拿我家qBittorrent那次说,从4.5系升到4.6.1,就是因为4.6.1起临时密码的机制变了,adminadmin那个默认密码取消了,每次启动的随机密码印在容器日志里。升级完进容器日志翻那行「A temporary password」,把新密码抄下来再改掉,流程闭死。这个下载机从安装到保种的完整踩坑在下载机那篇里。

用compose装的容器最舒服,一条docker compose pull把新镜像拉下来,再docker compose up -d,停旧容器、建新容器全自动,参数全在配置文件里躺着,根本不用抄。我现在新装容器一律用compose,就是被升级这件事教育出来的。

手特别抖的,重建之前给挂载的那个共享文件夹拍个快照再动手。快照是Btrfs文件系统才有的功能,ext4的盘没有,两种文件系统怎么选写过一篇。

拉不动镜像,是升级路上最常见的拦路虎

五步里最容易卡住的是第二步。Docker的镜像仓库在国内直连时好时坏,网上流传的那些老公共加速地址,中科大那批、早年的 DaoCloud,大半都停了或者限流了,照着旧教程抄十有八九白忙。

这两年我试下来最稳的一条路:注册个阿里云账号,登录进控制台,找「容器镜像服务」里的「镜像加速器」页面,会发你一个专属地址,格式是https://你的ID.mirror.aliyuncs.com这种。把这个地址配到NAS的Docker设置里就行——飞牛的Docker设置里有镜像源的入口,图形界面点几下;走命令行的改/etc/docker/daemon.json,在registry-mirrors里加上这个地址,重启Docker服务生效。个人地址免费,比碰运气找公共源踏实得多。

还有个笨办法永远可用,家里宽带抽风那阵我靠它救过急:找台能拉的电脑(或者手机热点环境)把镜像拉下来,docker save -o 文件名.tar 镜像名导出成文件,传到NAS上docker load -i 文件名.tar导进去,后面的停旧容器、重建照旧。文件大点,一个Jellyfin镜像导出来小一GB,但胜在不挑网络。

顺带提醒一句,拉镜像那几分钟硬盘是在写的,自动更新的定时任务别安排在硬盘该休眠的半夜,硬盘被偷写盘吵醒的排查我写过一整篇,别自己给自己埋这个雷。

升完不打扫,旧镜像能把存储池吃穿

这事的隐蔽之处在于:每升一次级,旧镜像会原地留下来,不会自动删。你删的是容器,镜像那份「旧安装包」还躺在硬盘上。一年升个七八回,一个容器就能攒出好几GB的旧版本。

我上次清存储池的时候专门算过账,Docker那一摊占了四十多个GB,除了容器日志,一多半就是历次升级攒下的旧镜像。清法不复杂:命令行一条docker image prune,把那些没有容器在用的镜像一锅端;不碰命令行的,在镜像列表里按大小排个序,把标签显示none的那些删掉——那些就是升级后被顶替下来的旧版本。

删之前扫一眼容器列表,确认要删的镜像没有容器在跑,清理动作只该碰没在用的东西。清完这四十多GB能回来一多半,比删什么照片缓存实在多了。

Watchtower自动更新,我只让它管两个容器

手动五步走顺了,有人就该嫌烦了。有个叫Watchtower的容器(镜像名containrrr/watchtower)专门干这个:把它自己装成一个容器,定时扫你机器上的其他容器,发现镜像有新版本,就自动拉新镜像、停旧容器、照原参数重建,全程不用你管。

听着很美,但我的取舍是只把无状态的容器交给它。影音库、下载器这类,坏了重开就行,数据都在外面,自动升就升吧。带数据库的容器一律手动——相册那类应用后面连着数据库,版本一跳数据库结构跟着变,自动升级半夜翻了车,你第二天才发现照片App连不上库,中间那几个小时的备份就悬了。手动升数据库类的容器,升之前先确认当天备份跑完了,这个习惯比什么自动化都值钱。

我的具体用法是创建Watchtower容器的时候只点两个名字,让它盯Jellyfin和Navidrome这两个,影音库和音乐服务器都是坏了能一分钟重开的东西,交给它放心。定时设在大白天,别半夜偷偷写盘。

收尾把顺序钉死:看更新公告,抄参数,拍快照,拉镜像,删旧容器重建,进后台验证版本号,清旧镜像。还有一句别混了——容器升级和NAS系统更新是两码事,系统那个更新按钮另有一套讲究,我拖了三个月才点的经历在这篇里。刚上手的可以从Docker完整入门那篇把基础补齐,再来折腾升级这套。

展开全文


版权说明 手机扫码阅读
版权所有:《数巢笔记》 => 《NAS的Docker容器怎么升级更新?重启一下是不管用的,五步走完数据一点不丢》
本文地址:https://www.shunot.com/nas/1118.html
除非注明,文章均为 《SHUNOT》 原创,欢迎转载!转载请注明本文地址,谢谢。

发表评论

联系我们

在线咨询:点击这里给我发消息

微信号:master_135

工作日:9:00-23:00,节假日休息

扫码关注