Docker Compose 多容器编排指南:服务定义、网络与开发环境

详解 Docker Compose 的完整用法:docker-compose.yml 语法、服务依赖、网络通信、Volume 持久化、环境变量管理、开发/生产多环境配置。含前后端 + 数据库 + Redis 的全栈示例。

Docker Compose 是 Docker 官方的单机多容器编排工具,通过一个 docker-compose.yml 文件定义整个应用栈(前端 + 后端 + 数据库 + 缓存等),一条命令启动全部服务。它是开发环境和中小规模部署的首选方案。


一、核心概念

1.1 三个核心文件

文件用途
docker-compose.yml主配置文件,定义服务、网络、Volume
.env环境变量文件,Compose 自动读取
Dockerfile单个服务的镜像构建定义(可选,可用现成镜像)

1.2 docker-compose.yml 结构

version: '3.8'

services:      # 定义各个服务(容器)
  web:
    build: ./web          # 或 image: nginx
    ports:
      - "3000:3000"
    depends_on:
      - db
      - redis

  db:
    image: postgres:15
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}

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

volumes:       # 命名卷定义
  postgres_data:
  redis_data:

networks:      # 自定义网络(可选,Compose 自动创建默认网络)
  default:
    driver: bridge

二、常用命令

docker-compose up -d          # 后台启动所有服务
docker-compose up --build     # 强制重新构建镜像
docker-compose down           # 停止并删除容器和网络
docker-compose down -v        # 同时删除 Volume
docker-compose ps             # 查看运行状态
docker-compose logs -f web    # 实时查看 web 服务日志
docker-compose exec db psql -U postgres  # 进入容器执行命令
docker-compose restart        # 重启所有服务
docker-compose config         # 验证并显示完整配置

三、全栈示例:Next.js + Postgres + Redis

# docker-compose.yml
version: '3.8'

services:
  # Next.js 前端应用
  app:
    build:
      context: ./app
      dockerfile: Dockerfile
    ports:
      - "3000:3000"
    environment:
      DATABASE_URL: postgres://postgres:${DB_PASSWORD}@db:5432/myapp
      REDIS_URL: redis://redis:6379
    depends_on:
      - db
      - redis
    volumes:
      - ./app:/app          # 开发模式:代码热重载
      - /app/node_modules   # 排除 node_modules(容器内版本)

  # PostgreSQL 数据库
  db:
    image: postgres:15-alpine
    ports:
      - "5432:5432"
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_DB: myapp

  # Redis 缓存
  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"
    volumes:
      - redis_data:/data

volumes:
  postgres_data:
  redis_data:
# 启动
cp .env.example .env        # 创建环境变量文件
docker-compose up -d

# 执行数据库迁移
docker-compose exec app npx prisma migrate deploy

# 查看日志
docker-compose logs -f app

四、多环境配置

# docker-compose.yml(基础配置)
version: '3.8'
services:
  app:
    build: ./app
    ports:
      - "3000:3000"
    environment:
      NODE_ENV: ${NODE_ENV}

# docker-compose.override.yml(开发环境,自动加载)
version: '3.8'
services:
  app:
    volumes:
      - ./app:/app
    environment:
      DEBUG: "true"

# docker-compose.prod.yml(生产环境)
version: '3.8'
services:
  app:
    restart: always
    deploy:
      replicas: 2
# 开发(自动加载 override)
docker-compose up -d

# 生产
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d

五、健康检查与依赖

services:
  db:
    image: postgres:15
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s
      timeout: 5s
      retries: 5
    # app 会等待 db healthy 后才启动(需配置条件)

  app:
    build: ./app
    depends_on:
      db:
        condition: service_healthy

相关阅读

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「saas」更多文章