VPS重启后Docker容器为什么没有自动启动
VPS因为维护或者别的原因重启了一下,回去一看,之前跑得好好的Docker容器全没了,得手动一个个docker start才能拉起来。这不是Docker出故障了,是容器的默认重启策略本来就是"不自动重启",这个坑几乎每个刚开始用Docker的人都会踩一次。
默认策略是"no",不是"always"
docker run起容器的时候,如果没有额外指定--restart参数,Docker默认用的策略是no——容器进程一旦退出(不管是正常退出还是宿主机重启导致的),Docker都不会主动把它拉起来,得手动干预。这是设计上的默认行为,不是bug。
Docker一共提供四种策略:no(默认,从不自动重启)、on-failure(只有异常退出才重启,正常退出不管)、always(不管什么原因退出都会重启,哪怕是你自己手动停掉的,Docker服务一重启它也会被拉起来)、unless-stopped(跟always几乎一样,唯一区别是如果容器是你主动停掉的,宿主机重启后也会保持停止状态,不会被硬拉起来)。
对大部分长期跑着的服务(面板、监控探针这类),unless-stopped最推荐,既保证意外情况下能自动恢复,又不会在你主动停掉之后被强行拉起来打乱操作。
已经在跑的容器,不用重新创建
如果容器已经跑起来了,只是想给它补上重启策略,不需要删掉重建,直接改:
1 | docker update --restart unless-stopped 容器名或ID |
新建容器时直接带上参数
以后每次docker run,习惯性带上这个参数:
1 | docker run -d --restart unless-stopped --name 容器名 镜像名 |
补上策略了,重启还是没自动起来
如果确认容器已经设置好unless-stopped或者always,重启VPS之后依然没有自动拉起来,问题可能出在更底层——Docker这个服务本身有没有设置成开机自启。容器的重启策略是Docker daemon负责执行的,如果Docker服务自己都没跟着系统一起启动,容器策略再对也没用:
1 | systemctl enable docker |
确认状态是enabled,这一步经常被忽略,是"明明设置了restart策略但还是没生效"的常见原因。
顺带一提
之前写的几篇Docker部署文章,命令示例不是每个都带了--restart参数——Uptime Kuma探针那篇带了--restart=always,重启不用管;但Managi网页版SSH管理那篇当时没加,长期用着的话建议照这篇的方法自己补上。