Docker 容器健康检查:识别服务异常与配合恢复策略
本文依据 Docker 官方文档整理,核验日期:2026-05-25。关键结论是:
HEALTHCHECK用于标记容器健康状态;普通 restart policy 在容器进程退出后触发,并不会仅因为容器变为unhealthy就自动重启它。
健康检查做什么
容器进程仍在运行,并不意味着服务一定能正常响应。Dockerfile 或 Compose 中的 healthcheck 可以周期性执行一条探测命令,根据退出状态把容器标记为 starting、healthy 或 unhealthy。
services:
app:
image: your-app:latest
healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://localhost:8080/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 20s
restart: unless-stopped使用 wget 或 curl 前,应先确认该工具确实存在于容器镜像中;否则健康检查本身会失败。
restart 与 healthcheck 的关系
这里最容易被误解:
healthcheck失败达到重试阈值后,Docker 会把容器状态标记为unhealthy;restart: unless-stopped、always或on-failure处理的是容器进程退出后的重启策略;- 对普通 Docker/Compose 容器而言,仅仅变为
unhealthy并不自动触发 restart policy。
更准确的理解是:
健康检查失败 → 状态变为 unhealthy → 由监控、编排平台或人工决定后续恢复动作
容器进程退出 → 按 restart policy 决定是否自动重启常用参数
healthcheck:
test: ["CMD-SHELL", "curl -fsS http://localhost:8080/health || exit 1"]
interval: 30s
timeout: 10s
retries: 3
start_period: 30sinterval:两次检查之间的间隔;timeout:单次检查允许的最长时间;retries:连续失败多少次后判为unhealthy;start_period:启动宽限期,适合启动较慢的服务。
如何实现健康失败后的自动恢复
需要“服务不可用时自动处理”的场景,可以选择:
- 将健康状态接入告警,让管理员判断并处理;
- 使用具备健康调度和替换机制的编排平台;
- 自行设计受控的监控/恢复脚本,并避免无休止重启循环。
不要仅依靠一行 restart: unless-stopped 就认为业务级故障可以自动恢复。
查看健康状态
docker ps --format 'table {{.Names}}\t{{.Status}}'
docker inspect your-container --format '{{json .State.Health}}'参考资料
- Dockerfile
HEALTHCHECK说明:https://docs.docker.com/reference/dockerfile/#healthcheck - Docker restart policy 说明:https://docs.docker.com/reference/cli/docker/container/run/#restart-policies---restart
评论
游客无需注册即可评论。
你提交的昵称、邮箱、网址和评论内容会保存在服务端,用于展示评论身份、接收回复及必要的安全审计。
浏览器会本地保存已填游客信息和评论草稿,方便下次免填。
回复提醒会通过站内消息和邮件通知。