首页/云/云与容器速查/Dockerfile HEALTHCHECK 健康检查
容器与 Docker106 条

Dockerfile HEALTHCHECK 健康检查

定义容器内自检命令:通过则 docker ps 显示 healthy,失败累计显示 unhealthy。让编排与监控可以基于状态而非端口探测判断可用性。

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

Dockerfile HEALTHCHECK 是什么

HEALTHCHECK 在镜像里定义容器自检命令,Docker 按设定周期在容器内执行它:退出码为 0 视为健康,1 视为不健康,docker ps 的状态列会显示 healthy 或 unhealthy。有了它,编排与监控就能基于容器状态判断可用性,而不只是从外部探测端口——端口连通并不代表应用真的能处理请求。start-period 提供启动宽限,适合初始化较慢的服务。

基本信息

参数--interval 间隔、--timeout 超时、--start-period 启动宽限、--retries 连续失败阈值
退出码0 健康;1 不健康;2 为保留值不推荐使用
禁用方式docker run --no-healthcheck;子镜像可用 NONE 覆盖
查看结果docker inspect 的 State.Health 含最近几次探测的输出与时间
启动宽限start-period 内的失败不计入 retries,适配慢启动应用

典型使用场景

  • 慢启动应用(如 JVM 服务)配合启动宽限,避免初始化阶段被判定不健康
  • 编排需要基于就绪状态决定何时接入流量,避免请求打到还没准备好的实例
  • 多实例部署时区分『进程活着』与『服务真的可用』两种状态
  • 服务需要内部组件初始化完成才可服务,用自检命令反映真实就绪程度
  • 把健康状态接入监控与告警,让不健康从隐性问题变成可见信号

HTTP 自检示例

HTTP 自检示例
HEALTHCHECK --interval=30s --timeout=5s --start-period=20s --retries=3 CMD curl -fsS http://127.0.0.1:8080/healthz || exit 1

查看探测结果

查看探测结果
docker inspect -f '{{json .State.Health}}' myapp   # 最近探测结果与输出
docker ps --format '{{.Names}} {{.Status}}'   # 状态列会显示 healthy / unhealthy
# 探测输出会保留若干次,报错信息是定位健康检查失败原因的第一手材料

探测方式对比

探测方式实现手段局限
端口连通检查端口是否可连接进程存活但业务异常时仍显示健康
HTTP 接口访问自带的探活接口并检查状态码镜像内需存在 curl 或 wget 等工具
进程存活按进程名检查是否存在无法反映依赖状态与内部错误
应用自检命令调用自带命令检查内部状态要求应用提供此类命令
distroless 与 scratch 镜像里没有 shell 也没有 curl:健康检查要么调用镜像内已有的二进制,要么改写成 exec 形式,否则容器会一直处于不健康状态。
退出码只有 0 与 1 具有明确含义,2 属于保留值:自检脚本应统一用 0 表示健康、1 表示异常,其他取值的行为不明确,排查时容易产生困惑。

易错点

  • 不设置启动宽限:慢启动应用在初始化阶段就被判定不健康,甚至被编排反复重启
  • 检查命令依赖外部依赖(例如数据库连通性):依赖抖动时会误判本服务不健康,把故障放大
  • 精简镜像里缺少探测所需工具,健康检查永远失败,误以为是服务本身有问题
  • 探测命令写得过重(如每次全量查询),探测本身变成额外负载来源

数据来源与参考

  • Docker Docs:Dockerfile reference(HEALTHCHECK)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌