docker 本身无内置自愈机制,但可通过重启策略、健康检查、docker compose 的 unhealthy 重启策略及外部脚本实现自动恢复;需配合监控与日志定位根因。

Docker 本身没有内置的“自愈机制”,但可以通过组合使用容器重启策略、健康检查(healthcheck)、编排工具(如 Docker Compose 或 Swarm)以及外部监控脚本,实现服务异常时的自动检测与恢复。关键在于让系统能识别“异常”并触发重启或重建动作。
1. 合理配置 restart 策略
Docker 容器可通过 restart policy 在退出时自动重启,这是最基础的自愈手段:
- no:默认,不重启
-
on-failure[:max-retries]:仅当容器以非零退出码终止时重启,可选限制重试次数(如
on-failure:3) - always:无论退出原因(包括手动 stop),都会重启(慎用,可能掩盖问题)
- unless-stopped:类似 always,但跳过已手动停止的容器
✅ 建议:对无状态服务(如 Nginx、API 服务)优先用 on-failure:5;避免盲目设为 always,防止进程假死却不断重启。
2. 添加健康检查(HEALTHCHECK)
仅靠进程存活(PID 1 是否在)不够——应用可能卡住、端口监听但无响应。Docker 支持在镜像中定义健康检查命令:
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ CMD curl -f http://localhost:8080/health || exit 1
该指令会定期执行命令,根据返回值判断容器是否“健康”。Docker 将状态标记为 healthy / unhealthy,并在 docker ps 中可见。
⚠️ 注意:健康状态本身不会触发重启,必须配合 restart 策略或编排工具才能生效。例如,在 Docker Compose 中,健康检查失败后可触发容器重建。
3. 使用 Docker Compose 实现健康驱动的自动恢复
Docker Compose v2.2+ 支持 restart_policy.condition: unhealthy,让服务仅在健康检查失败时重启:
services:
web:
image: my-web-app
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
interval: 20s
timeout: 5s
retries: 3
start_period: 40s
restart_policy:
condition: unhealthy
delay: 10s
max_attempts: 3
这样,当健康检查连续失败 3 次,Docker Compose 就会停止并重新创建该容器,完成“自愈”。
? 提示:搭配 deploy.restart_policy(Swarm 模式)还可实现滚动更新与故障隔离。
4. 补充方案:轻量级外部看护脚本
对于无法修改镜像或需更复杂判断逻辑的场景,可用简单 Bash 脚本轮询健康端点并调用 Docker API:
#!/bin/bash
while true; do
if ! curl -sf http://localhost:8080/health >/dev/null; then
echo "$(date) - Health check failed, restarting container..."
docker restart my-app || echo "Restart failed"
fi
sleep 15
done
该脚本可运行在宿主机或独立监控容器中,适合过渡期或定制化强的运维场景。注意控制频率,避免干扰业务。
不复杂但容易忽略:自愈不是万能的,要配合日志采集(docker logs -f)、指标监控(cAdvisor + Prometheus)和告警(Alertmanager),才能真正定位根因,避免“反复拉起又崩溃”的循环。










