文章目录
- **功能概述**
- **核心参数详解**
- **配置示例**
-
- [**1. 基础用法**](#1. 基础用法)
- [**2. 使用数据库健康检查**](#2. 使用数据库健康检查)
- [**3. 结合 `depends_on` 控制启动顺序**](#3. 结合
depends_on
控制启动顺序)
- **高级用法**
-
- [**1. 自定义健康检查脚本**](#1. 自定义健康检查脚本)
- [**2. 多种健康检查类型**](#2. 多种健康检查类型)
-
- [- **HTTP 检查**:](#- HTTP 检查:)
- [- **TCP 端口检查**:](#- TCP 端口检查:)
- [- **Redis 检查**:](#- Redis 检查:)
- **健康状态生命周期**
-
- [1. **初始状态**:容器启动后状态为 `starting`。](#1. 初始状态:容器启动后状态为
starting
。) - [2. **健康检查成功**:状态变为 `healthy`。](#2. 健康检查成功:状态变为
healthy
。) - [3. **连续失败次数达到 `retries`**:状态变为 `unhealthy`。](#3. 连续失败次数达到
retries
:状态变为unhealthy
。) - [4. **健康检查恢复成功**:状态重新变为 `healthy`。](#4. 健康检查恢复成功:状态重新变为
healthy
。)
- [1. **初始状态**:容器启动后状态为 `starting`。](#1. 初始状态:容器启动后状态为
- **常见问题与解决方案**
-
- [1. **容器状态为 `Up` 但服务不可用**:](#1. 容器状态为
Up
但服务不可用:) - [2. **健康检查脚本依赖外部工具(如 `curl`)**:](#2. 健康检查脚本依赖外部工具(如
curl
):) - [3. **健康检查频繁失败导致服务重启**:](#3. 健康检查频繁失败导致服务重启:)
- [1. **容器状态为 `Up` 但服务不可用**:](#1. 容器状态为
- **总结**
功能概述
healthcheck
是 Docker 提供的一项功能,用于监控容器中服务的实际健康状态 ,而不仅仅是判断容器进程是否在运行。通过定义健康检查规则,Docker 会周期性地执行指定命令或脚本,根据返回结果判断容器是否处于 healthy
(健康)或 unhealthy
(不健康)状态。此功能在以下场景中尤为重要:
- 服务依赖管理:确保依赖的服务(如数据库、Redis 等)完全就绪后再启动其他服务。
- 故障检测与恢复:及时发现服务异常并触发重启或告警。
- 自动化部署:在容器化应用中实现更可靠的启动流程。
核心参数详解
在 docker-compose.yml
文件中,healthcheck
的配置通常包含以下参数:
参数名 | 说明 | 示例 |
---|---|---|
test |
健康检查命令或脚本,返回值为 0 表示健康,非 0 表示不健康。支持 Shell 命令或数组格式。 |
`test: ["CMD-SHELL", "curl -sS http://localhost:80 |
interval |
健康检查的间隔时间(默认 30s )。 |
interval: 10s |
timeout |
单次检查的超时时间(默认 30s )。超时后视为检查失败。 |
timeout: 5s |
retries |
连续失败多少次后标记容器为 unhealthy (默认 3 )。 |
retries: 5 |
start_period |
容器启动后等待多久才开始首次检查(默认 0s )。适用于需要较长初始化时间的服务。 |
start_period: 20s |
配置示例
1. 基础用法
yaml
version: '3.7'
services:
web-app:
image: my-web-app:latest
healthcheck:
test: ["CMD-SHELL", "curl -sS http://localhost:80 || exit 1"]
interval: 10s
timeout: 5s
retries: 3
- 说明 :每 10 秒检查一次 Web 服务是否在
localhost:80
上响应成功(HTTP 200)。 - 条件 :如果连续 3 次检查失败,容器状态变为
unhealthy
。
2. 使用数据库健康检查
yaml
version: '3.7'
services:
postgres-database:
image: postgres:latest
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
healthcheck:
test: ["CMD-SHELL", "pg_isready -U user -d postgres"]
interval: 10s
timeout: 5s
retries: 5
- 说明 :使用 PostgreSQL 自带的
pg_isready
工具检查数据库是否可连接。 - 依赖服务 :其他服务可通过
depends_on
的condition: service_healthy
依赖此服务。
3. 结合 depends_on
控制启动顺序
yaml
version: '3.7'
services:
postgres-database:
image: postgres:latest
healthcheck:
test: ["CMD-SHELL", "pg_isready -U user -d postgres"]
interval: 10s
timeout: 5s
retries: 5
app:
image: my-app:latest
depends_on:
postgres-database:
condition: service_healthy
- 说明 :
depends_on
的condition: service_healthy
确保app
服务仅在postgres-database
健康后启动。- 需要 Docker Compose 版本
3.2
或更高。
高级用法
1. 自定义健康检查脚本
将健康检查逻辑封装到脚本中,例如 healthcheck.sh
:
bash
#!/bin/bash
# healthcheck.sh
curl -sS http://localhost:80 || exit 1
在 Dockerfile
中复制并配置:
dockerfile
COPY healthcheck.sh /healthcheck.sh
RUN chmod +x /healthcheck.sh
HEALTHCHECK --interval=5s --timeout=3s CMD /healthcheck.sh
2. 多种健康检查类型
- HTTP 检查:
yaml
test: ["CMD-SHELL", "curl -f http://localhost:80/health || exit 1"]
- TCP 端口检查:
yaml
test: ["CMD", "nc", "-z", "localhost", "6379"]
- Redis 检查:
yaml
test: ["CMD-SHELL", "redis-cli ping | grep -q PONG"]
健康状态生命周期
1. 初始状态 :容器启动后状态为 starting
。
2. 健康检查成功 :状态变为 healthy
。
3. 连续失败次数达到 retries
:状态变为 unhealthy
。
4. 健康检查恢复成功 :状态重新变为 healthy
。
常见问题与解决方案
1. 容器状态为 Up
但服务不可用:
- 原因:Docker 默认仅检查容器进程是否运行,不验证服务是否可用。
- 解决方案 :添加
healthcheck
配置,从应用层面验证服务状态。
2. 健康检查脚本依赖外部工具(如 curl
):
- 解决方法 :
- 在 Dockerfile 中安装依赖工具(如
apt-get install curl
)。 - 使用轻量级替代方案(如
wget
或nc
)。
- 在 Dockerfile 中安装依赖工具(如
3. 健康检查频繁失败导致服务重启:
- 优化建议 :
- 增加
interval
和retries
参数值。 - 调整
start_period
以适应服务初始化时间。
- 增加
总结
通过 healthcheck
功能,可以显著提升容器化应用的可靠性和自动化能力。合理配置健康检查规则,能够有效解决服务依赖和启动顺序问题,避免因依赖服务未就绪导致的系统故障。结合 depends_on
的 condition: service_healthy
,可以构建更健壮的微服务架构。