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
2
systemctl enable docker
systemctl status docker

确认状态是enabled,这一步经常被忽略,是"明明设置了restart策略但还是没生效"的常见原因。

顺带一提

之前写的几篇Docker部署文章,命令示例不是每个都带了--restart参数——Uptime Kuma探针那篇带了--restart=always,重启不用管;但Managi网页版SSH管理那篇当时没加,长期用着的话建议照这篇的方法自己补上。