Docker 容器健康检查(HEALTHCHECK)实战:让编排系统及时发现假活

举报
yd_263188715 发表于 2026/10/27 08:55:53 2026/10/27
【摘要】 很多服务进程还在、端口也开着,业务其实已经卡死。没有健康检查时,编排或负载均衡会一直把流量打到「假活」实例上。Docker 原生 HEALTHCHECK 能把这种状态暴露出来。 1. 在 Dockerfile 里声明FROM nginx:1.25-alpineCOPY conf/nginx.conf /etc/nginx/nginx.confHEALTHCHECK --interval=30...

很多服务进程还在、端口也开着,业务其实已经卡死。没有健康检查时,编排或负载均衡会一直把流量打到「假活」实例上。Docker 原生 HEALTHCHECK 能把这种状态暴露出来。

1. 在 Dockerfile 里声明

FROM nginx:1.25-alpine
COPY conf/nginx.conf /etc/nginx/nginx.conf
HEALTHCHECK --interval=30s --timeout=3s --start-period=10s --retries=3 \
  CMD wget -qO- http://127.0.0.1/healthz || exit 1

含义简要说明:

  • interval:检查间隔
  • timeout:单次检查超时
  • start-period:启动宽限期,期间失败不计入 retries
  • retries:连续失败几次才标为 unhealthy

2. 运行时覆盖

不改镜像也能加:

docker run -d --name web \
  --health-cmd='curl -fsS http://127.0.0.1:8080/ready || exit 1' \
  --health-interval=20s \
  --health-retries=3 \
  myapp:latest

3. 查看状态

docker ps
docker inspect --format='{{json .State.Health}}' web | jq .

状态一般是 starting → healthy / unhealthy。编排(Swarm、K8s 的 readiness/liveness 思路类似)可据此摘除实例。

4. 常见坑

  • 健康检查命令依赖的工具镜像里没有(如没有 curl),要改用 wget 或装最小客户端。
  • 检查地址写了 localhost 但应用只绑了容器外网卡,或反过来。
  • 检查过重(打真实业务接口、写库),会放大负载;优先用轻量 /healthz / /ready。
  • start-period 太短,冷启动慢的 JVM 服务会反复被判失败。

小结

先给应用提供廉价、稳定的健康接口,再在镜像或 docker run 上挂上 HEALTHCHECK。这样假活能被及时发现,排障时 docker inspect 的 Health 日志也比只看进程是否存在靠谱得多。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。