docker compose常用操作
安装
配置apt仓库
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
安装docker-compose
sudo apt-get install docker-ce docker-compose-plugin
健康检查与服务依赖
在 docker-compose
配置中,当涉及多个服务之间的依赖关系(例如:Web 服务依赖数据库)时,简单的 depends_on
无法保证服务在依赖的服务“准备就绪”之后再启动。为此,我们通常配合 healthcheck
机制,确保依赖服务处于健康状态后,再启动目标服务。
🔍 基本概念
depends_on
(服务依赖)
depends_on
可以指定服务之间的启动顺序,但它默认只关心容器是否已启动(已运行),并不检测容器内部服务是否真正可用。
healthcheck
(健康检查)
healthcheck
则提供了一种机制,周期性执行某个命令来判断容器内的服务是否“健康”。当检查多次成功后,该服务被标记为 healthy
。
配合使用 depends_on.<service>.condition: service_healthy
,可以实现如下控制逻辑:
只有当依赖服务处于 healthy 状态时,当前服务才会开始启动。
🧱 示例结构
services:
serviceA:
...
depends_on:
serviceB:
condition: service_healthy
serviceB:
...
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:xxxx/health"]
interval: 30s
timeout: 5s
retries: 5
⚠️ 注意事项
✅ depends_on.condition
的生效条件
depends_on.condition
语法仅在 Compose v2(Docker Compose CLI v2.1+) 中支持。必须使用
docker compose
命令(注意中间无连字符)运行,docker-compose
命令将忽略该配置。
✅ healthcheck.test
的命令格式与判断原理
Docker 的健康检查机制基于 返回码判断命令执行是否成功。你可以指定的命令类型包括:
返回值为 0(即退出码为 0)表示健康;
任何非零退出码都将视为不健康,触发 retry 或标记 unhealthy。
例如:
healthcheck:
test: ["CMD", "pg_isready", "-U", "postgres"]
✅ 不同场景下的常用健康检查命令(附原理)
💡 说明:
curl -f
(或--fail
)在收到 HTTP 4xx/5xx 响应时会返回非零状态码;加上
-L
可自动跟随 HTTP 3xx 重定向,避免因中间跳转导致误判;所以
-fL
是更通用、更健壮的 HTTP 健康检查写法。
✅ 启动宽容期(start_period
)
start_period
提供服务启动初期的“观察期”,即便 healthcheck 失败也不视为异常;常用于数据库或 JVM 应用等启动较慢的场景,防止误判;
示例:
healthcheck:
...
start_period: 30s
🧭
推荐用法
使用健康检查配合 depends_on.condition: service_healthy
,可以显著提升服务启动的可靠性,尤其在以下场景中:
后端服务依赖数据库或缓存;
多个微服务之间存在严格的调用顺序;
初始化耗时较长的服务(例如包含迁移、索引构建等逻辑)。