Docker Compose基础

Docker Compose基础

配置文件核心结构

Docker Compose 配置文件(docker-compose.yml/compose.yml)基于 YAML 格式,核心分为 五大模块services(服务,必选)、networks(网络)、volumes(卷)、configs(配置)、secrets(密钥),另支持顶层全局参数和自定义扩展字段,以下是所有支持的参数详细说明。

顶层参数作用于整个 Compose 项目,定义项目的基础配置和全局资源。

参数 说明
version 指定 Compose 文件格式版本(推荐 3.8+,适配 Docker 20.10+),不同版本支持的参数存在兼容性差异,3.x 版本适配 Swarm 模式,2.x 偏向单机使用
services 定义所有容器服务(核心必选模块),下属每个子项为一个独立容器服务,包含容器运行的所有配置
networks 定义自定义网络,用于服务间网络隔离、通信,支持多种网络驱动,需在服务中通过 networks 关联
volumes 定义持久化数据卷,用于容器数据持久化(容器删除后数据不丢失),支持本地卷、网络卷等,需在服务中通过 volumes 挂载
configs Docker Swarm 模式专用,定义跨服务共享的配置文件(非敏感信息),支持本地文件加载或引用外部配置
secrets Docker Swarm 模式专用,定义敏感信息(密码、密钥等),避免明文暴露,支持本地文件加载或引用外部密钥
x-* 自定义扩展字段,字段名必须以 x- 开头(如 x-common-env),Compose 会忽略该字段,但可通过 YAML 锚点语法复用配置

示例配置

基础运行yaml

services:
  nginx:
    image: nginx
    container_name: nginx
    restart: unless-stopped
    environment:
      ENV_TEST: 123456
    ports:
      - "80:80"
    volumes:
      - ./html:/usr/share/nginx/html

资源限制

限制内存

    mem_limit: 2000M

cpu和内存

    deploy:
      resources:
        limits:
          cpus: "1"
          memory: 1G
        reservations:
          cpus: "0.5"
          memory: 512M

文件打开数

    sysctls:
      - net.core.somaxconn=65535
    ulimits:
      nofile:
        soft: 100000
        hard: 100000

网络选择

使用已有网络

    # 使用已有自定义网络, 类型bridge
    network_mode: app-network

    # 使用host网络
    network_mode: host

    # 使用bridge网络
    network_mode: bridge

使用自定义网络,不指定网段

    networks:
      - app-network
networks:
  app-network:
    driver: bridge

使用自定义网络,并自定义网段

    networks:
      - app-network
networks:
  app-network:
    driver: bridge
    ipam:
      config:
        - subnet: 172.30.0.0/16
          gateway: 172.30.0.1

使用自定义网络,并自定义网段和ip

    networks:
      app_net:
        ipv4_address: 172.30.0.2
networks:
  app-network:
    driver: bridge
    ipam:
      config:
        - subnet: 172.30.0.0/16
          gateway: 172.30.0.1

持久化配置

使用宿主机目录或文件挂载

    volumes:
      - ./conf:/etc/nginx/conf.d
      - ./conf/default.conf:/etc/nginx/conf.d/default.conf

使用volume

    volumes:
      - nginx_conf:/etc/nginx/conf.d
volumes:
  nginx_conf:

指定存储名称和挂载类型

    volumes:
      - nginx_conf:/etc/nginx/conf.d
volumes:
  nginx_conf:
    name: conf
    driver: local

使用已有存储

    volumes:
      - existing_volume:/app/data
volumes:
  existing_volume:
    external: true
    name: pre-existing-volume-name 

使用volumes卷, 挂载自定义目录

    volumes:
      - nginx_test:/etc/nginx/conf.d
volumes:
  nginx_test:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /data/nginx/conf.d

远程挂载

volumes:
  # NFS 驱动
  nfs_volume:
    driver: local
    driver_opts:
      type: nfs
      device: ":/nfs/share/data"
      o: "addr=192.168.1.100,nfsvers=4,hard,intr"
  
  # SMB/CIFS 驱动
  smb_volume:
    driver: local
    driver_opts:
      type: cifs
      device: "//server/share"
      o: "username=user,password=pass,file_mode=0777,dir_mode=0777"
  
  # 临时内存卷
  tmpfs_volume:
    driver: local
    driver_opts:
      type: tmpfs
      device: tmpfs
      o: "size=100m,uid=1000"

示例

version: '3.8'

# 自定义网络
networks:
  app-network:
    driver: bridge
    ipam:
      config:
        - subnet: 172.30.0.0/16
          gateway: 172.30.0.1

# 持久化卷
volumes:
  mysql-data:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: ./mysql-data

# 服务定义
services:
  # Web 服务
  nginx:
    image: nginx:alpine
    container_name: my-nginx
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
      - ./html:/usr/share/nginx/html
    networks:
      - app-network
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "wget", "-qO-", "http://localhost"]
      interval: 30s
      timeout: 10s
      retries: 3
    depends_on:
      - php

  # 数据库服务
  mysql:
    image: mysql:8.0
    container_name: my-mysql
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_DATABASE: app_db
    volumes:
      - mysql-data:/var/lib/mysql
    networks:
      - app-network
    deploy:
      resources:
        limits:
          cpus: "1"
          memory: 1G
        reservations:
          cpus: "0.5"
          memory: 512M
    restart: on-failure:3

# 扩展字段(复用配置)
x-common-env: &common-env
  TZ: Asia/Shanghai
  LANG: en_US.UTF-8