Docker健康检查通过HEALTHCHECK指令或--health-cmd定义检查命令(退出码0为健康),需合理设置间隔、超时与重试参数,并确保编排工具响应以实现自动恢复。

在 Docker 中配置健康检查(Healthcheck)能让容器自我报告运行状态,结合编排工具(如 Docker Swarm 或 Kubernetes)还能触发自动重启或替换异常容器,实现基础的状态自愈。关键不在于“加一条命令”,而在于写对检查逻辑、设好超时与重试,并让上层调度器真正响应它。
健康检查的核心配置项
Docker 的 HEALTHCHECK 指令(Dockerfile 中)或 --health-cmd(docker run 时)定义了如何判断容器是否健康。必须明确以下参数:
-
检查命令:必须是容器内可执行的命令,退出码为 0 表示健康,非 0 表示不健康(如
curl -f http://localhost:8080/health || exit 1) - 检查间隔(--health-interval):默认 30s,太短会增加负载,太长导致故障发现延迟
- 超时(--health-timeout):单次检查最长等待时间,建议略大于实际响应耗时(如 API 响应通常
- 启动宽限期(--health-start-period):容器启动后等待多久才开始检查,给应用预留初始化时间(如 Spring Boot 应用常需 20–40s)
- 失败阈值(--health-retries):连续多少次失败才标记为 unhealthy,默认 3;设太高可能延误干预,太低易误判
在 Dockerfile 中声明健康检查
这是最推荐的方式,把健康逻辑和镜像绑定,便于复用和版本控制:
FROM nginx:alpine
COPY nginx.conf /etc/nginx/nginx.conf
HEALTHCHECK --interval=30s \
--timeout=3s \
--start-period=10s \
--retries=3 \
CMD wget --quiet --tries=1 --spider http://localhost/ || exit 1
注意:wget --spider 不下载内容,只检查 HTTP 状态码;--quiet 和 --tries=1 避免冗余输出和重试干扰判断。
运行时覆盖健康检查(适合调试或临时调整)
使用 docker run 可覆盖镜像中定义的 HEALTHCHECK:
docker run -d \ --name myapp \ --health-cmd="curl -f http://localhost:3000/healthz || exit 1" \ --health-interval=20s \ --health-timeout=5s \ --health-start-period=45s \ --health-retries=2 \ -p 3000:3000 \ my-node-app
运行后可用 docker ps 查看 STATUS 列是否显示 healthy 或 unhealthy;用 docker inspect myapp | jq '.[0].State.Health' 查看详细结果(含最近一次检查日志、状态、失败次数等)。
配合 Docker Swarm 实现状态自愈
单独健康检查不会自动重启容器——Docker Engine 本身不执行恢复动作。但 Docker Swarm 可基于健康状态做服务级自愈:
- 部署服务时启用健康检查:
docker service create --health-cmd "..." --health-interval 30s ... myimage - Swarm 会定期检查任务(task)健康状态;若连续失败达到阈值,自动停止当前 task 并在节点上启动新实例
- 确保服务使用
--restart-condition none(默认),因 Swarm 自己管理生命周期;不要混用传统 restart policy - 可通过
docker service ps <service>观察 task 的STATUS是否出现rejected或starting,即自愈已触发
健康检查不是万能开关,它依赖你定义的检查是否真实反映业务可用性。比如只查端口通不通,可能漏掉数据库连接失效、缓存雪崩等深层问题。建议将 /healthz 或 /readyz 接口设计为聚合检查(HTTP + DB + Redis 连通性),再由健康检查调用它。不复杂但容易忽略。

















