Docker Compose完整指南

多容器编排、网络配置、数据卷管理与生产部署

📅 2026年4月6日 · 阅读约10分钟 · Docker容器化DevOps

Docker Compose是定义和运行多容器Docker应用的工具。通过一个YAML配置文件,你可以同时管理多个服务(Web服务器、数据库、缓存等),一键启动完整的开发或生产环境。对于需要多个服务协作的应用(如Web应用+数据库+Redis),Docker Compose是最高效的管理方式。本指南将帮助你从零掌握Docker Compose的核心用法。

一、Docker Compose核心概念

概念说明
Service(服务)一个容器定义,包含镜像、端口、环境变量等配置
Network(网络)容器间的通信网络,默认创建bridge网络
Volume(卷)数据持久化存储,容器删除后数据不丢失
Project(项目)一组关联的服务,通常对应一个docker-compose.yml

二、快速开始

# 安装Docker Compose V2(作为Docker插件)
# Docker Desktop自带,Linux安装:
sudo apt install docker-compose-plugin

# 验证安装
docker compose version

一个典型的Web应用配置

# docker-compose.yml
version: '3.8'

services:
  # Web应用
  web:
    build: .
    ports:
      - "3000:3000"
    environment:
      - DATABASE_URL=postgresql://user:pass@db:5432/myapp
      - REDIS_URL=redis://cache:6379
    depends_on:
      db:
        condition: service_healthy
      cache:
        condition: service_started
    volumes:
      - .:/app
      - /app/node_modules
    restart: unless-stopped

  # PostgreSQL数据库
  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: pass
      POSTGRES_DB: myapp
    volumes:
      - postgres_data:/var/lib/postgresql/data
    ports:
      - "5432:5432"
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U user -d myapp"]
      interval: 5s
      timeout: 5s
      retries: 5
    restart: unless-stopped

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

volumes:
  postgres_data:
  redis_data:

三、常用命令

# 启动所有服务(后台运行)
docker compose up -d

# 启动并强制重新构建
docker compose up -d --build

# 查看服务状态
docker compose ps

# 查看日志
docker compose logs -f web
docker compose logs --tail=100

# 停止所有服务
docker compose down

# 停止并删除数据卷
docker compose down -v

# 重启单个服务
docker compose restart web

# 进入容器
docker compose exec web sh

# 查看服务配置
docker compose config

四、网络管理

Docker Compose默认为每个项目创建一个bridge网络,同网络内的容器可以通过服务名互相访问。

# 自定义网络
services:
  frontend:
    networks:
      - frontnet
  backend:
    networks:
      - frontnet
      - backnet
  database:
    networks:
      - backnet

networks:
  frontnet:
    driver: bridge
  backnet:
    driver: bridge
    internal: true  # 不允许外部访问
💡 实用技巧:容器之间通信使用服务名作为主机名(如web连接db用hostname "db"),不需要使用IP地址。

五、数据卷管理

# 命名卷(推荐用于数据库)
volumes:
  postgres_data:

# 绑定挂载(适合开发时代码同步)
services:
  web:
    volumes:
      - ./src:/app/src          # 宿主机到容器
      - /app/node_modules       # 匿名卷(防止覆盖)

# 只读挂载
services:
  web:
    volumes:
      - ./config:/app/config:ro

# 查看卷列表
docker volume ls
docker volume inspect project_postgres_data

六、环境变量与配置

# .env文件
DB_USER=admin
DB_PASSWORD=secret123
REDIS_HOST=cache

# docker-compose.yml中引用
services:
  db:
    image: postgres:16
    environment:
      POSTGRES_USER: ${DB_USER}
      POSTGRES_PASSWORD: ${DB_PASSWORD}

# 多环境配置
# docker-compose.override.yml(开发环境)
services:
  web:
    volumes:
      - .:/app

# 使用:docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d

七、生产环境最佳实践

# 生产级配置示例
services:
  web:
    image: myapp:1.2.0
    deploy:
      resources:
        limits:
          cpus: '1.0'
          memory: 512M
        reservations:
          memory: 256M
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"
    restart: unless-stopped

🛠️ 开发者工具

访问 ToolSnap 获取YAML格式化、JSON处理等在线工具,提升开发效率。

常见问题(FAQ)

Docker和Docker Compose有什么区别?

Docker用于管理单个容器(docker run),Docker Compose用于定义和管理多容器应用。通过docker-compose.yml文件声明服务、网络和卷,一条命令启动整个应用栈。

Docker Compose如何管理数据持久化?

通过volumes配置实现。可以使用命名卷由Docker管理存储位置,或绑定挂载将宿主机目录映射到容器内。数据库等需要持久化的服务必须配置volume。

docker compose up和docker-compose up有什么区别?

docker compose是Docker Compose V2(作为Docker CLI插件),docker-compose是V1(独立安装的Python工具)。V2是推荐版本,功能更强且集成度更高。