小陈的知识图谱
DockerL3 深入核心重点

Docker Compose 编排

多容器编排、网络模式、数据卷、环境配置

Docker Compose 概述

Docker Compose 用 YAML 文件定义和运行多容器应用,适合开发环境单机编排

Compose 文件结构

version: "3.8"

services:
  app:
    build: .
    ports:
      - "8080:8080"
    depends_on:
      - db
      - redis

  db:
    image: postgres:15-alpine
    environment:
      POSTGRES_DB: myapp
      POSTGRES_PASSWORD: secret
    volumes:
      - pgdata:/var/lib/postgresql/data

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

volumes:
  pgdata:

服务定义

完整示例:Spring Boot + MySQL + Redis

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8080:8080"
    environment:
      SPRING_DATASOURCE_URL: jdbc:mysql://db:3306/myapp
      SPRING_REDIS_HOST: redis
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_started
    restart: unless-stopped

  db:
    image: mysql:8.0
    environment:
      MYSQL_DATABASE: myapp
      MYSQL_ROOT_PASSWORD: rootpass
    volumes:
      - mysql_data:/var/lib/mysql
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 5
    ports:
      - "3306:3306"

  redis:
    image: redis:7-alpine
    volumes:
      - redis_data:/data
    command: redis-server --appendonly yes

depends_on 详解

条件说明
service_started默认,容器启动即可
service_healthy健康检查通过才启动
service_completed_successfully预期任务成功结束

网络模式

默认网络

Compose 自动为项目创建 bridge 网络,所有服务通过服务名互相访问。

┌─────────────────────────────────┐
│    docker-compose 项目网络        │
│                                 │
│  ┌──────┐   ┌──────┐   ┌──────┐ │
│  │ app  │──→│  db  │──→│ redis│ │
│  │:8080 │   │:3306 │   │:6379 │ │
│  └──────┘   └──────┘   └──────┘ │
│                                 │
│  外部访问 app:8080 ← 端口映射     │
└─────────────────────────────────┘

自定义网络

services:
  frontend:
    networks:
      - frontend
      - backend

  api:
    networks:
      - backend
      - db_net

  db:
    networks:
      - db_net

networks:
  frontend:
    driver: bridge
  backend:
    driver: bridge
  db_net:
    driver: bridge

网络模式对比

驱动特性适用场景
bridge默认,NAT 转发单机多容器
host共享宿主机网络性能优先
overlay跨主机通信Swarm 集群
macvlan分配 MAC 地址遗留应用

数据卷

三种存储方式

方式宿主机位置特点
Volume(卷)/var/lib/docker/volumes/Docker 管理,持久化
Bind Mount(绑定挂载)用户指定路径开发热重载
tmpfs内存临时,速度最快

services:
  app:
    volumes:
      # Volume(持久化)
      - app_data:/app/data

      # Bind Mount(开发用)
      - ./src:/app/src

      # tmpfs(临时)
      - type: tmpfs
        target: /app/cache

volumes:
  app_data:

常用场景:开发热重载

services:
  app:
    build: .
    volumes:
      # 源码挂载进去,修改即时生效(需框架支持热重载)
      - ./src:/app/src
      # 排除 node_modules(避免覆盖容器内的)
      - /app/node_modules

环境与配置管理

多环境 Compose

# docker-compose.base.yml(公共配置)
services:
  app:
    build: .
    ports:
      - "8080:8080"

# docker-compose.dev.yml(开发环境)
services:
  app:
    volumes:
      - ./src:/app/src
    environment:
      SPRING_PROFILES_ACTIVE: dev

# docker-compose.prod.yml(生产环境)
services:
  app:
    restart: always
    environment:
      SPRING_PROFILES_ACTIVE: prod

# 使用多个文件叠加
docker compose -f docker-compose.base.yml -f docker-compose.dev.yml up

.env 文件

# .env
DB_HOST=db
DB_PORT=3306
DB_USER=myapp
DB_PASS=${DB_PASSWORD:-defaultpass}

# 在 Compose 文件中引用
services:
  db:
    environment:
      MYSQL_USER: ${DB_USER}
      MYSQL_PASSWORD: ${DB_PASS}

常用 Compose 命令

# 启动所有服务
docker compose up

后台启动

docker compose up -d

构建并启动

docker compose up --build

停止并移除

docker compose down

停止并移除(含数据卷)

docker compose down -v

查看日志

docker compose logs -f app

重启服务

docker compose restart app

扩缩容

docker compose up -d --scale app=3

进入某个容器

docker compose exec app /bin/sh

查看运行状态

docker compose ps

核心要点

  • Compose 文件结构与版本
  • 服务定义与依赖管理
  • 网络模式(bridge/host/overlay)
  • 数据卷与数据持久化
  • 环境变量与配置管理