Docker Compose 语法与使用指南

Administrator 0 阅读

一、Docker Compose 简介

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

二、核心语法

  1. 配置文件结构

    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 配置详解

    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 应用

    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):

    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 参数限制容器资源使用。