docker容器健康检查验证应用是否真实响应请求而非仅进程存活,通过healthcheck指令或docker-compose.yml配置curl等轻量命令检测业务状态,需设置合理间隔、超时、启动期和重试次数。
docker 容器健康检查不是看进程有没有在跑,而是验证应用是否真能响应请求。配置得当,就能及时发现“容器活着但服务挂了”这类假死问题。
在 Dockerfile 中定义 HEALTHCHECK(推荐)
这是最稳定、可复用的方式,把检查逻辑固化进镜像:HEALTHCHECK --interval=20s --timeout=5s --start-period=40s --retries=3 \ CMD curl -f http://localhost:8080/health || exit 1
-
--interval=20s:每 20 秒执行一次检查 -
--timeout=5s:命令超过 5 秒没返回就判失败 -
--start-period=40s:容器启动后前 40 秒内失败不计入重试(给慢启动留时间) -
--retries=3:连续失败 3 次才标为unhealthy -
CMD后的命令必须返回退出码0才算健康;非 0(比如curl遇到 4xx/5xx、连接拒绝、超时)即失败
注意:一个 Dockerfile 只生效最后一个 HEALTHCHECK 指令。
在 docker-compose.yml 中覆盖或补充
适合多服务编排,可覆盖镜像中已有的健康检查:services:
api:
image: my-api:latest
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
interval: 15s
timeout: 4s
start_period: 30s
retries: 3
-
test推荐用数组格式["CMD", ...],避免 shell 解析歧义 -
start_period和retries必须是整数,不能带单位(如30s错,30对)
选对检查命令,别只测端口
健康检查要反映真实业务状态,不能只用 `nc -z localhost 8080` 这类纯连通性测试:- Web 应用:
curl -f http://localhost:8080/health(需后端提供轻量/health接口,返回 200) - MySQL:
mysqladmin ping -h localhost -u root --password="$MYSQL_ROOT_PASSWORD" || exit 1 - Nginx 默认页可用时:
curl -f http://localhost/ || exit 1 - Node.js/Python 等:确保有对应端口和路径,且命令在容器内可执行(必要时先
apt install curl)
关键原则:命令要轻量、快速、无副作用,不写磁盘、不触发业务逻辑变更。
运行后怎么确认是否生效
容器启动后,用以下命令验证:查看当前状态:
docker inspect --format='{{.State.Health.Status}}' <container-name></container-name>
输出可能是starting、healthy或unhealthy查看完整健康信息(含最近一次输出、失败次数):
docker inspect --format='{{json .State.Health}}' <container-name></container-name>若状态异常,可手动进容器调试:
docker exec -it <container-name> sh -c "curl -f http://localhost:8080/health"</container-name>
不复杂但容易忽略。











