如何使用Docker—Compose部署复杂要求的容器?

Docker Compose 是一个强大的工具,它简化了多容器 Docker 应用的部署。我最初使用 docker run 等方式部署 Docker 容器,但为了部署 MC 服务器,并考虑到我已将闲置主机改造成 NAS,我开始探索 Docker Compose。

起初,我尝试使用 docker run,但发现环境变量和挂载等参数修改起来非常繁琐,因此我转向了 Docker Compose。

Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它使用 YAML 文件来配置应用程序的服务、网络和卷等。通过 Docker Compose,可以轻松管理复杂的容器部署,尤其适合需要多个服务协同工作的场景。

在使用 Docker Compose 的过程中,我形成了自己的一些理解。

Docker Compose 的理解

Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具,核心在于通过一个 YAML 文件定义多个相互关联的 Docker 容器,并将它们作为一个整体进行管理

它可以简化配置,管理服务依赖,并且方便快捷地部署服务。

它使用 YAML 文件(通常命名为 docker-compose.ymldocker-compose.yaml)来配置应用程序的服务、网络和数据卷等。

通过声明式的配置,Compose 可以轻松实现应用的快速部署和扩展。尤其适合以下场景:

  • 微服务架构: 定义和管理构成应用程序的多个微服务。
  • 测试环境: 在隔离的环境中快速搭建和清理测试环境。
  • 持续集成/持续部署 (CI/CD): 在 CI/CD 管道中自动化部署流程。

接下来,我们将深入了解 Docker Compose 文件的结构。

Docker Compose 文件的结构

Docker Compose 文件通常命名为 docker-compose.yml

以下是一个包含常用和重要字段的 Docker Compose 示例文件。请注意,实际生产环境配置可能不会包含所有这些字段,因为许多字段是为特定场景或高级需求设计的。此示例旨在展示 Docker Compose 的强大功能和灵活性。

我将以 version: '3.8' 作为基础,因为它是目前推荐且功能完善的版本。

highlight
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
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
version: '3.8' # 指定 Docker Compose 文件格式的版本

services: # 定义应用程序中的所有服务(容器)
web_app: # 服务名称,可以是任意有意义的字符串
image: my-custom-web-app:latest # 使用自定义镜像
# 或者使用公共镜像:image: nginx:stable-alpine
build:
context: ./web_app_source # Dockerfile 所在的目录路径
dockerfile: Dockerfile.prod # 指定 Dockerfile 的名称,默认为 Dockerfile
ports: # 端口映射
- "25565:25565" # 将主机 25565 端口映射到容器 25565 端口
environment: # 设置环境变量
EULA: "TRUE" # 同意 Minecraft 的 EULA
volumes: # 数据卷挂载
- minecraft_data:/data # 挂载命名卷 'minecraft_data' 到容器的 /data 目录


web_app: # 服务名称,可以是任意有意义的字符串
# image: 指定用于创建容器的 Docker 镜像。
# 如果本地不存在,Compose 会尝试从 Docker Hub 拉取。
image: my-custom-web-app:latest # 使用自定义镜像
# 或者使用公共镜像:
# image: nginx:stable-alpine

# build: 如果需要从 Dockerfile 构建镜像,而不是直接使用现有镜像。
# 可以是一个字符串(Dockerfile 所在目录的路径)或一个映射。
build:
context: ./web_app_source # Dockerfile 所在的目录路径
dockerfile: Dockerfile.prod # 指定 Dockerfile 的名称,默认为 Dockerfile
args: # 构建时传递给 Dockerfile 的构建参数
NODE_ENV: production
APP_VERSION: 1.0.0
cache_from: # 指定构建缓存的来源镜像
- my-custom-web-app:build-cache
labels: # 为构建的镜像添加标签
com.example.build-date: "2025-07-31"
network: host # 构建时使用的网络模式
shm_size: 2g # /dev/shm 的大小,用于构建过程
target: production-stage # 指定 Dockerfile 中的构建阶段 (multi-stage build)
no_cache: false # 构建时不使用缓存
pull: true # 始终尝试拉取最新的基础镜像

# command: 覆盖镜像中定义的默认命令 (CMD)。
# 可以是字符串或列表形式。
command: ["nginx", "-g", "daemon off;"]
# 或者:command: nginx -g "daemon off;"

# entrypoint: 覆盖镜像中定义的默认入口点 (ENTRYPOINT)。
# 可以是字符串或列表形式。
entrypoint: ["/usr/local/bin/docker-entrypoint.sh"]

# ports: 端口映射,将主机端口映射到容器端口。
# 可以是 "HOST_PORT:CONTAINER_PORT" 或 "HOST_PORT:CONTAINER_PORT/PROTOCOL" 格式。
ports:
- "80:80" # 将主机 80 端口映射到容器 80 端口
- "443:443/tcp" # 明确指定 TCP 协议
- target: 8080 # 容器内部端口
published: 8081 # 主机端口
protocol: tcp
mode: host # 端口发布模式 (host 或 ingress,ingress 仅用于 Swarm)

# expose: 暴露端口给链接的服务,但不发布到主机。
# 这些端口只能在 Compose 网络内部访问。
expose:
- "9000" # 暴露容器内部的 9000 端口

# volumes: 数据卷挂载,用于持久化数据或共享文件。
# 格式: "HOST_PATH:CONTAINER_PATH" 或 "VOLUME_NAME:CONTAINER_PATH"
# 也可以使用长语法。
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d:ro # 挂载主机目录到容器,只读
- app_data:/var/www/html # 挂载命名卷 'app_data' 到容器
- type: bind # 绑定挂载
source: ./logs # 主机路径
target: /var/log/nginx # 容器路径
read_only: false # 可读写
- type: volume # 命名卷挂载
source: cache_volume # 命名卷名称
target: /var/cache/nginx
- type: tmpfs # 临时文件系统挂载 (仅限 Linux)
target: /tmp/cache
tmpfs:
size: 100m # 临时文件系统大小

# environment: 设置容器内的环境变量。
# 可以是映射或列表形式。
environment:
NODE_ENV: production
DATABASE_URL: postgres://user:password@db:5432/mydb
# 或者列表形式:
# - API_KEY=your_api_key
# - DEBUG=false

# env_file: 从文件中加载环境变量。
# 可以是一个字符串(文件路径)或一个列表。
env_file:
- .env.production # 加载 .env.production 文件中的环境变量
- common.env # 加载 common.env 文件中的环境变量

# depends_on: 定义服务之间的启动依赖关系。
# 列表形式:只表示启动顺序,不检查服务健康状态。
# 映射形式:可以指定条件,如服务健康或成功完成。
depends_on:
- db_service # web_app 在 db_service 启动后才启动
- redis_cache
# 映射形式 (Compose V3.2+):
# db_service:
# condition: service_healthy # 只有当 db_service 报告健康时才启动 web_app
# redis_cache:
# condition: service_started # 只要 redis_cache 启动就启动 web_app

# networks: 指定服务连接到哪些网络。
# 可以是列表或映射形式。
networks:
- app_backend_network # 连接到名为 'app_backend_network' 的网络
- app_frontend_network: # 连接到 'app_frontend_network' 并设置别名和 IP
aliases:
- webapp.local
- myapp.internal
ipv4_address: 172.20.0.10 # 为服务在这个网络中指定静态 IP (不推荐在生产环境广泛使用)

# external_links: 链接到 Compose 文件外部的容器。
# 格式: "CONTAINER_NAME:ALIAS"
external_links:
- existing_legacy_db:legacy_db_alias

# container_name: 指定容器的名称,而不是由 Docker Compose 自动生成。
# 建议在生产环境中使用,方便管理。
container_name: my_web_app_container

# hostname: 设置容器内部的主机名。
hostname: webapp-host

# domainname: 设置容器内部的域名。
domainname: example.com

# user: 指定运行容器的用户或 UID。
user: "1000:1000" # UID:GID

# working_dir: 设置容器的工作目录。
working_dir: /app

# restart: 定义容器的重启策略。
# no: 不自动重启。
# on-failure: 只有当容器以非零退出码退出时才重启。
# always: 无论退出码如何,总是重启。
# unless-stopped: 除非手动停止,否则总是重启
restart: unless-stopped # 除非手动停止,否则总是重启
# restart: no # 不自动重启
# restart: on-failure # 只有当容器以非零退出码退出时才重启
# restart: always # 无论退出码如何,总是重启

# healthcheck: 定义容器的健康检查方式。
healthcheck:
test: ["CMD-SHELL", "curl -f http://localhost/health || exit 1"] # 执行的命令
interval: 30s # 检查间隔
timeout: 10s # 每次检查的超时时间
retries: 3 # 失败重试次数
start_period: 5s # 容器启动后,在开始健康检查前的等待时间
disable: false # 禁用健康检查

# logging: 配置容器的日志驱动和选项。
logging:
driver: "json-file" # 日志驱动,如 json-file, syslog, fluentd, journald 等
options:
max-size: "10m" # 单个日志文件最大大小
max-file: "3" # 保留的日志文件数量

# labels: 为服务和容器添加元数据标签。
# 可以是映射或列表形式。
labels:
com.example.service: "web_app"
com.example.tier: "frontend"
# 或者列表形式:
# - "com.example.project=my_app"

# privileged: 授予容器扩展的权限,慎用。
privileged: false

# read_only: 将容器的根文件系统设置为只读。
read_only: false

# stdin_open: 保持 STDIN 打开,即使没有连接到终端。
stdin_open: true # 等同于 docker run -i

# tty: 分配一个伪 TTY。
tty: true # 等同于 docker run -t

# cap_add: 添加 Linux 能力。
cap_add:
- NET_ADMIN # 允许网络管理操作
- SYS_PTRACE # 允许进程跟踪

# cap_drop: 移除 Linux 能力。
cap_drop:
- ALL # 移除所有能力 (然后按需添加)

# devices: 将主机设备添加到容器。
devices:
- "/dev/ttyUSB0:/dev/ttyUSB0" # 映射串口设备

# dns: 设置容器的 DNS 服务器。
dns:
- 8.8.8.8
- 8.8.4.4

# dns_search: 设置容器的 DNS 搜索域。
dns_search:
- example.com
- mycompany.local

# tmpfs: 挂载一个 tmpfs 文件系统到容器。
tmpfs:
- /run/my_app:size=64m # 挂载一个 64MB 的 tmpfs 到 /run/my_app

# ulimits: 设置容器的 ulimits。
ulimits:
nproc: 65535 # 最大进程数
nofile:
soft: 20000 # 软限制
hard: 40000 # 硬限制

# sysctls: 配置容器的内核参数。
sysctls:
net.core.somaxconn: 1024 # TCP 连接队列最大长度
net.ipv4.ip_unprivileged_port_start: 0 # 允许非特权用户绑定低端口

# security_opt: 配置容器的安全选项。
security_opt:
- no-new-privileges # 禁用新的特权

# stop_grace_period: 容器停止前的优雅关闭等待时间。
stop_grace_period: 30s

# stop_signal: 发送给容器的停止信号。
stop_signal: SIGTERM

# cgroup_parent: 指定容器的 cgroup 父级。
cgroup_parent: my_cgroup_group

# cpu_shares: CPU 份额(相对权重)。
cpu_shares: 512 # 默认 1024

# cpu_quota: CPU 配额(微秒)。
cpu_quota: 50000 # 容器每 100ms 最多使用 50ms CPU

# cpu_period: CPU 周期(微秒)。
cpu_period: 100000 # 默认 100ms

# cpuset: 限制容器使用的 CPU 核心。
cpuset: "0,1" # 限制容器只能使用 CPU 0 和 CPU 1

# mem_limit: 内存限制。
mem_limit: 2g # 限制容器最大使用 2GB 内存

# mem_reservation: 内存预留。
mem_reservation: 1g # 预留 1GB 内存

# memswap_limit: 内存 + 交换空间限制。
memswap_limit: 3g # 限制容器最大使用 3GB 内存和交换空间

# oom_kill_disable: 禁用 OOM Killer。
oom_kill_disable: false

# pids_limit: 限制容器可以创建的进程数。
pids_limit: 200

# group_add: 添加额外的组 ID 到容器。
group_add:
- "100" # 添加 gid 100

# init: 在容器中运行一个 init 进程。
init: true

# ipc: 设置容器的 IPC 模式。
ipc: host # 共享主机 IPC 命名空间

# pid: 设置容器的 PID 模式。
pid: host # 共享主机 PID 命名空间

# uts: 设置容器的 UTS 模式。
uts: host # 共享主机 UTS 命名空间

# userns_mode: 设置用户命名空间模式。
userns_mode: host

# runtime: 指定容器运行时。
runtime: nvidia # 使用 nvidia 运行时 (如果安装了)

# shm_size: /dev/shm 的大小。
shm_size: 1g

# storage_opt: 存储驱动选项。
storage_opt:
size: "10G" # 限制容器的存储大小 (仅限某些存储驱动)

# volume_driver: 指定卷驱动。
volume_driver: local

# configs: 引用在顶级 'configs' 部分定义的配置数据。
# 格式: source: config_name 或长语法。
configs:
- source: my_app_config # 引用名为 'my_app_config' 的配置
target: /etc/app/config.conf # 挂载到容器内的路径
uid: "1000" # 容器内文件的用户 ID
gid: "1000" # 容器内文件的组 ID
mode: 0444 # 容器内文件的权限 (八进制)

# secrets: 引用在顶级 'secrets' 部分定义的敏感数据。
# 格式: source: secret_name 或长语法。
secrets:
- source: db_password_secret # 引用名为 'db_password_secret' 的秘密
target: /run/secrets/db_password # 挂载到容器内的路径
uid: "1000"
gid: "1000"
mode: 0400

# extends: 从另一个 Compose 文件或当前文件中的服务扩展配置。
# 允许重用和继承配置。
# extends:
# file: common-services.yml # 扩展自另一个文件
# service: base-web-service # 扩展自另一个文件中的服务名称
# 或者:
# extends:
# service: base-service # 扩展自当前文件中的服务名称

# external: 标记服务为外部服务,Compose 不会尝试创建它。
# 通常用于引用已经运行的容器。
# external: true

# profiles: (Compose V3.4+) 定义服务所属的配置文件。
# 只有当激活了相应的 profile 时,服务才会被启动。
profiles:
- development
- debug

# platform: (Compose V3.8+) 指定容器运行的平台 (OS/ARCH)。
platform: linux/amd64

# deploy: (仅限 Compose V3.x,主要用于 Docker Swarm 模式,但部分资源限制在非 Swarm 模式也有效)
# 定义服务的部署和运行时配置,如副本数量、资源限制、更新策略等。
deploy:
mode: replicated # 部署模式:replicated (副本) 或 global (每个节点一个实例)
replicas: 3 # 副本数量 (仅限 replicated 模式)
placement: # 放置约束
constraints:
- node.role == worker # 只能部署在 worker 节点
- node.labels.env == production # 只能部署在带有 env=production 标签的节点
preferences: # 放置偏好
- spread: node.labels.zone # 尽量分散到不同 zone 的节点
resources: # 资源限制和预留
limits: # 资源上限
cpus: '0.5' # 限制 CPU 使用为 0.5 个核心
memory: 512M # 限制内存使用为 512MB
reservations: # 资源预留 (保证的最低资源)
cpus: '0.25'
memory: 256M
restart_policy: # 容器重启策略 (Swarm 模式下)
condition: on-failure # 只有当容器失败时才重启
delay: 5s # 重启前的延迟
max_attempts: 3 # 最大重启尝试次数
window: 120s # 检查重启尝试的窗口期
update_config: # 服务更新策略
parallelism: 1 # 并行更新的容器数量
delay: 10s # 每次更新之间的延迟
failure_action: rollback # 更新失败时的操作 (rollback, pause, continue)
monitor: 60s # 监控更新状态的时间
max_failure_ratio: 0.1 # 允许的最大失败率
order: start-first # 更新顺序 (start-first 或 stop-first)
rollback_config: # 服务回滚策略
parallelism: 1
delay: 10s
failure_action: pause
monitor: 60s
max_failure_ratio: 0.1
order: stop-first
labels: # 为 Swarm 服务添加标签
com.example.swarm-service: "true"
endpoint_mode: vip # 服务发现模式 (vip 或 dnsrr)

# -------------------------------------------------------------------------
# 3. 网络定义 (Network Definition)
# -------------------------------------------------------------------------

networks:
app_backend_network: # 定义一个名为 'app_backend_network' 的网络
driver: bridge # 网络驱动,默认为 bridge
driver_opts: # 驱动选项
com.docker.network.bridge.host_binding_ipv4: "0.0.0.0"
attachable: true # 允许独立容器连接到此网络
enable_ipv6: true # 启用 IPv6
internal: false # 是否为内部网络 (内部网络无法直接从外部访问)
labels: # 为网络添加标签
com.example.network_type: "backend"
name: my_custom_backend_network # 指定网络在 Docker 中的实际名称 (如果与定义名称不同)
ipam: # IP 地址管理配置
driver: default # IPAM 驱动
config: # IPAM 配置列表
- subnet: 172.18.0.0/16 # 子网
ip_range: 172.18.0.0/24 # IP 范围
gateway: 172.18.0.1 # 网关
aux_addresses: # 辅助地址
host1: 172.18.0.2
host2: 172.18.0.3
app_frontend_network:
external: true # 标记此网络为外部网络,Compose 不会创建它,而是使用已存在的同名网络
# 如果外部网络名称与定义名称不同,可以使用 name 字段:
# external:
# name: existing_frontend_network_on_docker

# -------------------------------------------------------------------------
# 4. 卷定义 (Volume Definition)
# -------------------------------------------------------------------------

volumes:
app_data: # 定义一个名为 'app_data' 的命名卷
driver: local # 卷驱动,默认为 local
driver_opts: # 驱动选项
type: "nfs"
o: "addr=192.168.1.1,rw"
device: ":/mnt/nfs_share"
labels: # 为卷添加标签
com.example.data_type: "persistent"
name: my_custom_app_data_volume # 指定卷在 Docker 中的实际名称
cache_volume:
external: true # 标记此卷为外部卷,Compose 不会创建它,而是使用已存在的同名卷
# 如果外部卷名称与定义名称不同,可以使用 name 字段:
# external:
# name: existing_cache_volume_on_docker

# -------------------------------------------------------------------------
# 5. 配置定义 (Config Definition) - Compose V3.3+
# -------------------------------------------------------------------------

configs:
my_app_config: # 定义一个名为 'my_app_config' 的配置
file: ./configs/app_settings.conf # 从主机上的文件加载配置内容
# external: true # 标记此配置为外部配置,Compose 不会创建它,而是使用已存在的同名配置
# name: existing_app_config_on_docker # 如果外部配置名称不同

# -------------------------------------------------------------------------
# 6. 秘密定义 (Secret Definition) - Compose V3.1+
# -------------------------------------------------------------------------

secrets:
db_password_secret: # 定义一个名为 'db_password_secret' 的秘密
file: ./secrets/db_password.txt # 从主机上的文件加载秘密内容
# external: true # 标记此秘密为外部秘密,Compose 不会创建它,而是使用已存在的同名秘密
# name: existing_db_password_on_docker # 如果外部秘密名称不同
api_key_secret:
external: true # 引用一个已经存在的 Docker Secret
name: my_global_api_key # 外部 Secret 的实际名称

使用说明和注意事项

  1. 并非所有字段都必须: 这个示例包含了非常多的字段,但在实际应用中,您只需要使用其中一小部分。例如,对于一个简单的 Web 应用,您可能只需要 imageportsvolumesenvironment
  2. 版本兼容性: 某些字段(如 deployconfigssecretsprofilesplatform 以及 depends_on 的条件形式)是 Docker Compose 较新版本(V3.x 系列)才支持的。请确保您的 Docker Compose 客户端版本与文件版本兼容,以避免出现配置解析错误或功能不兼容的问题。
  3. 互斥字段: 某些字段是互斥的,例如 imagebuild。您不能同时为同一个服务指定 imagebuild,因为它们都定义了如何获取容器镜像。Compose 会根据您的配置选择一种方式来构建或拉取镜像。
  4. 路径: 示例中的 ./web_app_source./nginx/conf.d 等路径都是相对于 docker-compose.yml 文件所在的目录。请确保这些路径的正确性,否则 Compose 将无法找到相关文件或目录。
  5. 敏感信息: 像数据库密码这样的敏感信息,强烈建议使用 secrets 字段来管理,而不是直接写在 environment 中或提交到版本控制。这有助于提高应用程序的安全性。
  6. deploy 字段: deploy 字段主要用于 Docker Swarm 模式下的服务部署。虽然其中的 resources 限制在非 Swarm 模式下也能生效,但其他如 replicasplacementupdate_config 等则只在 Swarm 模式下有意义。
  7. 注释: 我在示例中添加了大量的注释来解释每个字段的用途和可选项。在您自己的文件中,可以根据需要保留或删除这些注释。
  8. 实际值: 示例中的许多值(如 IP 地址、密码、路径等)都是占位符,您需要根据您的实际情况进行替换。请务必根据您的实际情况进行替换,否则示例配置可能无法正常工作。
  9. .dockerignore 文件: 在构建镜像时,可以使用 .dockerignore 文件来排除不需要的文件和目录,从而减小镜像大小并提高构建速度。

性能优化

  • 资源限制: 使用 cpu_sharescpu_quotamem_limit 等选项来限制容器的资源使用,防止资源耗尽。
  • 构建缓存: 使用 build 上下文和缓存来加速镜像构建。

最佳实践和模式

  • Secrets 管理: 使用 secrets 管理敏感信息,避免硬编码。
  • 配置重用: 使用 extends 重用配置,减少重复。
  • 健康检查: 使用 healthcheck 确保容器的健康状态。

错误处理和边缘情况

  • 常见错误: 检查 Docker Compose 文件中的常见错误,例如端口冲突、卷挂载错误等。
  • 日志记录: 使用日志记录来调试问题。

Minecraft 服务器示例

这是我开 Minecraft 服务器所使用的 docker-compose 文件,使用的是 itzg/minecraft-server 镜像。
原版:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
version: "3.8"
services:
minecraft:
image: itzg/minecraft-server:latest
ports:
- "25565:25565"
environment:
EULA: "TRUE"
MEMORY: 4G
volumes:
- minecraft_data:/data

volumes:
minecraft_data:

PoopSky2 服务器:

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
services:
mc:
image: itzg/minecraft-server:latest
tty: true
stdin_open: true
ports:
- "25565:25565"
environment:
EULA: "TRUE"
TYPE: "FABRIC"
VERSION: "1.21.1"
MEMORY: "8192M"
MAX_PLAYERS: "10"
MOTD: "欢迎来到 ShiroRikka 的 PoopSky2 服务器!"
ONLINE_MODE: "false"
USE_MEOWICE_FLAGS: "true"
TZ: "Asia/Shanghai"
DIFFICULTY: "2"
FORCE_GAMEMODE: "true"
SIMULATION_DISTANCE: "8"
VIEW_DISTANCE: "8"
SPAWN_PROTECTION: "1"
ENABLE_ROLLING_LOGS: "true"
LOG_TIMESTAMP: "true"
ALLOW_FLIGHT: "true"
SERVER_NAME: "空中厕所2"
GENERIC_PACK: "/data/s.zip"
volumes:
- "/vol3/1000/NVMe-SSD-Data/Minecraft/PoopSky2:/data"
- "/vol1/1000/Docker/Minecraft/PoopSky2/modpacks/Fabric-PoopSky2-2.3.zip:/data/s.zip"

你可能会觉得,我靠这个compose文件也太长了吧?其实这是因为我尽可能地将所有的字段都写出来了,实际上你只需要使用其中的一小部分就可以了。
对于一个简单的 Web 应用,您可能只需要 imageportsvolumesenvironment 等字段就足够了,就像上面的MC服务器示例那样。