首页/云/Docker 容器速查/HEALTHCHECK 容器健康检查
镜像与构建107 条

HEALTHCHECK 容器健康检查

在镜像里内置健康检查:Docker 周期执行检查命令,按退出码标记 healthy/unhealthy,docker ps 的 STATUS 列会显示状态。

Docker 容器速查云更新于 2026-10-13

HEALTHCHECK 是什么

HEALTHCHECK 在镜像里内置健康检查:Docker 按固定间隔执行指定命令,用退出码判断容器是否健康,docker ps 的 STATUS 列随之出现 (healthy) 或 (unhealthy) 标记。它只负责打标记,不会自动重启容器。

基本信息

语法HEALTHCHECK [--interval=30s] [--timeout=30s] [--start-period=0s] [--retries=3] CMD 命令
判定规则退出码 0 为健康,1 为不健康
状态流转starting → healthy 或 unhealthy
关闭检查HEALTHCHECK NONE 可禁用基础镜像自带的检查
查看结果docker inspect -f '{{json .State.Health}}' 容器

典型使用场景

  • 编排里等依赖服务 healthy 之后再启动上游,避免启动时连不上数据库
  • 滚动更新时确认新实例真的能响应请求,而不只是进程还活着
  • 巡检脚本按健康状态过滤,比只看 running 更接近真实的可用性
  • 给冷启动慢的应用加宽限期,避免初始化阶段就被判为故障
  • 基础镜像自带的检查不符合项目实际时,先 NONE 关掉再写自己的

示例

示例
HEALTHCHECK --interval=30s --timeout=5s --start-period=40s --retries=3 \
  CMD wget -qO- http://localhost:8080/healthz || exit 1

# 关闭基础镜像自带的检查
HEALTHCHECK NONE

四个参数怎么定

参数作用取值建议
--interval检查间隔,默认 30s比应用响应时间长一个量级,不宜过密
--timeout单次检查超时,默认 30s略大于健康接口的正常响应时间
--start-period启动宽限期,默认 0按冷启动时长设置,期间失败不计入重试
--retries连续失败多少次判为不健康,默认 3结合 interval 推算能容忍的总时长
start-period 内的失败不计入 retries,专为慢启动应用设计;它在每次容器启动时重新计时,重启后会重新给宽限。
健康检查本身消耗容器内的资源,命令要足够轻。把 /healthz 做成只判断自身状态的接口,比让检查直接去连接下游数据库更稳。
编排层也有等价的健康机制(compose 的 healthcheck、Kubernetes 的 readinessProbe),镜像里的检查不代表编排一定会用;两处配置不一致时以编排为准。

易错点

  • 检查命令依赖的工具不在镜像里(Alpine 默认没有 curl)会一直标记为 unhealthy,换成 wget、nc 或镜像里已有的工具
  • unhealthy 只是标记,Docker 不会据此重启容器,要靠编排策略或外部巡检处理
  • 检查里连带探测下游依赖,会让健康状态随下游抖动整体变红,健康检查应当只反映自身可用性
  • interval 设得过小会持续占用进程与日志空间,收益却很小,按业务容忍的故障发现时间反推更合理
  • 改了检查命令却没重建容器,运行中的实例仍在跑旧检查,排查健康状态异常前先确认生效的是哪一份配置

数据来源与参考

  • Docker 官方文档:Dockerfile HEALTHCHECK(docs.docker.com)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌