容器崩溃后自动拉起核心靠Docker的restart policy,如always、on-failure、unless-stopped等,需创建时配置或用docker update补设,配合HEALTHCHECK可提升自愈质量,且依赖Docker守护进程开机自启。

容器崩溃后自动拉起,核心靠的是 Docker 的 restart policy,不是靠手动执行 docker start 或写脚本轮询。它在容器异常退出时触发重启,并能在宿主机重启后恢复运行——前提是策略已正确配置且 Docker 服务本身开机自启。
选对 restart policy 类型
策略必须在创建容器时指定(docker run)或后续更新(docker update),运行中无法通过 docker start 补加。
- no:默认值,不重启。适合调试或一次性任务。
-
on-failure[:N]:仅当容器以非零退出码退出时重启,可限制最多重试 N 次(如
on-failure:3)。推荐用于多数业务服务,避免掩盖真实故障。 -
always:无论退出原因(包括手动
docker stop),都会无限重启。慎用,可能让卡死进程反复拉起却无响应。 -
unless-stopped:类似
always,但跳过被手动停止的容器。适合长期运行、希望“一启永续”的服务,如 Nginx、PostgreSQL。
给已有容器补设重启策略
如果容器已存在但没配策略,不用删重建,直接用 docker update 命令生效:
docker update --restart unless-stopped my-web-app
该操作立即写入容器配置,无需重启 Docker 服务。验证是否生效:
docker inspect my-web-app --format='{{.HostConfig.RestartPolicy.Name}}'
输出应为 unless-stopped 或对应设置值。
搭配健康检查提升自愈质量
仅靠进程存活(PID 1 是否运行)不够——应用可能假死:端口开着,但 HTTP 接口返回 502 或超时。此时需定义 HEALTHCHECK:
- 在 Dockerfile 中添加(构建镜像时固化):
HEALTHCHECK --interval=30s --timeout=3s --start-period=40s --retries=3 \ CMD curl -f http://localhost:3000/health || exit 1
- 容器启动后,Docker 会定期执行该命令;连续失败 3 次标记为
unhealthy。 - 注意:
HEALTHCHECK本身不触发重启,必须和 restart policy 协同使用。例如on-failure策略下,健康检查失败导致容器退出(返回非零码),就会触发重启。
确保 Docker 守护进程随系统启动
再好的容器策略也依赖 Docker daemon 运行。Linux systemd 系统上必须启用服务自启:
sudo systemctl enable docker
检查是否生效:
systemctl is-enabled docker # 应输出 enabled
宿主机重启后,执行 systemctl status docker 确认状态为 active (running),否则所有容器都无法拉起。











