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: 2000Mcpu和内存
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