Skip to content

5.2 Docker Compose 文件结构

Docker Compose 的核心是 docker-compose.yml 文件,它采用 YAML 格式定义服务、网络和卷。一个基本的 Compose 文件包含以下部分:

  • version:指定 Compose 文件格式版本,例如 '3.8'
  • services:定义各个容器服务,每个服务对应一个容器。
  • networks:配置自定义网络。
  • volumes:声明数据卷。

YAML 文件使用缩进来表示层级关系,冒号表示键值对,连字符表示列表项。

以下是一个典型的 docker-compose.yml 示例,定义了一个 WordPress 的应用配置。

yaml
version: '3.8'

services:
  db:
    image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: wordpress
    networks:
      - backend

  wordpress:
    image: wordpress:latest
    ports:
      - "80:80"
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: root
      WORDPRESS_DB_PASSWORD: password
    depends_on:
      - db
    networks:
      - frontend
      - backend

networks:
  frontend:
  backend:

volumes:
  db_data:

这个 WordPress 的应用配置示例中展示了:

  • 两个服务:MySQL 数据库和 WordPress。
  • 自定义网络:frontend 和 backend。
  • 声明数据卷:数据卷 db_data 持久化数据库。
  • 设置环境变量:设置 MySQL 数据库和 WordPress 相关环境变量。
  • 端口映射:将容器 80 端口映射到主机 80 端口。
  • 服务依赖关系:确保数据库服务先启动。

下面详细说明每个部分的作用和配置方法。

version:指定使用的 Compose 文件格式版本。不同版本支持的功能不同。目前常用的是 3.x 版本。版本号需要用引号包裹。

示例:

yaml
version: '3.8'

版本号影响可用功能。例如 3.8 版本支持更多配置选项。版本号必须与安装的 Docker Compose 版本兼容。如果不指定版本,默认使用最新支持版本。

services:定义需要运行的容器服务,是 Compose 文件的核心部分。每个服务对应一个容器。服务名称自定义,作为容器的标识。

基本服务配置示例:

yaml
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"

常用服务配置项:

  • image:指定使用的镜像名称和标签。可以从 Docker Hub 获取或使用本地构建的镜像。

  • build:如果使用本地 Dockerfile 构建镜像,需要指定构建路径。

    yaml
    build: ./dir
  • ports:设置端口映射,格式为 "主机端口:容器端口"

    yaml
    ports:
      - "8080:80"
  • volumes:配置数据卷挂载,支持主机路径和命名卷。

    yaml
    volumes:
      - /host/path:/container/path
      - named_volume:/container/path
  • environment:设置环境变量,可以用列表或键值对格式。

    yaml
    environment:
      - VAR1=value1
      - VAR2=value2
  • depends_on:定义服务启动顺序,确保依赖服务先启动。

    yaml
    depends_on:
      - db
  • restart:设置容器重启策略,比如 always 表示总是自动重启。

    yaml
    restart: always
  • command:覆盖容器启动命令。

    yaml
    command: ["python", "app.py"]

完整服务示例:

yaml
services:
  web:
    build: .
    ports:
      - "5000:5000"
    volumes:
      - .:/code
    environment:
      FLASK_ENV: development
    depends_on:
      - redis
  redis:
    image: redis:alpine
    volumes:
      - redis_data:/data

networks:定义自定义网络。容器通过网络名称互相通信。默认会创建 bridge 网络。

示例:

yaml
networks:
  frontend:
    driver: bridge
  backend:
    driver: bridge

服务中使用网络:

yaml
services:
  web:
    networks:
      - frontend
  db:
    networks:
      - backend

自定义网络提供更好的隔离性。不同网络的容器默认不能互相访问。

volumes:声明数据卷。数据卷用于持久化存储和容器间共享数据。

示例:

yaml
volumes:
  db_data:
    driver: local
  app_data:
    driver: local

服务中使用卷:

services:
  db:
    volumes:
      - db_data:/var/lib/mysql

卷数据独立于容器生命周期。删除容器不会删除卷数据。