Skip to content

04 - Docker Compose 多容器编排

什么是 Docker Compose?

当应用由多个容器组成时(Web + DB + Cache),手动一个个 docker run 太麻烦。 Docker Compose 用一个 YAML 文件定义和管理多容器应用。


docker-compose.yml 结构

yaml
# 版本声明(新版 Docker Compose 可以省略)
services:
  # 服务名称
  web:
    build: ./web                    # 从 Dockerfile 构建
    ports:
      - "8080:80"                   # 端口映射
    environment:                    # 环境变量
      - DB_HOST=db
    depends_on:                     # 依赖关系
      - db
      - redis
    volumes:
      - ./web/src:/app/src          # Bind mount(开发用)
    restart: unless-stopped         # 重启策略

  db:
    image: postgres:16-alpine       # 使用现有镜像
    environment:
      POSTGRES_DB: myapp
      POSTGRES_USER: user
      POSTGRES_PASSWORD: secret
    volumes:
      - db-data:/var/lib/postgresql/data  # 命名卷
    ports:
      - "5432:5432"

  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"

# 声明命名卷
volumes:
  db-data:

# 声明自定义网络(可选,Compose 默认创建一个)
networks:
  app-net:

Compose 常用命令

bash
# 启动所有服务(前台)
docker compose up

# 后台启动
docker compose up -d

# 只启动指定服务
docker compose up -d db redis

# 构建/重新构建镜像
docker compose build
docker compose up -d --build    # 构建并启动

# 查看运行状态
docker compose ps

# 查看日志
docker compose logs
docker compose logs -f web      # 跟踪指定服务

# 执行命令
docker compose exec web sh

# 停止服务
docker compose stop

# 停止并移除容器、网络
docker compose down

# 停止并移除容器、网络、卷(数据也会删除!)
docker compose down -v

# 水平扩展
docker compose up -d --scale web=3

实操项目:Flask + PostgreSQL + Redis

项目结构

compose-projects/flask-app/
├── docker-compose.yml
├── web/
│   ├── Dockerfile
│   ├── app.py
│   └── requirements.txt
└── README.md

docker-compose.yml

yaml
services:
  web:
    build: ./web
    ports:
      - "5000:5000"
    environment:
      - DATABASE_URL=postgresql://user:secret@db:5432/myapp
      - REDIS_URL=redis://redis:6379/0
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_started
    volumes:
      - ./web:/app
    restart: unless-stopped

  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_DB: myapp
      POSTGRES_USER: user
      POSTGRES_PASSWORD: secret
    volumes:
      - db-data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U user -d myapp"]
      interval: 5s
      timeout: 5s
      retries: 5

  redis:
    image: redis:7-alpine
    volumes:
      - redis-data:/data

volumes:
  db-data:
  redis-data:

关键知识点

  1. 服务发现:Compose 自动创建网络,服务名即主机名(db, redis
  2. depends_on + healthcheck:确保依赖服务就绪后才启动
  3. 数据持久化:命名卷保证数据不丢失
  4. 开发热更新:Bind mount 挂载源码,修改即生效

环境变量管理

bash
# 方式1:直接在 yml 中写
environment:
  - DB_HOST=db

# 方式2:使用 .env 文件
# .env
DB_HOST=db
DB_PORT=5432

# docker-compose.yml
environment:
  - DB_HOST=${DB_HOST}
  - DB_PORT=${DB_PORT}

# 方式3:env_file 指向环境文件
env_file:
  - .env
  - .env.local

重启策略

策略说明
no不自动重启(默认)
always总是重启
on-failure非零退出码时重启
unless-stopped除非手动停止,否则重启

Compose 到 K8s 的过渡

Docker Compose 是单机编排工具,适合开发和简单部署。 Kubernetes 是集群编排系统,适合生产环境。

特性Docker ComposeKubernetes
规模单机集群
自动修复重启策略完整的自愈能力
扩缩容手动 scale自动 HPA
滚动更新不支持原生支持
服务发现容器名 DNSService + DNS
负载均衡Service 内置
配置管理env 文件ConfigMap/Secret

学完 Docker Compose,你就为理解 K8s 打好了基础——很多概念是一脉相承的。


下一步

Phase 3 - K8s 架构