Docker容器健康检查需显式配置HEALTHCHECK指令或运行时参数,包含--interval、--timeout、--retries、--start-period四个必需参数,并结合服务真实状态选择探测方式,通过docker inspect命令验证状态。

Docker 容器健康检查机制不是开箱即用的,必须显式配置才能生效。它不依赖进程是否存活,而是通过主动探测来判断应用是否真正可服务——比如 Web 服务能返回 200、数据库能执行简单查询、消息队列能连通等。
健康检查的核心参数要配全
健康检查靠 HEALTHCHECK 指令或运行时参数驱动,四个关键参数缺一不可:
-
--interval:两次检查间隔(如30s),太短会增加负载,太长会导致故障发现延迟 -
--timeout:单次检查最长等待时间(如5s),超时即判失败,避免卡住检测流程 -
--retries:连续失败多少次才标记为unhealthy(如3),防止偶发网络抖动误判 -
--start-period:容器启动后宽限期(如30s),此期间失败不计入重试,留给应用冷启动时间
⚠️ 注意:
--start-period很容易被忽略,但对 Java、Node.js 等启动慢的服务至关重要,否则刚启就因未就绪被标为 unhealthy。
检查方式选对才有效
别只用 curl -f http://localhost/ 这种通用命令,得匹配服务真实状态:
- Web API:调用
/health或/readyz接口,确保返回200且响应体含"status":"up" - 数据库容器:用
mysql -h127.0.0.1 -uroot -p$MYSQL_ROOT_PASSWORD -e "SELECT 1"或pg_isready -U postgres - Redis:执行
redis-cli -h 127.0.0.1 PING,成功返回PONG - 自定义逻辑:写 shell 脚本(如检查端口监听 + 关键进程 + 磁盘空间),再通过
CMD ["sh", "/check.sh"]调用
Dockerfile 和 docker-compose 两种配置方式
在 Dockerfile 中(推荐,镜像级固化):
FROM nginx:alpine HEALTHCHECK --interval=10s --timeout=3s --start-period=40s --retries=3 \ CMD curl -f http://localhost/health || exit 1
在 docker-compose.yml 中(适合临时调试或环境差异化):
services:
web:
image: my-web-app
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
interval: 15s
timeout: 5s
start_period: 60s
retries: 3配了之后怎么验证
启动容器后,用这条命令实时看状态:
docker inspect --format='{{.State.Health.Status}}' container_name输出可能是 starting(刚启)、healthy(正常)、unhealthy(已失败)。
再加一句看详情:
docker inspect --format='{{json .State.Health}}' container_name能查到最近一次检查时间、退出码、输出日志,方便定位为什么失败。
不复杂但容易忽略


















