一、Docker Compose 是什么?

Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具,通过一个 YAML 文件(docker-compose.yml)配置所有服务,实现一键启动、停止和管理整个应用栈。

核心功能
  • 多容器编排:管理多个关联容器(如 Web + DB + Cache)。
  • 依赖管理:自动处理服务启动顺序。
  • 隔离环境:每个项目拥有独立的网络和卷。
  • 配置即代码:所有配置版本化,便于协作。

二、核心概念

概念 说明
Service 一个容器化的服务(如 webdb),对应 docker-compose.yml 中的一个配置块。
Project 由一组服务组成的完整应用,默认以所在目录名命名(可通过 -p 指定)。
Network 自动创建专属网络,服务间通过服务名通信(无需 IP)。
Volume 持久化数据存储,可在服务间共享。

三、docker-compose.yml 文件详解

1. 基本结构
version: '3.8'  # 指定 Compose 版本(与 Docker 引擎版本对应)

services:       # 定义所有服务
  web:          # 服务名称
    image: nginx:latest  # 使用现成镜像
    ports:
      - "80:80"
  
  db:
    build: ./db  # 通过 Dockerfile 构建镜像
    environment:
      POSTGRES_PASSWORD: password

volumes:        # 定义数据卷
  db-data:

networks:       # 定义网络(可选)
  app-net:
    driver: bridge
2. 常用配置项
配置项 说明 示例
build 基于 Dockerfile 构建镜像 build: ./dirbuild: context: ./dir dockerfile: Dockerfile.dev
image 直接使用现有镜像 image: redis:alpine
ports 端口映射(宿主机:容器) ports: - "8080:80"
volumes 挂载宿主机目录或命名卷 volumes: - ./data:/app/data
environment 设置环境变量 environment: DEBUG: "1"
depends_on 定义服务依赖(启动顺序) depends_on: - db
networks 指定自定义网络 networks: - app-net
command 覆盖容器默认启动命令 command: python app.py
restart 容器退出时的重启策略 restart: always

四、常用命令

1. 生命周期管理
命令 作用
docker-compose up -d 启动所有服务(后台运行)
docker-compose down 停止并删除所有容器、网络
docker-compose start 启动已存在的服务
docker-compose stop 停止服务(保留容器)
docker-compose restart 重启服务
2. 调试与维护
命令 作用
docker-compose ps 查看运行状态
docker-compose logs -f web 实时查看服务日志
docker-compose exec web bash 进入容器命令行
docker-compose build 重新构建镜像
docker-compose config 验证配置文件语法
3. 扩展操作
命令 作用
docker-compose pull 拉取服务所需镜像
docker-compose scale web=3 扩展服务实例数量(需无状态服务)
docker-compose run --rm web cmd 临时运行一次性命令(如数据库迁移)

五、实战示例:部署 Django + PostgreSQL

1. 项目结构
myapp/
├── django/
│   ├── Dockerfile      # 构建 Django 镜像
│   ├── requirements.txt
│   └── manage.py
├── db/
│   └── init.sql        # 数据库初始化脚本
└── docker-compose.yml
2. docker-compose.yml
version: '3.8'

services:
  web:
    build: ./django
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - ./django:/app
    ports:
      - "8000:8000"
    depends_on:
      - db
    environment:
      - DB_HOST=db
      - DB_NAME=postgres
      - DB_USER=postgres
      - DB_PASSWORD=postgres

  db:
    image: postgres:13
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_DB=postgres

volumes:
  postgres_data:
3. 操作流程
# 启动服务
cd myapp
docker-compose up -d

# 执行数据库迁移
docker-compose exec web python manage.py migrate

# 访问应用
curl http://localhost:8000

六、高级技巧

  1. 环境变量分离
    使用 .env 文件管理敏感配置:

    # .env
    DB_PASSWORD=secret
    
    # docker-compose.yml
    environment:
      - DB_PASSWORD=${DB_PASSWORD}
    
  2. 多环境配置
    通过 -f 指定不同配置文件:

    docker-compose -f docker-compose.prod.yml up
    
  3. 健康检查
    确保服务可用后再启动依赖项:

    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost"]
      interval: 30s
      timeout: 10s
      retries: 3
    

七、常见问题

  1. 容器启动顺序问题
    depends_on 仅控制启动顺序,不保证服务可用性。需结合健康检查或脚本等待依赖服务。

  2. 卷权限问题
    Linux 下可能出现挂载目录权限错误,可通过 :ro(只读)或调整宿主机权限解决。

  3. Compose 版本兼容性
    不同 Docker 引擎版本支持的 Compose 文件版本不同(对照表)。


八、总结

  • 适用场景:开发环境、CI/CD 流水线、单机部署。
  • 优势:简化多容器管理,配置可版本化。
  • 局限性:不适合生产集群(需 Swarm/Kubernetes)。

通过掌握 Docker Compose,你可以高效管理复杂的多服务应用,提升开发和部署效率!

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐