docker

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > 云和虚拟化 > docker > Docker 容器启动优先级与依赖关系

Docker中配置容器启动优先级与依赖关系

作者:冰川箭仙

Docker 中配置容器启动优先级与依赖关系主要通过 depends_on 和 healthcheck 实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

Docker 中配置容器启动优先级与依赖关系主要通过 depends_onhealthcheck 实现。

1. 基础依赖:depends_on

仅控制启动顺序,不等待服务就绪。

version: "3.9"
services:
  web:
    build: .
    depends_on:
      - db        # web 在 db 之后启动
      - redis     # 支持多个依赖
  db:
    image: postgres:15
  redis:
    image: redis:7

⚠️ 关键限制depends_on 只保证容器启动顺序,不等待服务真正可用(如数据库完成初始化)。如果 web 启动时 db 还在初始化,连接会失败。

2. 等待服务就绪:条件依赖(Compose v2.20+ / v3.4+)

通过 condition 实现真正的启动顺序控制。

方案 A:健康检查依赖(推荐)

services:
  web:
    build: .
    depends_on:
      db:
        condition: service_healthy   # 等待 db 健康
      redis:
        condition: service_healthy
  db:
    image: postgres:15
    environment:
      POSTGRES_PASSWORD: secret
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s        # 检查间隔
      timeout: 3s         # 超时时间
      retries: 5          # 重试次数
      start_period: 10s   # 启动宽限期
  redis:
    image: redis:7
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 5s
      timeout: 3s
      retries: 5

方案 B:等待容器退出(用于初始化任务)

services:
  web:
    build: .
    depends_on:
      migration:
        condition: service_completed_successfully  # 等待 migration 正常退出
  migration:
    image: myapp
    command: ["python", "manage.py", "migrate"]

3. 健康检查详解

常用服务的健康检查配置

服务健康检查命令
PostgreSQLpg_isready -U <user> 或 pg_isready -d <dbname>
MySQLmysqladmin ping -h localhost
Redisredis-cli ping(返回 PONG)
MongoDBmongosh --eval 'db.adminCommand("ping")'
Elasticsearchcurl -f http://localhost:9200/_cluster/health
自定义 HTTPcurl -f http://localhost:8080/health

健康检查参数

healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
  interval: 30s      # 检查间隔(默认 30s)
  timeout: 10s       # 单次检查超时(默认 30s)
  retries: 3         # 失败重试次数(默认 3)
  start_period: 40s  # 容器启动后多久开始检查(默认 0s)
  disable: false     # 禁用健康检查

4. 启动优先级控制(Swarm Mode)

Docker Swarm 提供额外的优先级机制:

version: "3.9"
services:
  web:
    image: nginx
    deploy:
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
      update_config:
        parallelism: 1
        delay: 10s
        order: start-first   # 先启动新容器再停止旧容器
      rollback_config:
        order: stop-first    # 先停止旧容器再启动新容器

5. 实战:完整的多层依赖架构

version: "3.9"
services:
  # 最底层:数据库
  postgres:
    image: postgres:15-alpine
    environment:
      POSTGRES_USER: app
      POSTGRES_PASSWORD: secret
      POSTGRES_DB: myapp
    volumes:
      - pg_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U app -d myapp"]
      interval: 5s
      timeout: 3s
      retries: 5
      start_period: 10s
  # 第二层:缓存
  redis:
    image: redis:7-alpine
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 5s
      timeout: 3s
      retries: 5
  # 第三层:消息队列
  rabbitmq:
    image: rabbitmq:3-management-alpine
    healthcheck:
      test: rabbitmq-diagnostics -q ping
      interval: 10s
      timeout: 5s
      retries: 5
  # 第四层:数据库迁移(一次性任务)
  migration:
    build: .
    command: ["python", "manage.py", "migrate"]
    depends_on:
      postgres:
        condition: service_healthy
    profiles: ["setup"]  # 默认不启动,需 docker compose --profile setup up
  # 第五层:后台工作者
  worker:
    build: .
    command: ["celery", "-A", "tasks", "worker", "-l", "info"]
    depends_on:
      postgres:
        condition: service_healthy
      redis:
        condition: service_healthy
      rabbitmq:
        condition: service_healthy
    environment:
      DATABASE_URL: postgresql://app:secret@postgres/myapp
      REDIS_URL: redis://redis:6379
      BROKER_URL: amqp://guest:guest@rabbitmq:5672
  # 最上层:Web 应用
  web:
    build: .
    ports:
      - "8000:8000"
    depends_on:
      postgres:
        condition: service_healthy
      redis:
        condition: service_healthy
      rabbitmq:
        condition: service_healthy
      worker:
        condition: service_started  # 只需 worker 启动即可
    environment:
      DATABASE_URL: postgresql://app:secret@postgres/myapp
      REDIS_URL: redis://redis:6379
volumes:
  pg_data:

6. 验证与调试

# 查看容器健康状态
docker compose ps
# 查看健康检查日志
docker inspect --format='{{.State.Health}}' <container_id>
# 手动测试健康检查命令
docker compose exec postgres pg_isready -U app
# 强制按依赖顺序重建
docker compose up --build --force-recreate

关键要点总结

需求解决方案
仅控制启动顺序depends_on(无条件)
等待服务真正可用depends_on + condition: service_healthy + healthcheck
等待初始化任务完成condition: service_completed_successfully
多层复杂依赖链逐层配置 healthcheck + depends_on
生产环境高可用结合 Docker Swarm 的 deploy 配置

到此这篇关于Docker中配置容器启动优先级与依赖关系的文章就介绍到这了,更多相关Docker 容器启动优先级与依赖关系内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文