腾讯云 4 核 8G 的 CentOS 7.9 跑 Docker 20.10,凌晨计划内维护重启了宿主机,起来后 docker ps 只剩两个容器,业务容器一个都没起,运维以为镜像坏了。

一开始怀疑是「docker 服务本身没设开机自启,systemctl is-enabled docker 一直是 disabled」,查了一圈,方向不对。

真正麻烦的地方在于,几个原因的现象几乎一样。docker run 时没带 restart 参数,默认策略是 no,宿主机重启后不会自动拉起容器。少数情况下是容器虽然配了 unless-stopped,但维护前有人手动 stop 过,这个状态会被记住并且开机不恢复。

还有一种情况,compose 文件里写了 restart 但实际是用 docker run 起的,两边配置不是一回事。

动手时先看容器当前的策略和退出状态

docker inspect web -f '{{.HostConfig.RestartPolicy.Name}} {{.State.Status}}'

随后确认 docker 服务是否开机自启

systemctl is-enabled docker containerd

然后把已有容器的策略补上并启动

docker update --restart unless-stopped $(docker ps -aq) && docker start web

给 docker 服务设为开机自启并验证

systemctl enable --now docker && systemctl is-enabled docker

别只看报错消失,验证要多做一步。docker ps 里业务容器全部 Up,重启宿主机复测后容器在一分钟内自动恢复,systemctl is-enabled docker 输出 enabled。

容易忽略的是,unless-stopped 会记住手动停止的状态,做维护要用 stop 而不是 kill;容器化之后再依赖开机脚本拉起服务,往往两边打架。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189