Skip to content

Docker Compose

Docker Compose 是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。它可以管理多个 Docker 容器组成一个应用,只需要编写一个 YAML 格式的配置文件 docker-compose.yml,定义好多个容器之间的调用关系,然后通过简单的命令即可管理这些容器。

简单来说,Docker Compose 就像是一个"后厨团队管理工具",通过一个"菜单文件"(docker-compose.yml)就能一键启动整套服务,而无需手动逐个启动和配置每个容器

Docker Compose 的优势

Docker Compose 提供了多项显著优势:

  • 简化管理:通过一个文件管理所有服务,而不是分别处理每个容器
  • 易于版本控制:YAML 文件可以方便地与代码一起进行版本控制
  • 快速启动与停止:使用简单的命令即可启动或停止所有服务
  • 环境一致性:确保开发、测试和生产环境的一致性
  • 依赖管理:内置服务依赖顺序控制(通过 depends_on)
  • 资源效率:相比传统虚拟机,容器更加轻量级,启动更快

Docker Compose 文件结构

yaml
version: '3.8'
services:
  web:
    container_name: web		# 容器名
    image: nginx:latest  	# 使用最新版 Nginx 镜像
    restart: ralways		# 重启策略
    ports:
      - "80:80"  			# 映射主机的 80 端口到容器的 80 端口
    volumes:
      - ./html:/usr/share/nginx/html  # 挂载本地 html 目录
    networks:
      - webnet  # 连接到自定义网络

networks:
  webnet:  # 自定义网络定义

volumes:
  db_data:  # 定义持久化数据卷

常用服务配置

配置项描述示例
container_name指定容器名称container_name: my-web
restart重启策略restart: unless-stopped
command覆盖默认命令command: ["python", "app.py"]
entrypoint覆盖入口点entrypoint: /app/start.sh
user指定运行用户user: "1000:1000"
working_dir设置工作目录working_dir: /app
labels添加元数据labels: ["com.example.foo=bar"]
security_opt安全选项security_opt: ["no-new-privileges:true"]
read_only只读文件系统read_only: true
tmpfs内存文件系统挂载tmpfs: /run

build 构建

yaml
services:
  webapp:
    build:
      context: ./dir  # Dockerfile 所在目录
      dockerfile: Dockerfile.dev  # 可选,指定 Dockerfile 文件名
      args:
        NODE_ENV: development  # 构建参数
    image: my-webapp:1.0  # 指定构建后的镜像名称和标签
  • context:指定包含 Dockerfile 的目录路径或 git 仓库 URL
  • dockerfile:指定 Dockerfile 文件名
  • args:添加构建参数,这些只能在构建过程中访问的环境变量
  • cache_from:指定缓存解析镜像列表(3.2+)
  • labels:将元数据以标签的形式添加到生成的镜像中(3.3+)
  • network:设置容器网络连接以获取构建过程中的 run 指令(3.4+)
  • shm_size:指定容器的 /dev/shm 分区大小(3.5+)

ports 端口映射

yaml
services:
  web:
    ports:
      - "80:80"           # 主机端口:容器端口
      - "443:443/tcp"     # 指定协议
      - "3000-3005:3000-3005"  # 端口范围
      - "9090"            # 仅暴露容器端口

环境变量

直接指定

yaml
services:
  db:
    environment:
      POSTGRES_USER: admin
      POSTGRES_PASSWORD: secret

使用 .env 文件

.env 文件内容:

ini
DB_USER=admin
DB_PASS=secret

Compose 文件引用:

yaml
services:
  db:
    environment:
      POSTGRES_USER: ${DB_USER}
      POSTGRES_PASSWORD: ${DB_PASS}
    env_file:
      - ./db.env

优先级规则

  1. environment 显式定义
  2. env_file 文件定义
  3. 容器内已有环境变量

volumes 存储卷

yaml
services:
  database:
    volumes:
      - db_data:/var/lib/postgresql/data  # 命名卷
      - ./logs:/app/logs  # 主机路径

volumes:
  db_data:
    driver: local
    driver_opts:
      type: 'none'
      o: 'bind'
      device: './data'
  cache:
    external: true  # 使用外部已存在的卷
    name: app_cache

networks 网络

yaml
services:
  web:
    networks:
      - frontend
  api:
    networks:
      - frontend
      - backend
networks:
  frontend:
  backend:
    driver: bridge

自定义网络配置

yaml
networks:
  app-net:
    driver: bridge
    ipam:
      config:
        - subnet: 172.20.0.0/24
          gateway: 172.20.0.1
    attachable: true
    internal: true  # 创建隔离网络
    enable_ipv6: true  # 启用 IPv6
    labels:
      com.example.version: "1.0"

  backend:
    external: true  # 使用外部已存在的网络
    name: existing_network

depends_on 服务依赖

yaml
services:
  web:
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_started
  db:
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s
      timeout: 3s
      retries: 5

依赖条件类型

  • service_started:服务容器启动
  • service_healthy:通过健康检查
  • service_completed_successfully:一次性任务成功

healthcheck 健康检查配置

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

检查方式

  • CMD:直接执行命令
  • CMD-SHELL:通过 shell 执行
  • 禁用:disable: tru

ulimits 优化

yaml
version: '3.8'
services:
  webapp:
    image: nginx:latest
    ulimits:
      nofile:  # 文件描述符限制
        soft: 10240
        hard: 20480
      nproc:   # 进程数限制
        soft: 1024
        hard: 2048
      locks:   # 文件锁限制
        soft: 1024
        hard: 2048

关键参数说明

  • soft limit:当前进程实际应用的限制值,进程可自行降低但需要特权才能提高
  • hard limit:soft limit 可调整的上限,只有 root 用户可修改
限制类型参数名优化场景典型生产值
打开文件数nofile高并发Web服务65535+
用户进程数nproc防止fork炸弹1024-4096
核心文件大小core调试环境unlimited
栈大小stack递归深度大的应用8192KB+
CPU时间cpu计算密集型任务按需设置

deploy 资源约束

yaml
services:
  worker:
    deploy:
      resources:
        limits:
          # 限制CPU
          cpus: '0.5'
          # 限制内存
          memory: 512M
        reservations:
          memory: 256M
    restart_policy:
      condition: on-failure
      max_attempts: 3

日志配置

yaml
logging:
  driver: "json-file"
  options:
    max-size: "10m"
    max-file: "3"

使用配置文件

yaml
configs:
  nginx-config:
    file: ./nginx.conf

profiles

  • 定义一个服务属于特定的 profile(配置文件组)

  • 默认情况下,不带 --profile 参数启动时,标记了 profile 的服务不会自动启动

    yaml
    nginx-builder:
      profiles: ["build-only"]
        deploy:
          replicas: 0
    • replicas:指定服务运行的容器实例数量

安装

yum安装

bash
dnf -y docker-compose-plugin

二进制包

bash
curl -SL https://github.com/docker/compose/releases/download/v2.37.3/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

Docker Compose 命令

语法格式

bash
docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]

选项

选项描述示例
-f指定 compose 文件路径docker-compose -f prod.yml up
-p指定项目名称docker-compose -p myproject down
--env-file指定环境变量文件docker-compose --env-file .env.dev up
--verbose显示详细输出docker-compose --verbose logs
--no-ansi禁用 ANSI 控制字符docker-compose --no-ansi up

COMMAND 命令

命令描述示例
docker-compose up启动服务,根据 docker-compose.yml 文件创建并启动容器docker-compose up -d(后台运行)
docker-compose down停止并删除所有服务和网络docker-compose down -v(删除数据卷)
docker-compose ps列出当前活动的服务和容器docker-compose ps
docker-compose build根据配置构建服务镜像docker-compose build
docker-compose logs查看服务的日志docker-compose logs -f(实时日志)
docker-compose exec在容器中执行命令docker-compose exec db bash
docker-compose stop停止正在运行的服务docker-compose stop web
docker-compose start启动已停止的服务docker-compose start db
docker-compose restart重启指定的服务docker-compose restart

经典案例

构建自定义镜像

compose.yaml

yaml
version: '3.8'  # 明确指定版本
services:
  # 最终运行容器
  web:
    build:
      context: ./
      dockerfile: Dockerfile
    image: nginx-web:1.0.0  # 使用nginx-web构建的镜像
    container_name: web
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    networks:
      - web
    volumes:
      - /data/nginx/html/:/data/wwwroot/www/
      - /data/nginx/conf/:/etc/nginx/conf/
      - /data/nginx/ssl/:/etc/nginx/ssl/
    deploy:
      resources:
        limits:
          # 限制CPU
          cpus: '0.5'
          # 限制内存
          memory: 512M
        reservations:
          memory: 256M
networks:
  web:
    driver: bridge

构建启动

bash
docker-compose build
docker-compose up -d