要实现容器不健康时自动重启,核心是结合 Docker 的「健康检查」+「重启策略」,或通过外部工具(如 Docker Compose、Systemd、Watchtower)增强管控。以下是多种落地方案,从简单到进阶逐步讲解:
一、基础方案:Docker 原生重启策略(推荐)
Docker 本身支持基于容器状态的重启策略,结合健康检查,可实现「不健康时自动重启」。
1. 核心逻辑
- 先为容器配置健康检查(检测应用是否真的可用);
- 再为容器设置重启策略
--restart=on-failure[:max-retries](容器退出 / 不健康时重启)。
2. 实操命令(运行容器时配置)
# 示例:Nginx 容器,不健康时自动重启(最多重启5次)
docker run -d \
--name nginx-health \
# 1. 配置健康检查(检测应用可用性)
--health-cmd "curl -f http://localhost:80 || exit 1" \
--health-interval 10s \ # 每10秒检查一次
--health-timeout 5s \ # 检查超时5秒
--health-retries 3 \ # 连续3次失败标记为不健康
--health-start-period 30s \ # 启动后延迟30秒开始检查(适配应用启动耗时)
# 2. 配置重启策略:不健康/退出时重启(最多5次)
--restart=on-failure:5 \ # on-failure:容器非0退出码时重启;:5 是最大重启次数(可选)
nginx
关键参数解读
--restart=on-failure:当容器退出码非 0(包括健康检查失败导致的容器状态异常)时,Docker 自动重启容器;若加:max-retries(如on-failure:5),则最多重启 5 次,避免无限重启。- 健康检查失败后,容器状态会变为
unhealthy,Docker 会判定为「运行异常」,触发on-failure重启策略。
4. 验证效果
- 手动让容器变不健康:
运行
# 进入容器,停止Nginx进程 docker exec -it nginx-health bash nginx -s stop - 等待 10 秒(健康检查间隔),查看容器状态:
运行
docker ps # 会看到容器先变为 unhealthy,随后自动重启(STATUS 列显示 Restarting → Up)
358

被折叠的 条评论
为什么被折叠?



