Docker Compose 语法与使用指南

一、Docker Compose 简介

Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过 docker-compose.yml 配置文件,你可以声明应用程序的服务、网络和卷,然后使用一个命令启动并管理整个应用栈,极大提高了开发、测试和部署效率。

二、核心语法

  1. 配置文件结构
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Docker Compose 的配置文件(docker-compose.yml)采用 YAML 格式,核心结构由 version、services、networks、volumes 四部分组成:
    version: '3' # 版本号,推荐使用3.x,兼容大多数场景
    services: # 定义服务(容器)
    web:
    image: nginx:latest # 镜像名称
    ports:
    - "80:80" # 端口映射
    volumes:
    -./html:/usr/share/nginx/html # 卷挂载
    networks: # 定义网络
    my-network:
    driver: bridge # 网络驱动
    volumes: # 定义卷
    my-volume:
    driver: local # 卷驱动
  2. services 配置详解
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    image:指定容器使用的镜像(支持仓库名、标签或完整镜像地址)。
    build:指定构建镜像的上下文路径或 Dockerfile 路径(适用于自定义镜像)。
    app:
    build:
    context:.
    dockerfile: Dockerfile.development

    ports:定义容器端口与宿主机端口的映射,支持 宿主机端口:容器端口 格式。
    volumes:配置数据卷挂载,支持本地路径挂载或命名卷挂载。
    本地路径挂载:./data:/app/data
    命名卷挂载:my-volume:/app/data
    environment:设置容器环境变量,可以是键值对或从文件加载。
    db:
    environment:
    - MYSQL_ROOT_PASSWORD=secret
    - MYSQL_DATABASE=test

    depends_on:定义服务间的依赖关系,确保容器按顺序启动(但不保证服务完全就绪)。
    web:
    depends_on:
    - db
  3. networks 与 volumes
    networks:自定义网络,容器可通过服务名称直接通信(例如 web 容器可通过 db 访问 db 服务)。
    volumes:定义命名卷,便于跨服务共享数据,或实现数据持久化。

三、常用命令

命令
说明
docker-compose up
启动所有服务,默认前台运行;加 -d 参数则后台运行。
docker-compose down
停止并删除容器、网络和卷(默认不删除命名卷)。
docker-compose start/stop
启动 / 停止指定服务。
docker-compose ps
查看当前运行的容器。
docker-compose exec
在运行的容器中执行命令(例如 docker-compose exec web bash)。
docker-compose logs
查看服务日志。

四、使用示例

  1. 部署 WordPress + MySQL 应用
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    version: '3'
    services:
    wordpress:
    image: wordpress:latest
    ports:
    - "8080:80"
    environment:
    - WORDPRESS_DB_HOST=db
    - WORDPRESS_DB_USER=root
    - WORDPRESS_DB_PASSWORD=secret
    depends_on:
    - db
    db:
    image: mysql:latest
    environment:
    - MYSQL_ROOT_PASSWORD=secret
    - MYSQL_DATABASE=wordpress
    volumes:
    - db_data:/var/lib/mysql
    volumes:
    db_data:
    执行 docker-compose up -d 后,即可通过 http://localhost:8080 访问 WordPress 站点。
  2. 开发环境多服务协作
    假设项目包含后端(Node.js)、前端(React)和数据库(PostgreSQL):
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    version: '3'
    services:
    backend:
    build:./backend
    ports:
    - "3000:3000"
    volumes:
    -./backend:/app
    environment:
    - DATABASE_URL=postgresql://user:password@db/mydb
    depends_on:
    - db
    frontend:
    build:./frontend
    ports:
    - "5000:3000"
    volumes:
    -./frontend:/app
    depends_on:
    - backend
    db:
    image: postgres:latest
    environment:
    - POSTGRES_USER=user
    - POSTGRES_PASSWORD=password
    - POSTGRES_DB=mydb
    volumes:
    - pg_data:/var/lib/postgresql/data
    volumes:
    pg_data:
    开发时,修改代码后容器会自动重新加载,无需手动重启。

五、注意事项

版本兼容性:确保 Docker Compose 版本与 Docker 引擎版本匹配,避免配置不兼容问题。
网络通信:使用自定义网络时,容器间通过服务名称解析 IP,无需手动配置 IP 地址。
数据持久化:命名卷可确保容器删除后数据不丢失,适合生产环境。
资源限制:通过 deploy.resources 配置(适用于 Swarm 模式)或 –cpus、–memory 参数限制容器资源使用。