Docker Compose 配置示例

配置文件示例

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
services:
app:
build: # 使用 Dockerfile 构建镜像, 与 image 同时设置时,将构建的镜像打标签为 example:latest
context: . # 指定上下文环境为当前目录
dockerfile: Dockerfile # 指定 Dockerfile 文件名
restart: always # 容器重启策略 no/awalys/unless-stopped/on-failure[:max-retries]
volumes:
- ./config:/config:ro # 将当前目录下的 config 文件夹挂载到容器的 /config 目录,权限为只读
- app-data:/data-test:rw # 将 app-data 数据卷挂载到容器的 /data 目录,权限为读写
ports: # 指定端口映射
- "8080:80"
- "3000"
- "5000-6000"
- "9090-9091:8080-8081"
- "3031:3031/udp"
- "127.0.0.1:8070:80" # 只允许本机访问
env_file: ./default.env # 指定环境变量文件
environment: # 指定环境变量, 优先级高于 env_file
- ENV1=1
post_start: # 容器启动后执行的命令
- command: chown -R /data 1001:1001
user: root
pre_stop: # 容器停止前执行的命令
- command: ./data_flush.sh
annotations: # 定义注解,可以使用 Map 和 List
com.example.foo: bar
attach: true # version > 2.20.0 是否搜集日志, 默认为 true
blkio_config: # 限定对宿主机 块设备 的读写速率等
cpu_count: 4 # 限制 CPU 可用数, 容器只可以看见到指定数量的 CPU 核心
cpu_precenet: 90 # 限制 CPU 使用率
cpu_shares: 512 # CPU 权重, 默认为 1024, CPU 忙时 根据权重分配 CPU 时间片
cpu_period: 100000 # 定义CPU 时间片长度
cpu_quota: 20 # 单位 CPU 时间片内容器可使用的时间片长度
cpu_rt_runtime: 100ms # 定义 实时任务 可使用的 CPU 时间片长度 单位 us
cpu_rt_period: 1000000 # 定义 实时任务 CPU 时间片长度 单位 us
cpus: 1.5 # 定义要分配给容器的 cpu 数量
cpuset: "0,1,2-6" # 定义容器可以跑在哪几个CPU核心上
cap_add: # 增加容器权限
- ALL
cap_drop: # 删除容器权限
cgroup: private # 容器可以查看的 cgroup 范围
cgroup_parent: m-executor-abcd # 修改父 cgroup
command: ["start", "--heldess"] #覆盖容器镜像的默认命令
container_name: webapp # 定义容器名称, 不使用默认名称
delpoy: #服务部署及生命周期相关的配置 https://docs.docker.com/reference/compose-file/deploy/
endpoint_mode: vip # endpoint_mode: vip | dnsrr 指定服务发现方法
labels:
com.example.description: "This is example."
resources: #物理资源约束
limits:
cpus: "1.5"
memory: 2G
develop:
dns:
- 1.1.1.1
- 8.8.8.8
dns_search: # 指定 DNS 搜索域
domainname: example.com # 定义容器主机域
entrypoint: # 覆盖镜像的默认入口命令
expose: # 暴露端口,但是不映射到宿主机,只被连接的服务访问
- "3000"
external_links: # 链接到 compose 外部的服务
- redis-2
extra_hosts: # 添加主机名映射
- "host.docker.internal:host-gateway" # 将 host.docker.internal 映射到宿主机
group_add: # 让容器进程加入额外的 Linux 组
- mail
hostname: "my-app" # 定义容器主机名
init: true # 启动 init 进程用于管理进程,转发信号
links: # 链接到非同一网络的其他容器
- redis-3
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: 3
mem_limit: "2G" # 容器可用内存大小
network_mode: none # host none container: service 网络模式 与 networks 二选一
networks: #将容器附加到网络
some-network:
ipv4_address: 172.31.0.3 # 定义网络接口的 IPv4 地址
interface_name: eth3 # 定义网络接口名称,确保一致性和可预测性
aliases: # 在网络中设置别名
- alias1
- alias3
other-network:
aliases:
- alias2
oom_kill_disable: false # 内存不足时终止容器
read_only: true # 将容器的根文件系统挂载为只读
tmpfs: # 挂载一个 tmpfs 文件系统
- /tmp
runtime: runc # 指定容器运行时
secrets: # 挂载 secrets 通过 /run/secrets/<secret_name> 访问
- server-certificate
stdin_open: true # 容器启动时打开标准输入
tty: true # 容器启动时打开一个伪终端
ulimits: # 设置 ulimits
nproc: 65535
nofile:
soft: 20000
hard: 40000
user: www # 指定运行容器的用户
working_dir: /app # 定义容器的工作目录

phpmyadmin:
image: phpmyadmin:latest
pull_policy: missing # 镜像拉取策略,默认仅当缓存不可用时拉取 https://docs.docker.com/reference/compose-file/services/#pull_policy
profiles: ["dev"] # 仅在 profiles 为 dev 时启动
env_file: # 指定环境变量文件列表
- path: ./default.env
required: true # default.env 必须存在 v2.24.0+ 支持
- path: ./override.env
required: false
environment: # 指定环境变量
PMA_HOST: db
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} # 从环境变量中读取, 显示插值
MYSQL_ROOT_PASSWORD2: #从环境变量中读取, 隐式插值
ports:
- 8081:80
depends_on: # 指定依赖的服务, 默认情况下只确保启动顺序,不确保容器正常提供服务
db:
condition: service_healthy # 需要检查服务是否健康, 需要对应的服务设置 healthcheck
# 默认值为 service_started;service_completed_successfully 仅在服务退出码为 0 时启动
restart: true #依赖的服务重启时,该服务也重启
required: true # 依赖的服务必须启动, 否则该服务不启动,默认是 flase
redis:
condition: service_started
db:
image: mysql:lts
volumes:
- mysql-data:/var/lib/mysql:rw # 将 mysql-data 数据卷挂载到容器的 /var/lib/mysql 目录,权限为读写
- ./init-scripts:/docker-entrypoint-initdb.d
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: example
healthcheck: # 健康检查 https://docs.docker.com/reference/dockerfile/#healthcheck
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-pexample"]
interval: 10s
timeout: 5s
retries: 5
start_period: 20s
disable: false # 禁用健康检查,用于禁用镜像内设的健康检查

redis:
image: redis:latest
volumes:
- redis-data:/data:rw

redis-3:
image: redis:latest
networks:
- redis-3-coust

volumes:
app-data: # 指定一个数据卷
driver: local
redis-data:
driver: local
mysql-data:
driver: local

networds:
default: {}
some-network:
name: some-network # 网络名称, 不使用项目前缀
ipam:
driver: default
config:
subnet: 172.31.0.0/16
ip_range: 172.31.5.0/24
gateway: "172.31.5.1"
internal: true # 只在 Docker 内部通信,不能访问外部
other-network:
driver: bridge # 网路驱动程序, 默认为 bridge. birdge/host/overlay/ipvlan/macvlan/none https://docs.docker.com/engine/network/drivers/
driver_opts: # 网络驱动程序选项
com.docker.network.bridge.host_binding_ipv4: "127.0.0.1"
enable_ipv4: true
enable_ipv6: false # 禁用 IPv6
external: true # 使用外部网络,如果网络不存在则报错,不会自动创建
secrets:
server-certificate:
file: ./server.cert

注意事项

environment 环境变量优先级

优先级 来源
🥇 1. CLI 中使用 -e 参数 docker compose run -e VAR=value
🥈 2. Compose 文件中 environment 字段,并使用了变量插值 environment: - VAR=${VAR_FROM_SHELL_OR_ENV_FILE}
🥉 3. Compose 文件中 environment 字段,直接赋值 environment: - VAR=value
🏅 4. Compose 文件中的 env_file 字段 env_file: .env
🏅 5. Dockerfile 中的 ENV 指令 ENV VAR=value

compose 会自动加载同目录下的 .env 中的环境变量,但是仅用于在 compose.yml 文件内进行插值

depends_on 搭配组合

配置 依赖服务未定义/未启动 依赖服务存在但未 healthy 依赖服务 healthy
condition: service_healthy, required: true ❌ 报错并阻止启动 ⏳ 等待健康(阻塞) ✅ 启动
condition: service_healthy, required: false ⚠️ 仅警告,继续启动 ⏳ 等待健康(阻塞) ✅ 启动

logging 配置

日志驱动 必备配置 推荐配置 / 说明 示例
json-file 无(默认) 控制本地日志大小和轮转 logging: driver: "json-file" options: max-size: "10m" max-file: "3" compress: "true"
syslog syslog-address 可选:syslog-facilitytag;发送到远程 syslog logging: driver: "syslog" options: syslog-address: "tcp://192.168.0.10:514" syslog-facility: "daemon" tag: "myapp"
journald 无(依赖 systemd) 可选:tag logging: driver: "journald" options: tag: "{{.Name}}"
fluentd fluentd-address 可选:fluentd-async-connecttag;发送到 Fluentd 聚合 logging: driver: "fluentd" options: fluentd-address: "localhost:24224" fluentd-async-connect: "true" tag: "myapp.{{.Name}}"
gelf gelf-address 可选:gelf-compression-typetag;发送到 Graylog logging: driver: "gelf" options: gelf-address: "udp://127.0.0.1:12201" gelf-compression-type: "gzip" tag: "myapp"
awslogs awslogs-region, awslogs-group, awslogs-stream 可选:awslogs-create-group logging: driver: "awslogs" options: awslogs-region: "us-east-1" awslogs-group: "/my/log/group" awslogs-stream: "myapp-stream" awslogs-create-group: "true"
none 不保存日志 logging: driver: "none"
Author

feng

Posted on

2025-07-25

Updated on

2025-08-25

Licensed under

Kommentare