1. 当前位置: 网站首页 >  NAS >  NAS重启后Docker容器起不来怎么办?先查这三个地方

NAS重启后Docker容器起不来怎么办?先查这三个地方

NAS重启后Docker容器起不来先查重启策略启动顺序磁盘挂载三处

上个月家里跳了一次闸,NAS来电自己起来了,我还挺高兴。结果手机连AdGuard Home连不上,电视打开Jellyfin转圈,下载器也在那儿装死。登进后台一看,9个Docker容器只活了4个,剩下5个全躺在地上。我第一反应是删了重装,后来发现根本没到那一步。

这篇把我排雷的过程捋一遍。如果你家NAS也这样,先别急着拉新镜像,按下面三个地方查,多数情况十分钟内能捞回来。

先把事情拆成两层:NAS起来了,不代表Docker起来了

新手最容易慌的地方就在这。NAS系统开机、硬盘识别、共享文件夹挂载,这是一层;Docker引擎启动、再把你那堆容器一个个拉起来,这是另一层。两者不是同步的,更不是打包的。

我那次跳闸后,飞牛NAS的系统十分钟不到就正常了,文件也能打开,可Docker那头像没接到通知一样。用命令行看一眼就很清楚,SSH进去敲docker ps -a,凡是显示Exited的,就是上次关机或重启时没被正确叫起来。真正在跑的只有Up开头那几个。

所以第一步不是修容器,是先确认它到底什么状态。很多教程让你上来就删镜像,那等于路由器重启一次就重刷系统,没病也折腾出病。先把下面这个表对一遍:

状态大致意思先做什么
Up容器活着,端口可能没通查网络、端口,别动容器
Exited (0)自己正常退出了看日志,多半是配置问题
Exited (非0)启动到一半挂了优先看日志和挂载路径
Created建了但没启动手动 start 一次试试

第一处:重启策略没开,或者开了没写对

Docker自己有一套重启策略,常用的就几个:no是永远不自动起,always是只要Docker引擎在就把它拉起来,unless-stopped是除非你手动停过,否则都自动拉起来,on-failure是只在异常退出时拉。家里NAS上的常驻容器,我一般让它们都吃unless-stopped。

我这次5个没起来的容器里,有两个就是没开自动重启。当初装的时候跟着教程点下一步,没注意这个开关,平时又很少重启NAS,毛病就一直藏着。直到跳闸这次才现原形。

有SSH权限的话,一条命令就能补上:docker update --restart unless-stopped 容器名。没有SSH也别怕,群晖和飞牛的网页后台都有对应的勾选框,位置我放到后面一起说。改完别只改一个,把我装的那几个常驻货全过一遍,省得下次再一个个捞。

但这里有个例外我要说清楚:unless-stopped不是万能的。你手动点过停止的容器,它不会因为NAS重启就自己爬起来,这本来就是设计。还有一种情况,容器起来了又立刻退出,重启策略也会反复拉它、反复失败。真到这种循环里,看状态是没用的,得去查日志和启动报错,那已经不是策略的锅了。

更具体一点的启动顺序问题,和重启策略有关联,但坑不在策略本身。比如Jellyfin去挂载一块还没就位的硬盘,容器确实被拉起来了,可它要的目录是空的或者不存在,进程撑几秒就退。这种时候你盯着重启策略看一天也看不出花来。

第二处:启动顺序错了,Docker抢在硬盘前头跑

我这次最冤枉的一个是qBittorrent。它的下载目录设在一块USB外置硬盘上,NAS重启后,系统先跑Docker,那块USB盘却还在路上。容器起来一看,挂载点空的,下载任务全标红。等系统把盘挂好,容器又不会自己重新认识一遍,就卡在那了。

这种问题的特征是:你手动重启这个容器,它又正常了。因为那时候硬盘已经挂好了。判断也简单,先看报错日志里有没有no such file or directory,再对一眼宿主机上的路径到底有没有。

我的土办法有两个。一个是别把容器的数据目录放在容易晚到的盘上,USB盘、慢吞吞的机械盘,能不放关键容器就别放;另一个是给容器加个延迟启动,或者设置成失败后自己重试,等盘到了再跑起来。群晖和飞牛的网页后台在编辑容器时都能看到「开机自动启动」之类的开关,开上它只是第一道保险,真正要解决的是启动先后。

如果你上了docker compose,可以在服务里写restart: unless-stopped,再给依赖卷一个健康检查。但家里用网页后台的多,没必要为了这点事去啃compose。我现在的处理是:下载盘单独设,重要容器默认走内置存储,少一个变量少一个雷。

第三处:端口、路径、配置改了一半,重启后才暴露

还有一种更气人的情况:容器平时跑得好好的,你也没动它,但NAS一重启,它起来了又秒退。这多半是某个配置文件写错了,或者端口被别的容器占了,只是之前一直没机会重跑,所以没暴露。

我踩过的一次是AdGuard Home。改完上游DNS顺手保存了半截配置,网页没报错,我当它成功了。重启后容器一直Exited (1),日志里就一句配置解析失败。把配置文件里多出来的那半行删掉,start一下就好了。这种事平时根本不会发生,因为容器没重启,坏配置还没被读。

所以只要看到Exited后面带非0数字,就先docker logs 容器名看最后几十行。别怕英文报错,就找几个关键词:no such file、permission denied、address already in use、config。看不懂也没关系,把报错原样丢给搜索也能定位。实在懒得读日志,就把容器原配置里的端口、路径、环境变量三样对一遍,多数坑就藏在这三样里。

端口冲突这个我单独说一句。NAS重启后容器启动顺序不完全一样,两个容器可能同时去抢一个80或53端口,后启动的起不来。AdGuard Home和别的DNS服务同机装,特别容易在53上打架。装之前心里留个账,别一上来把一堆容器都往默认端口塞。

群晖和飞牛的「开机自启」到底在哪开

两边后台我都用过,入口位置记下来省得翻:

项目群晖 Container Manager飞牛 Docker
容器详情点容器名进去,找设置页点容器进去,找配置或高级
自动重启开关「启用自动重新启动」勾上「开机自启」或「自动重启」开关
改完生效保存后建议手动停一下再启动保存后重启容器验证
看日志容器详情里有日志页签容器详情里同样有日志入口

两个系统的叫法有差异,但意思一样。开完开关别就关窗,当场把这个容器手动停掉、再启动一次,能起来才说明真生效了。我帮朋友看群晖时就这么试过,有一台勾了开关没点保存,结果下次断电照旧躺平。

如果你家NAS平时根本不用Docker,只装了相册、文件共享这几个自带应用,那这篇暂时用不上。但只要你开始玩飞牛NAS的Docker,早晚都会撞上一次重启后容器不齐的场面。

实在起不来,两步兜底:先看日志,再重建

前面三个地方查完,大部分容器都能捞回来。真到还不行的份上,也别直接删数据卷。先做两步:

  • 看完整日志:docker logs --tail 100 容器名,把报错时间对到NAS重启之后,别把一个月前的旧日志当成病因。
  • 看挂载和网络:docker inspect 容器名很长,新手可以只搜Mounts和NetworkMode,确认路径和网络是不是你想要的那个。

还不行,再考虑重建。重建不是删数据,是保留配置文件和数据卷,只把容器这个壳重新建一遍。群晖和飞牛网页后台都有导出或重建的入口,动手前把配置截个图,环境变量、端口、路径三样都截下来。我最开始没截图,凭记忆重建,把PUID和PGID漏了,结果文件夹权限一团乱。

最后收个尾。顺序别乱:先docker ps -a看状态,再看重启策略,再查启动顺序和挂载,最后才轮到日志和重建。平时装完容器顺手把容器数量和内存这笔账记一下,别等出问题才想起来谁在跑。

展开全文


版权说明 手机扫码阅读
版权所有:《数巢笔记》 => 《NAS重启后Docker容器起不来怎么办?先查这三个地方》
本文地址:https://www.shunot.com/nas/1427.html
除非注明,文章均为 《SHUNOT》 原创,欢迎转载!转载请注明本文地址,谢谢。

发表评论

联系我们

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

微信号:master_135

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

扫码关注