Docker容器健康检查通过HEALTHCHECK指令实现,支持--interval、--timeout、--start-period、--retries等参数,CMD命令返回0为healthy、1为unhealthy;常用方式包括curl检测HTTP、nc或bash检测TCP、自定义脚本;需轻量、快速、真实反映服务状态,并注意启动期等待与readiness/liveness区分。
docker 容器的健康检查(healthcheck)通过 healthcheck 指令定义,它让 docker 守护进程能主动探测容器内服务是否真正就绪、响应正常,而不仅依赖进程是否存活。正确配置可提升服务可观测性与编排可靠性(如 swarm 或 kubernetes 中的滚动更新、自动重启等)。
HEALTHCHECK 指令语法与核心参数
在 Dockerfile 中声明,格式为:
HEALTHCHECK [OPTIONS] CMD command常用选项包括:
-
--interval=DURATION:两次检查间隔,默认 30s(如
--interval=10s) -
--timeout=DURATION:单次检查超时时间,默认 30s(如
--timeout=5s) -
--start-period=DURATION:容器启动后等待多久再开始检查,默认 0s;对初始化慢的服务很重要(如
--start-period=40s) - --retries=N:连续失败多少次才标记为 unhealthy,默认 3 次
注意:CMD 后跟的是一个 shell 命令(会被包装进 sh -c),返回码决定状态:0 → healthy,1 → unhealthy,2 → reserved(不被 Docker 使用,应避免)。
常见健康检查命令写法示例
选择命令的关键是:轻量、快速、真实反映业务可用性。
-
HTTP 服务(如 Nginx、API):
HEALTHCHECK --interval=15s --timeout=5s --retries=3 CMD curl -f http://localhost:80/health || exit 1
使用-f让 curl 在 HTTP 状态码 ≥400 时返回非零码,|| exit 1确保 shell 层也明确失败。 -
TCP 端口连通性(无 HTTP 接口时):
HEALTHCHECK --interval=10s CMD nc -z localhost 3306 || exit 1
注意:需确保容器内已安装nc(netcat),或改用timeout 3 bash -c 'echo > /dev/tcp/localhost/3306' 2>/dev/null(纯 Bash 实现,无需额外工具)。 -
自定义脚本(推荐复杂逻辑):
将检查逻辑写入/health.sh,赋予执行权限,并在 HEALTHCHECK 中调用:
HEALTHCHECK CMD ["/health.sh"]
脚本内可检查数据库连接、缓存响应、依赖服务连通性等,并统一控制返回码。
运行时覆盖与验证方法
构建镜像后,可在运行时用 --health-cmd、--health-interval 等参数临时覆盖镜像中定义的 HEALTHCHECK:
验证健康状态:
-
docker ps:查看 STATUS 列是否显示
healthy、unhealthy或starting -
docker inspect
| grep -A 5 Health :查看详细健康状态、最近一次检查时间与输出 -
docker logs
:若健康检查命令有输出(如 echo "ok"),且未重定向,会出现在容器日志中(但建议静默执行,避免污染日志)
避坑要点与最佳实践
- 避免检查过重:健康检查应毫秒级完成,不要执行耗时查询或大文件读写,否则拖慢守护进程调度
-
区分 readiness 与 liveness:Docker 的 HEALTHCHECK 更接近 Kubernetes 的
readinessProbe(是否可接收流量)。若需类似livenessProbe(崩溃后重启),需配合编排工具策略,Docker 自身不自动重启 unhealthy 容器 -
启动期耐心设置
--start-period:例如 Java 应用冷启动可能需 30–60 秒,不设该值会导致早期误判为 unhealthy -
检查路径要真实有效:比如用
/health而非根路径/,避免触发完整页面渲染或重定向,影响性能和准确性











