Docker 支持自定义健康检查(Healthcheck),能主动检测容器内应用是否真的 "健康"(而非仅容器进程运行)。
1. 为容器配置健康检查(两种方式)
方式 1:运行容器时指定健康检查
# 示例:检查Nginx是否正常(通过curl访问80端口)
docker run -d \
--name nginx-test \
--health-cmd "curl -f http://localhost:80 || exit 1" \ # 健康检查命令(失败则退出码1)
--health-interval 30s \ # 检查间隔(每30秒检测一次)
--health-timeout 5s \ # 检查超时时间
--health-retries 3 \ # 连续失败3次标记为不健康
--health-start-period 60s \ # 容器启动后,延迟60秒开始首次检查(适配应用启动耗时)
nginx
方式 2:Dockerfile 中配置健康检查(构建镜像时)
FROM nginx
# 安装curl(基础镜像可能没有)
RUN apt update && apt install -y curl && rm -rf /var/lib/apt/lists/*
# 配置健康检查
HEALTHCHECK --interval=30s --timeout=5s --retries=3 --start-period=60s \
CMD curl -f http://localhost:80 || exit 1
2. 查看容器健康状态
# 方式1:docker ps 直接查看(STATUS列会显示健康状态)
docker ps
# 示例输出(重点看 "healthy" 标识):
# CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# abc123 nginx "/docker-entrypoint...." 5 minutes ago Up 5 minutes (healthy) 80/tcp nginx-test
# 方式2:查看详细健康状态(含检查日志)
docker inspect --format '{{json .State.Health}}' 容器名/容器ID | jq
# 示例输出(解读关键字段):
{
"Status": "healthy", # 健康状态:healthy/starting/unhealthy
"FailingStreak": 0, # 连续失败次数
"Log": [ # 检查日志(可排查失败原因)
{
"Start": "2025-12-15T10:00:00+08:00",
"End": "2025-12-15T10:00:02+08:00",
"ExitCode": 0, # 0=成功,非0=失败
"Output": "<!DOCTYPE html>...(nginx正常响应内容)"
}
]
}