安装

配置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 的健康检查机制基于 返回码判断命令执行是否成功。你可以指定的命令类型包括:

格式

说明

CMD ["executable", "arg"]

推荐使用的 JSON 数组语法(更稳定)

CMD-SHELL "command string"

使用 shell 执行的字符串命令

  • 返回值为 0(即退出码为 0)表示健康

  • 任何非零退出码都将视为不健康,触发 retry 或标记 unhealthy。

例如:

healthcheck:
  test: ["CMD", "pg_isready", "-U", "postgres"]

✅ 不同场景下的常用健康检查命令(附原理)

场景

推荐命令

判断机制说明

PostgreSQL

["CMD", "pg_isready"]

返回码为 0 表示监听正常,数据库可接收连接

MySQL

["CMD", "mysqladmin", "ping", "-h", "localhost"]

成功连接返回 0,失败则非 0

Redis

["CMD", "redis-cli", "ping"]

若返回 PONG,则退出码为 0

Web 服务

["CMD", "curl", "-fL", "http://localhost:8080/health"]

-fL 会跟随重定向,只有最终响应为 HTTP 2xx 或 3xx 时才返回 0

Spring Boot

["CMD", "curl", "-fL", "http://localhost:8080/actuator/health/readiness"]

推荐使用标准健康检查 endpoint,返回结构化健康状态

💡 说明:

  • 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,可以显著提升服务启动的可靠性,尤其在以下场景中:

  • 后端服务依赖数据库或缓存;

  • 多个微服务之间存在严格的调用顺序;

  • 初始化耗时较长的服务(例如包含迁移、索引构建等逻辑)。