基础概念

Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过 YAML 文件配置应用程序的服务,然后使用单个命令创建并启动所有服务。

核心标签解析

1. version 标签(可省略)

作用:指定 Compose 文件格式版本

规则

  • 必须放在文件开头

  • 不同版本支持不同功能

  • 常用版本有 "2.4", "3.8" 等

示例

version: "3.8"

2. services 标签

作用:定义要运行的所有服务容器

规则

  • 每个服务对应一个容器

  • 服务名称不能包含下划线(_)

  • 可以定义多个服务

示例

services:
  webapp:
    image: nginx:latest
  database:
    image: postgres:13

3. image 标签

作用:指定服务使用的镜像

规则

  • 可以使用 Docker Hub 官方镜像

  • 可以指定版本标签(如 :latest, :alpine)

  • 如果本地不存在会自动拉取

示例

services:
  redis:
    image: redis:6.2-alpine

4. build 标签

作用:通过 Dockerfile 构建镜像

规则

  • 需要指定 context (构建上下文路径)

  • 可以指定 Dockerfile 文件名

  • 可以使用 args 传递构建参数

示例

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile.dev
      args:
        NODE_ENV: development

5. ports 标签

作用:映射容器端口到主机端口

规则

  • 格式:主机端口:容器端口

  • 可以只指定容器端口(随机分配主机端口)

  • 支持指定协议(tcp/udp)

示例

services:
  web:
    ports:
      - "80:80"         # 主机80映射到容器80
      - "443:443/tcp"   # 指定TCP协议
      - "8080"          # 随机主机端口

6. volumes 标签

作用:配置数据卷挂载

规则

  • 支持三种格式:

    • 主机路径:容器路径

    • 命名卷:容器路径

    • 仅容器路径(匿名卷)

  • 可以设置读写权限(ro/rw)

示例

services:
  db:
    volumes:
      - /data/mysql:/var/lib/mysql   # 主机路径
      - db_data:/var/lib/postgresql  # 命名卷
      - /config                      # 匿名卷
volumes:
  db_data:

7. environment 标签

作用:设置环境变量

规则

  • 可以使用键值对形式

  • 可以使用环境变量文件(.env)

  • 变量会传递给容器内部

示例

services:
  app:
    environment:
      - NODE_ENV=production
      - DB_HOST=db
    env_file:
      - .env

8. depends_on 标签

作用:定义服务启动依赖关系

规则

  • 确保依赖服务先启动

  • 不等待依赖服务"就绪"

  • 可以定义多个依赖服务

示例

services:
  web:
    depends_on:
      - db
      - redis

9. networks 标签

作用:配置容器网络

规则

  • 可以加入自定义网络

  • 可以设置IP地址

  • 支持网络别名

示例

services:
  app:
    networks:
      - frontend
      - backend

networks:
  frontend:
  backend:

完整示例

version: "3.8"

services:
  web:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./html:/usr/share/nginx/html
    depends_on:
      - app

  app:
    build: .
    environment:
      - NODE_ENV=production
    networks:
      - app-network

  db:
    image: postgres:13
    volumes:
      - db_data:/var/lib/postgresql/data
    environment:
      - POSTGRES_PASSWORD=secret

volumes:
  db_data:

networks:
  app-network:
    driver: bridge

使用建议

  1. 从简单配置开始,逐步添加功能

  2. 使用有意义的服务名称

  3. 合理规划网络和数据卷

  4. 充分利用环境变量配置

  5. 注意版本兼容性

通过掌握这些核心标签,您已经能够配置大多数常见的多容器应用场景了。