docker-compose文件属性(2)服务以及服务属性
2.1、在Docker Compose中定义服务
单个service是对应用程序中计算资源的一种抽象定义,其可以独立于其他组件进行扩展或替换。多个Services由一组容器提供支持,这些容器由平台根据复制要求和位置限制进行运行。由于服务是基于容器来运行的,因此它们是由一个 Docker 镜像以及一组运行时参数来定义的。服务内的所有容器都会使用这些参数进行完全相同的创建。
一个 Compose 文件必须将服务的顶层元素声明为一个映射结构,其中键为服务名称的字符串表示形式,而值则为服务定义。服务定义包含了应用于每个服务容器的配置信息。
每个服务还可能包含一个构建部分,该部分定义了如何为该服务创建 Docker 镜像。Compose 支持使用此服务定义来构建 Docker 镜像。如果不使用该部分,则该部分将被忽略,但 Compose 文件仍被视为有效。构建支持是 Compose 规范中的一个可选部分,详细内容请参阅 Compose 构建规范文档。
每个服务都会定义其容器运行时的约束条件和要求。部署部分会将这些约束条件进行分类,并让平台根据可用资源来调整部署策略,以最大程度地满足容器的需求。部署支持是 Compose 规范中的一个可选部分,详细内容在 Compose 部署规范文档中有描述。如果未实现部署部分,则该部分将被忽略,而 Compose 文件仍被视为有效。
服务简单示例:该实例展示了如何定义两个简单的服务,设置服务的镜像、映射端口、配置基础的环境变量
services:
web:
image: nginx:latest
ports:
- "8080:80"
db:
image: postgres:13
environment:
POSTGRES_USER: example
POSTGRES_DB: exampledb
服务高级示例:
该示例中,proxy 服务使用nginx镜像,挂载了一个本地nginx配置文件到容器中,暴露了80端口,并依赖backend服务。
backend 服务根据backend 目录中的Dockerfile 构建了一个镜像,该镜像的构建阶段被设定为 builder 阶段。
services:
proxy:
image: nginx
volumes:
- type: bind
source: ./proxy/nginx.conf
target: /etc/nginx/conf.d/default.conf
read_only: true
ports:
- 80:80
depends_on:
- backend
backend:
build:
context: backend
target: builder
2.2、服务属性
1、annotations :为容器定义注释。这些注释可以使用数组或者映射的形式。
# map形式
annotations:
com.example.foo: bar
#数组形式
annotations:
- com.example.foo=bar
2、attach:需要Docker Compose版本是2.20.0或者更高的版本
当“attach”属性被定义并设置为“false”时,Compose 将不会收集服务日志,除非明确要求其进行收集。默认的服务配置为“attach: true”。
3、build:“build”指定了从源代码创建容器镜像的构建配置,该配置是根据“Compose 构建规范”所定义的。
4、blkio_config :“blkio_config”定义了一组配置选项,用于为服务设定块 I/O 限制。
services:
foo:
image: busybox
blkio_config:
weight: 300
weight_device:
- path: /dev/sda
weight: 400
device_read_bps:
- path: /dev/sdb
rate: '12mb'
device_read_iops:
- path: /dev/sdb
rate: 120
device_write_bps:
- path: /dev/sdb
rate: '1024k'
device_write_iops:
- path: /dev/sdb
rate: 30
##
device_read_bps, device_write_bps
为给定设备上的读/写操作设定每秒的字节数限制。列表中的每个项必须包含两个键:
path:定义了受影响设备的符号路径。
rate:既可以以整数值(表示字节数)的形式给出,也可以以表示字节数的字符串形式给出。
device_read_iops, device_write_iops
为给定设备上的读/写操作设定每秒的执行次数限制。列表中的每一项必须包含两个键:
path:定义了受影响设备的符号路径。
rate:作为一个整数值,表示每秒允许进行的操作次数。
weight
调整分配给某一服务的带宽比例与其他服务的带宽比例之间的关系。该值为介于 10 到 1000 之间的整数,默认值为 500。
weight_device
根据设备对带宽分配进行微调。列表中的每一项都必须包含两个键值:
path:定义了受影响设备的符号路径。
weight:一个介于 10 到 1000 之间的整数值。
在 /dev/sda 设备上:使用权重 400
在其他所有设备上(如 /dev/sdb):使用权重 300
weight:设置容器的 全局默认权重(100-1000),影响容器在所有块设备上的 I/O 优先级
weight_device:针对 特定设备 设置权重,只影响在该指定设备上的 I/O 优先级
当两者同时配置时,weight_device 的优先级高于 weight
对于特定设备,使用 weight_device 的设置
对于其他未在 weight_device 中指定的设备,使用 weight 的设置
5、cpu_count:定义了服务容器可使用的 CPU 数量。
6、cpu_percent:定义了可用 CPU 的可使用百分比。
7、cpu_shares:“cpu_shares”这一参数以整数值的形式定义了服务容器相对于其他容器的相对 CPU 权重。
8、cpu_period:“cpu_period”用于配置当平台基于 Linux 内核时的 CPU CFS(完全公平调度器)周期。
9、cpu_quota:“cpu_quota”用于在基于 Linux 内核的平台上配置 CPU 的 CFS(完全公平调度器)配额。
10、cpu_rt_runtime:“cpu_rt_runtime”用于配置支持实时调度器的平台上的 CPU 分配参数。它可以是使用微秒为单位的整数值,也可以是持续时间。
cpu_rt_runtime: '400ms'
cpu_rt_runtime: '95000'
数值以 {value}{unit} 的形式将时长表示为字符串。支持的单位包括 us(微秒)、ms(毫秒)、s(秒)、m(分钟)和 h(小时)。数值可以组合多个值,且无需分隔符。
10ms
40s
1m30s
1h5m30s20ms
11、cpu_rt_period:“cpu_rt_period”用于配置支持实时调度器的平台上的 CPU 分配参数。它可以是使用微秒为单位的整数值,也可以是持续时间。
cpu_rt_period: '1400us'
cpu_rt_period: '11000'
12、cpus:决定了要分配给服务容器的(可能为虚拟的)CPU 的数量。这个数量是小数形式。0.000 表示没有限制。设置完成后,所选的 cpus 必须与部署规范中的 cpus 属性保持一致。
13、cpuset:用于定义允许执行的明确的 CPU 范围。它可以是 0 到 3 的一个范围,也可以是 0 和 1 这样的一个列表。
14、cap_add:以字符串的形式指定了额外的容器功能。(Linux功能点参考:capabilities(7) - Linux manual page)
cap_add:
- ALL
15、cap_drop:以字符串形式指定要删除的容器功能。
cap_drop:
- NET_ADMIN
- SYS_ADMIN
- host:在容器运行时的 cgroup 命名空间中运行容器。
- private:在容器自身的私有 cgroup 命名空间中运行容器。
cgroup_parent: m-executor-abcd
18、command :覆盖由容器镜像(例如通过 Dockerfile 的 CMD 命令)所声明的默认命令。
command: bundle exec thin -p 3000
如果该值为空,则会使用镜像中的默认命令。
如果值为 [](空列表)或 ''(空字符串),则由镜像声明的默认命令将被忽略,或者换句话说,会被设置为空。
该值也可以是一个列表,类似于 Dockerfile 中使用的exec形式语法。
注意:与 Dockerfile 中的 CMD 指令不同,command字段不会自动在镜像中定义的 SHELL 指令的上下文中运行。如果您的命令依赖于特定 shell 的功能,例如环境变量扩展,您需要在 shell 中显式地运行该命令。例如:
command: /bin/sh -c 'echo "hello $$HOSTNAME"'
- 短格式语法:
services:
redis:
image: redis:latest
configs:
- my_config
- my_other_config
configs:
my_config:
file: ./my_config.txt
my_other_config:
external: true
- 长格式语法:
services:
redis:
image: redis:latest
configs:
- source: my_config
target: /redis_config
uid: "103"
gid: "103"
mode: 0440
configs:
my_config:
external: true
my_other_config:
external: true
20、container_name:一个字符串,用于指定自定义容器的名称,而非默认生成的名称。
container_name: my-web-container
如果 Compose 文件中指定了容器名称,那么 Compose 不会将服务扩展到超过一个容器的规模。若尝试这样做,则会引发错误。容器名称遵循的正则表达式格式为:[a-zA-Z0-9][a-zA-Z0-9_.-]+
21、credential_spec:用于配置托管服务账号的凭证规格。如果使用 Windows 容器的服务,那么可以使用“file:”和“registry:”协议来设置凭证规范。Compose 还支持针对特定用例的其他协议。
credential_spec必须采用 file:// 或者 registry:// 格式
credential_spec:
file: my-credential-spec.json
当使用 "registry:" 时,凭证信息会从守护进程所在主机的 Windows 注册表中读取,具有指定名称的注册表项必须位于:HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Virtualization\Containers\CredentialSpecs
以下示例是从注册表中名为“my-credential-spec”的值中加载凭证规范:
credential_spec:
registry: my-credential-spec
在为服务配置 gMSA 凭证规范时,只需指定包含配置信息的凭证规范,如以下示例所示:
services:
myservice:
image: myimage:latest
credential_spec:
config: my_credential_spec
configs:
my_credentials_spec:
file: ./my-credential-spec.json
- 短格式语法:
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
- 长格式语法:
- 服务依赖关系会导致以下行为:Compose 按依赖顺序创建服务。在以下示例中,先创建了“db”和“redis”,然后再创建“web”。
- Compose 会等待标记为“service_healthy”的依赖项的健康检查结果。在以下示例中,预期在创建 web 之前,db 必须处于“健康”状态。
- Compose 按依赖关系顺序来移除服务。在以下示例中,web 会先被移除,然后是 db 和 redis。
services:
web:
build: .
depends_on:
db:
condition: service_healthy
restart: true
redis:
condition: service_started
redis:
image: redis
db:
image: postgres
Compose 确保在启动依赖服务之前先启动其依赖服务。Compose 还确保标记为 service_healthy 的依赖服务在启动相关服务之前已处于“健康”状态。
23、deploy:“deploy”指定了服务的部署及生命周期的配置,该配置依据“组合部署规范”中所定义的内容进行设定。
24、develop:要求使用Docker Compose 2.22.0及以上版本。“develop”指定了用于使容器与源代码保持同步的开发配置,该配置在“开发”部分中已有明确说明。
25、device_cgroup_rules:为该容器定义了一组设备 cgroup 规则。其格式与 Linux 内核在“控制组设备白名单控制器”中所指定的格式完全相同。Device Whitelist Controller — The Linux Kernel documentation
device_cgroup_rules:
- 'c 1:3 mr'
- 'a 7:* rmw'
语法格式:
<type> <major>:<minor> <permissions>
设备类型
| 类型 | 含义 | 示例 |
| a | 所有类型 | a *:* rwm |
| b | 块设备 | b 8:* rwm (磁盘) |
| c | 字符设备 | c 1:3 rwm (/dev/null) |
| p | 伪设备 | 很少使用 |
设备号
| 格式 | 含义 | 示例 |
| * | 所有设备 | b *:* (所有块设备) |
| M | 主设备号 | b 8:* (主设备号8的所有设备) |
| M:N | 主设备号:次设备号 | c 4:1 (具体设备) |
权限
| 权限 | 含义 | 说明 |
| r | 读 | 读取设备 |
| w | 写 | 写入设备 |
| m | 创建设备节点 | 非常重要! |
| a | 附加 | 某些设备的附加权限 |
| 组合 | 如 rw | 读+写 |
实际应用场景
#场景 1:安全加固 - 限制设备访问
services:
webapp:
device_cgroup_rules:
# 允许标准设备
- 'c 1:3 rwm' # /dev/null
- 'c 1:5 rwm' # /dev/zero
- 'c 1:7 rwm' # /dev/full
- 'c 1:8 rwm' # /dev/random
- 'c 1:9 rwm' # /dev/urandom
- 'c 5:0 rwm' # /dev/tty
- 'c 5:1 rwm' # /dev/console
# 明确拒绝磁盘访问(安全加固)
- 'b *:* rm' # 只允许读和创建设备,不允许写
# 或完全拒绝
# - 'b *:* -' # 拒绝所有块设备访问
#场景 2:特定设备访问
services:
database:
# 只允许访问特定磁盘
device_cgroup_rules:
- 'b 8:0 rwm' # /dev/sda
- 'b 8:16 rwm' # /dev/sdb
- 'b 259:* rm' # NVMe 设备(主设备号259)
# 拒绝其他所有块设备
- 'b *:* -'
#场景 3:GPU 访问控制
services:
ai-training:
# 允许访问 NVIDIA GPU
device_cgroup_rules:
- 'c 195:* rwm' # NVIDIA 控制设备
- 'c 243:* rwm' # NVIDIA UVM 设备
- 'c 508:* rwm' # NVIDIA 计算设备
devices:
- /dev/nvidia0:/dev/nvidia0
- /dev/nvidiactl:/dev/nvidiactl
- /dev/nvidia-uvm:/dev/nvidia-uvm
#场景 4:USB 设备管理
services:
usb-app:
device_cgroup_rules:
# 允许访问特定 USB 设备
- 'c 180:* rm' # USB 字符设备(读+创建设备)
- 'b 8:32 rwm' # 特定 USB 存储设备
# 或允许所有 USB
# - 'c 180:* rwm' # 所有 USB 字符设备
# - 'b 8:* rwm' # 所有 USB 块设备
常见设备号参考
| 设备 | 类型 | 主设备号 | 示例 |
| SCSI/SATA 磁盘 | 块设备 | 8 | b 8:* |
| NVMe 磁盘 | 块设备 | 259 | b 259:* |
| 终端设备 | 字符设备 | 4,5 | c 4:* , c 5:* |
| 循环设备 | 块设备 | 7 | b 7:* |
| 内存设备 | 字符设备 | 1 | c 1:* |
| 杂项设备 | 字符设备 | 10 | c 10:* |
| USB 设备 | 字符设备 | 180 | c 180:* |
| GPU (NVIDIA) | 字符设备 | 195,243 | c 195:* |
devices属性的区别
devices 属性将主机设备挂载到容器,一对一设备映射,自动授予指定权限,设备在容器中可见
device_cgroup_rules 属性 控制整个设备类别的访问规则,基于设备号规则,可以批量控制,更细粒度的权限控制
26、devices:定义了针对所创建容器的设备映射列表,其格式为“HOST_PATH:CONTAINER_PATH[:CGROUP_PERMISSIONS]”。
devices:
- "/dev/ttyUSB0:/dev/ttyUSB0"
- "/dev/sda:/dev/xvda:rwm"
设备还可以利用 CDI 语法来让容器运行时自动选择设备:
devices:
- "vendor1.com/device=gpu"
27、dns:用于定义在容器网络接口配置中要设置的自定义 DNS 服务器。它可以是一个单一的值,也可以是一个列表。
dns: 8.8.8.8
dns:
- 8.8.8.8
- 9.9.9.9
28、dns_opt:dns_opt 列出要传递给容器的 DNS 解析器的自定义 DNS 选项(在 Linux 系统中,这些选项会保存在 /etc/resolv.conf 文件中)。
dns_opt:
- use-vc
- no-tld-query
29、dns_search:用于定义自定义的 DNS 搜索域名,以便在容器网络接口配置中进行设置。它可以是一个单一的值,也可以是一个列表。
dns_search: example.com
dns_search:
- dc1.example.com
- dc2.example.com
#当使用短主机名时,自动尝试添加的域名后缀
# 当 ping web 时,实际尝试:
# 1. web.dc1.example.com
# 2. web.dc2.example.com
# 3. web(最后尝试无后缀)
30、domainname:声明用于服务容器的自定义域名。该域名必须符合 RFC 1123 标准的合法主机名格式。
services:
app:
hostname: "webapp"
domainname: "prod.company.com"
# 结果:完整域名为 webapp.prod.company.com
设置容器的 NIS 域名(不是 DNS 搜索域!),这是系统的 domainname 命令,不是 DNS 搜索域
31、driver_opts:需要Docker Compose 2.27.1及以上版本。用于指定一系列以键值对形式呈现的选项,这些选项将传递给网络驱动程序。这些选项是与网络驱动程序相关的。查阅Networking | Docker Docs 获取更详细信息
services:
app:
networks:
app_net:
driver_opts:
com.docker.network.bridge.host_binding_ipv4: "127.0.0.1"
32、entrypoint:定义了服务容器的默认入口点。这会覆盖来自服务的 Dockerfile 中的“ENTRYPOINT”指令。如果entrypoint不为空,则 Compose 会忽略镜像中的任何默认命令,例如 Dockerfile 中的 CMD 指令。
就短格式而言,该值可以表示为一个字符串:
entrypoint: /code/entrypoint.sh
或者,该值也可以是一个列表,其形式与 Dockerfile 中的格式类似:
entrypoint:
- php
- -d
- zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so
- -d
- memory_limit=-1
- vendor/bin/phpunit
如果该值为null,则会使用镜像中的默认入口点。
如果值为 [](空列表)或 ''(空字符串),则会忽略由镜像所声明的默认入口点,换句话说,该入口点会被设置为空。
33、env_file:用于指定一个或多个包含要传递给容器的环境变量的文件。
#单个文件
env_file: .env
#列表形式
env_file:
- ./a.env
- ./b.env
- reuqired:需要Docker Compose2.24.0及以上版本。属性默认值为true。当 required 被设置为false且 .env 文件缺失时,Compose 会默默地忽略该条目。
env_file:
- path: ./default.env
required: true # default
- path: ./override.env
required: false
- format:需要 Docker Compose 2.30.0及以上版本。该属性允许您为 env_file 指定一种不同的文件格式。若未进行设置,则会按照如下 Env_file 格式中所描述的规则来解析环境文件。
env_file:
- path: ./default.env
format: raw
- 以“#”开头的行将被当作注释处理并被忽略。
- 空行将被忽略。
- 未加引号和使用双引号(“”)的值会应用插值处理。
- 每行代表一个键值对。值可以选性地加上引号。
- 分隔键和值的分隔符可以是“=”或者“:”。
- 值前后空格均不被考虑
- VAR=VAL -> VAL
- VAR="VAL" -> VAL
- VAR='VAL' -> VAL
- VAR: VAL -> VAL
- VAR = VAL -> VAL
- 对于未加引号的值,其对应的内联注释必须以一个空格作为开头。
- VAR=VAL # comment -> VAL
- VAR=VAL# not a comment -> VAL# not a comment
- 对于引用的值,内联注释必须紧跟在该结束引号之后。
- VAR="VAL # not a comment" -> VAL # not a comment
- VAR="VAL" # comment -> VAL
- 单引号(')括起来的值会被原样使用
- VAR='$OTHER' -> $OTHER
- VAR='${OTHER}' -> ${OTHER}
- 引号可以用“\”进行转义。
- VAR='Let\'s go!' -> Let's go!
- VAR="{\"hello\": \"json\"}" -> {"hello": "json"}
- 在双引号括起来的值中,支持常见的 shell 转义序列,如 \n、\r、\t 和 \\ 。
- VAR="some\tvalue" -> some value
- VAR='some\tvalue' -> some\tvalue
- VAR=some\tvalue -> some\tvalue
# Set Rails/Rack environment
RACK_ENV=development
VAR="quoted"
34、environment:该属性定义了容器中设置的环境变量。environment 可以使用数组或映射的形式。任何布尔值(如 true、false、yes、no)都应使用引号括起来,以确保不会被 YAML 解析器转换为 True 或 False 。
环境变量可以通过一个单一的键来声明(等号后没有值),在这种情况下,Compose 会依赖于您来确定值。如果该值未被解析,该变量将被取消设置,并从服务容器的环境变量中移除。
#Map语法
environment:
RACK_ENV: development
SHOW: "true"
USER_INPUT:
#Array语法
environment:
- RACK_ENV=development
- SHOW=true
- USER_INPUT
如果为某个服务同时设置了 env_file 和 environment ,那么由 environment 设置的值将具有优先级。
35、expose:“expose”用于定义(传入的)端口或容器所暴露的端口范围。这些端口必须对关联的服务开放访问,并且不应发布到主机机器上。只能指定容器内部的端口。
语法为:/[] 或 /[] 用于表示端口范围)。若未明确指定,则默认使用 TCP 协议。
expose:
- "3000"
- "8000"
- "8080-8085/tcp"
如果镜像的 Dockerfile 已经开放了端口,那么即使在 Compose 文件中未设置 expose 选项,该端口也会对网络中的其他容器可见。
36、extends:允许在不同的文件之间,甚至在完全不同的项目之间共享通用配置。通过 extends,可以在一处定义一组通用的服务选项,并从任何地方引用它。可以引用另一个 Compose 文件,并选择您希望在自己的应用程序中使用的服务,同时还可以根据自身需求覆盖某些属性。
可以在任何服务上使用 extends 关键字,并结合其他配置键一起使用。extends 值必须是一个映射,通过指定必需的 service 以及可选的 file 键来定义。
extends:
file: common.yml
service: webapp
- 指定的服务未找到。
- 指定的Compose文件未找到
- 未定义该属性时说明继承的服务在当前Compose文件中定义
- 当属性值为文件路径时,可以是相对路径(相对于Compose文件所在的路径)也可以是绝对路径
- 映射:主服务定义中的键会覆盖引用服务定义中的键。未被覆盖的键将保持原样。
services:
common:
image: busybox
environment:
TZ: utc
PORT: 80
cli:
extends:
service: common
environment:
PORT: 8080
cli服务的实际配置如下:
environment:
PORT: 8080
TZ: utc
image: busybox
在 blkio_config.device_read_bps、blkio_config.device_read_iops、blkio_config.device_write_bps、blkio_config.device_write_iops 以及 devices 和 volumes 中的项目也被视为映射关系,其中键是容器内部的目标路径。例如:
services:
common:
image: busybox
volumes:
- common-volume:/var/lib/backup/data:rw
cli:
extends:
service: common
volumes:
- cli-volume:/var/lib/backup/data:ro
cli服务的实际配置如下所示,注意,已挂载的路径现在已指向新的卷名,并且已应用了“只读”标志。
image: busybox
volumes:
- cli-volume:/var/lib/backup/data:ro
如果所引用的服务定义中包含 extends 映射,则其下的各项将直接复制到新的合并定义中。然后再次启动合并过程,直至不再有 extends 键存在为止。例如:
services:
base:
image: busybox
user: root
common:
image: busybox
extends:
service: base
cli:
extends:
service: common
在此配置中,CLI 服务从 common 服务获取用户密钥,而 common 服务则从 base 服务获取该密钥。
image: busybox
user: root
- 序列:各项会组合成一个新的序列。元素的顺序会保持不变,引用的项排在前面,主项排在其后。
services:
common:
image: busybox
security_opt:
- label=role:ROLE
cli:
extends:
service: common
security_opt:
- label=user:USER
cli服务的实际配置如下
image: busybox
security_opt:
- label=role:ROLE
- label=user:USER
- 标量:主服务定义中的键优先于引用服务定义中的键。服务定义中的任何其他允许使用的键都应被视为标量类型。
external_links:
- redis
- database:mysql
- database:postgresql
- 短格式语法:将纯字符串以列表形式进行使用。对于其他主机,必须以“主机名=IP 地址”的形式设置主机名和 IP 地址。
extra_hosts:
- "somehost=162.242.195.82"
- "otherhost=50.31.209.229"
- "myhostv6=::1"
IPv6 地址可以用方括号括起来,例如:
extra_hosts:
- "myhostv6=[::1]"
分隔符推荐使用“=”,但“:”也可使用。此功能自 Docker Compose 2.24.1 版本起引入。例如:
extra_hosts:
- "somehost:162.242.195.82"
- "myhostv6:::1"
- 长格式语法:可以将 extra_hosts 设置为一个包含主机名与 IP 地址之间映射关系的字典。
extra_hosts:
somehost: "162.242.195.82"
otherhost: "50.31.209.229"
myhostv6: "::1"
Compose 会在容器的网络配置中创建一个与 IP 地址和主机名相匹配的条目,这意味着对于 Linux 系统的 /etc/hosts 文件会新增一些行:
162.242.195.82 somehost
50.31.209.229 otherhost
::1 myhostv6
39、gpus:需要Docker Compose 2.30.0及以上版本。指定了将用于容器运行的 GPU 设备。这相当于一个带有隐式 GPU 特性的设备请求。
services:
model:
gpus:
- driver: 3dfx
count: 2
此外,还可以将“gpus”设置为字符串 all ,以将所有可用的 GPU 设备分配给容器。
services:
model:
gpus: all
40、group_add:用于指定容器内的用户需要具备成员资格的其他组(可通过组名或组编号指定)。
这种情况的一个实际应用场景是:当多个容器(以不同用户身份运行)需要共同读取或写入同一个共享卷中的文件时。该文件可以由所有容器共用的一个组来拥有,并在“group_add”中进行指定。
services:
myservice:
image: alpine
group_add:
- mail
在创建的容器内部运行时,必须显示该用户属于 mail 组,如果未声明 group_add 则这种情况就不会出现。
41、healthcheck:“healthcheck”属性用于声明一个检查项,用于确定服务容器是否“健康”。其工作方式与服务的 Docker 镜像中设置的“HEALTHCHECK”Dockerfile 指令相同,并且具有相同的默认值。Compose 文件可以覆盖 Dockerfile 中设置的值。
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 1m30s
timeout: 10s
retries: 3
start_period: 40s
start_interval: 5s
interval, timeout, start_period, and start_interval 均被设定为持续时间单位。此功能自 Docker Compose 2.20.2 版本起引入。
test 定义了用于检查容器健康状况的命令 Compose。该命令可以是字符串形式,也可以是列表形式。如果它是列表形式,则第一个元素必须是 NONE、CMD 或 CMD-SHELL。如果它是字符串形式,则相当于先指定 CMD-SHELL,然后再添加该字符串。
使用“CMD-SHELL”会以容器的默认 shell(对于 Linux 系统为 /bin/sh)来运行配置为字符串形式的命令。以下两种形式是等效的:
test: ["CMD-SHELL", "curl -f http://localhost || exit 1"]
test: curl -f https://localhost || exit 1
“NONE”选项会禁用健康检查功能,其主要用途是通过服务的 Docker 镜像来禁用 Dockerfile 指令集Healthcheck。或者也可以通过设置“disable: true”来禁用由镜像设置的健康检查功能。
healthcheck:
disable: true
42、hostname:声明服务容器使用的自定义主机名。该主机名必须符合 RFC 1123 标准的规定。
43、image:指定了容器启动时所依据的镜像。镜像必须遵循开放容器规范可寻址镜像格式,
即 [<registry>/][<project>/]<image>[:<tag>|@<digest>]
image: redis
image: redis:5
image: redis@sha256:0ed5d5928d4737458944eb604cc8509e245c3e19d02ad83935398bc4b991aac7
image: library/redis
image: docker.io/library/redis
image: my_private.registry:5000/redis
如果该镜像不在该平台上,Compose 将会根据拉取策略尝试去获取它。如果您同时使用了“Compose 构建规范”,则还有其他方法可以控制从源代码构建镜像与先进行拉取操作之间的优先级关系,不过拉取镜像始终是默认操作方式。
只要在配置文件中声明了构建部分,就可以省略image属性,如果您未使用 Compose 构建规范,那么如果配置文件中缺少镜像,Compose 将无法正常工作。
44、init:init 会在容器内部运行一个初始化进程(进程 ID 为 1),该进程负责转发信号并回收进程。将此选项设置为“true”可为服务启用此功能。
services:
web:
image: alpine:latest
init: true
所使用的初始化二进制文件是针对特定平台的。
54、ipc:配置由服务容器设定的进程间通信隔离模式。
shareable:为容器分配其自身的私有 IPC 命名空间,并且可以与其他容器共享该命名空间。
service:{name} 使容器加入另一个容器的(可共享的)IPC 命名空间。
ipc: "shareable"
ipc: "service:[service name]"
55、isolation:指定了容器的隔离技术。支持的值因平台而异。
56、labels 为容器添加元数据。您可以使用数组或者映射来实现。建议使用反向 DNS 标记法,以避免您的标签与其他软件所使用的标签发生冲突。
labels:
com.example.description: "Accounting webapp"
com.example.department: "Finance"
com.example.label-with-empty-value: ""
labels:
- "com.example.description=Accounting webapp"
- "com.example.department=Finance"
- "com.example.label-with-empty-value"
Compose 会创建带有标准标签的容器:这些标签是 Docker Compose 自动添加的,不需要手动设置
com.docker.compose.project:将由 Compose 创建的所有资源设置为用户项目名称的形式。
com.docker.compose.service:将服务容器设置为与“Compose”文件中定义的服务名称相匹配的项。
com.docker.compose 标签前缀是保留的。在Compose文件中指定带有此前缀的标签会导致运行时错误。
57、label_file:需要Docker Compose 2.32.2及以上版本。该属性允许你从外部文件或一系列文件中为服务加载标签。这为管理多个标签提供了一种便捷的方式,避免了在“Compose”文件中造成混乱。该文件采用 key-value 格式,与环境文件(env_file)类似。你可以将多个文件以列表形式指定。使用多个文件时,将按照它们在列表中出现的顺序进行处理。如果同一标签在多个文件中均有定义,则列表中最后一个文件中的值将覆盖之前文件中的值。
services:
one:
label_file: ./app.labels
two:
label_file:
- ./app.labels
- ./additional.labels
如果一个标签在 label_file 指定的文件 和 labels 属性中都定义了,则以 labels 属性中的值为准。
58、links:用于定义指向另一个服务中容器的网络链接,可以同时指定服务名称和链接别名(SERVICE:ALIAS),或者仅指定服务名称。
web:
links:
- db
- db:database
- redis
链接服务的容器可通过与别名相同的主机名访问,或者如果未指定别名则可通过服务名称访问。
链接并非服务进行通信所必需的条件。若未设置特定的网络配置,任何服务都能通过其名称在 default 网络中访问到任何其他服务。如果服务指定了其所连接的网络,链接不会覆盖网络配置。未连接到共享网络的服务无法相互进行通信。Compose 不会提醒您有关配置不匹配的问题。
链接同样能够以与“depends_on”相同的方式隐性地表示服务之间的依赖关系,因此它们能够决定服务启动的顺序。
58、logging:定义服务的日志配置
logging:
driver: syslog
options:
syslog-address: "tcp://192.168.0.42:123"
- 0:关闭匿名页面交换功能。
- 100:将所有匿名页面设置为可交换页面。
- 如果将 memswap_limit 设置为一个正整数,那么必须同时设置 memory 和 memswap_limit。memswap_limit 表示可以使用的内存和交换空间的总量,而 memory 则控制非交换内存的使用量。因此,如果 memory="300m" 且 memswap_limit="1g",则容器可以使用 300m 的内存和 700m(1g - 300m)的交换空间。
- 如果 memswap_limit 被设置为 0,则该设置将被忽略,其值将被视为未设置。
- 如果 memswap_limit 的值与 memory 相同,并且 memory 被设置为一个正整数,那么容器将无法使用交换空间。
- 如果“memswap_limit”未被设置,而“memory”已设定,那么只要主机容器配置了交换内存,该容器就可以使用与“memory”设定值相同的交换空间容量。例如,如果“memory”设置为“300m”,而“memswap_limit”未被设定,那么该容器总共可以使用 600m 的内存和交换空间。
- 如果将 memswap_limit 明确设置为 -1,则容器可以使用无限量的交换空间,但上限为主机系统中的可用空间量。
services:
short_syntax:
image: app
models:
- my_model
long_syntax:
image: app
models:
my_model:
endpoint_var: MODEL_URL
model_var: MODEL
- endpoint_var 用于设置存储模型运行器 URL 的环境变量的名称。
- model_var 用于设置存储模型标识符的环境变量的名称。
- 将模型键转换为大写
- 将任何“-”字符替换为“_”
- 为端点变量添加“_URL”后缀
- none:关闭所有容器网络连接。
- host:让容器获得对主机网络接口的完全访问权限。
- service:{名称}:通过引用指定容器的服务名称,让容器获得对指定容器的访问权限。
- container:{名称}:通过引用指定容器的容器ID,让容器获得对指定容器的访问权限。
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
一旦设置,不允许使用 networks 属性,并且 Compose 拒绝任何同时包含这两个属性的 Compose 文件。
66、networks:定义了容器所连接的网络,它通过引用 networks 这一顶级元素下的各项条目来实现。该属性有助于管理容器的网络相关方面,能够控制服务在 Docker 环境中的分段方式及相互之间的交互。此属性用于指定该服务的容器应连接到哪些网络。这对于定义容器之间以及与外部的通信方式至关重要。
services:
some-service:
networks:
- some-network
- other-network
隐式默认网络:如果在 Compose 文件中未指定networks 或者networks的值是空的,那么 Compose 将假定该服务会连接到 default 网络:
services:
some-service:
image: foo
实际上该示例等同于:
services:
some-service:
image: foo
networks:
default: {}
如果你希望该服务不连接网络,那么必须将“network_mode”设置为“none”。
以下是具体网络的子属性:aliases、interface_name 、ipv4_address, ipv6_address、link_local_ips 、mac_address 、driver_opts 、gw_priority 、priority。
aliases :为网络中的服务声明了备用主机名。同一网络中的其他容器可以使用服务名称或别名来连接到该服务的任意一个容器。由于别名是网络范围内的,所以同一项服务在不同的网络中可以有不同的别名。网络范围内的别名可以被多个容器以及多个服务共享。如果存在这种情况,那么该名称所指向的确切容器是无法保证的。
services:
some-service:
networks:
some-network:
aliases:
- alias1
- alias3
other-network:
aliases:
- alias2
在以下示例中,服务 frontend 能够通过主机名 backend 或 “back-tier 网络别名 database 访问 backend 服务。服务 monitoring 则能够通过admin 网络中的 backend 或 mysql 访问同一 backend 服务。
services:
frontend:
image: example/webapp
networks:
- front-tier
- back-tier
monitoring:
image: example/monitoring
networks:
- admin
backend:
image: example/backend
networks:
back-tier:
aliases:
- database
admin:
aliases:
- mysql
networks:
front-tier: {}
back-tier: {}
admin: {}
interface_name:需要Docker Compose 2.36.0及以上版本。允许你指定用于将服务连接到特定网络的网络接口的名称。这确保了在不同服务和网络之间具有一致且可预测的接口名称。
services:
backend:
image: alpine
command: ip link show
networks:
back-tier:
interface_name: eth0
ipv4_address, ipv6_address:在加入网络时,为服务容器指定一个静态 IP 地址。在顶级 networks 属性中,相应的网络配置必须具有一个“ipam”属性,该属性下的子网配置需涵盖每个静态地址。
services:
frontend:
image: example/webapp
networks:
front-tier:
ipv4_address: 172.16.238.10
ipv6_address: 2001:3984:3989::10
networks:
front-tier:
ipam:
driver: default
config:
- subnet: "172.16.238.0/24"
- subnet: "2001:3984:3989::/64"
link_local_ips:指定了一个链路本地 IP 地址列表。链路本地 IP 是一种特殊的 IP 地址,属于一个众所周知的子网,并且完全由运营商管理,通常取决于其部署的架构。
services:
app:
image: busybox
command: top
networks:
app_net:
link_local_ips:
- 57.123.22.11
- 57.123.22.13
networks:
app_net:
driver: bridge
mac_address :需要Docker Compose 2.23.2及以上版本。设置服务容器在连接到此特定网络时所使用的 MAC 地址。
driver_opts :用于指定一系列以键值对形式呈现的选项,以传递给驱动程序。这些选项取决于具体的驱动程序。如需了解更多信息,请查阅该驱动程序的文档。
services:
app:
networks:
app_net:
driver_opts:
foo: "bar"
baz: 1
gw_priority:需要Docker Compose 2.33.1及以上版本。具有最高 gw_priority 值的网络将被选为服务容器的默认网关。若未指定,则默认值为 0 。在以下示例中,app_net_2 将被选为默认网关。
services:
app:
image: busybox
command: top
networks:
app_net_1:
app_net_2:
gw_priority: 1
app_net_3:
networks:
app_net_1:
app_net_2:
app_net_3:
priority :指定了 Compose 将服务的容器连接到其网络的顺序。若未指定,默认值为 0。
如果容器运行时在服务级别接受“mac_address”属性,那么该属性将被应用于具有最高优先级的网络。在其他情况下,请使用“networks.mac_address”属性。
优先级不会影响默认网关所选的网络。请使用“gw_priority”属性来实现这一目的。
优先级并不能控制网络连接在容器中的添加顺序,也不能用于确定容器内的设备名称(如 eth0 等)。
services:
app:
image: busybox
command: top
networks:
app_net_1:
priority: 1000
app_net_2:
app_net_3:
priority: 100
networks:
app_net_1:
app_net_2:
app_net_3:
67、oom_kill_disable:如果“oom_kill_disable”被设置为“是”,则 Compose 会将平台配置为在出现内存耗尽的情况时不会终止容器。
68、oom_score_adj:用于调整容器被平台强制终止的偏好设置,以应对内存耗尽的情况。其值必须在 -1000 到 1000 的范围内。值为被终止的优先级,值越高越容易被杀死。越低越不容易被杀死。
69、pid:用于设置由 Compose 创建的容器的 PID 模式。其支持的值因平台而异。
70、pids_limit:用于调整容器的进程标识符(PID)限制。将其设置为 -1 即表示无限制的 PID 数量。
pids_limit: 10
一旦设定,pid_limit 的值必须与部署规范中的 pid 属性保持一致。
71、platform:平台定义了服务容器运行所依赖的目标平台。其采用“os[/arch[/variant]]”的语法格式。os、arch 和 variant 的值必须符合 OCI 镜像规范所采用的约定。
Compose 利用此属性来决定要拉取的镜像版本以及服务构建将在哪个平台上进行。
platform: darwin
platform: windows/amd64
platform: linux/arm64/v8
- HOST 的设置为 [IP:](端口 | 范围)(可选)。若未进行设置,则会绑定到所有网络接口(0.0.0.0)。
- CONTAINER的设置为 端口 | 范围。
- PROTOCOL 将端口限制为指定的协议,即 TCP 或 UDP(可选)。默认协议为 TCP。
ports:
- "3000"
- "3000-3005"
- "8000:8000"
- "9090-9091:8080-8081"
- "49100:22"
- "127.0.0.1:8001:8001"
- "127.0.0.1:5000-5010:5000-5010"
- "::1:6000:6000"
- "[::1]:6001:6001"
- "6060:6060/udp"
注意:如果容器引擎不支持主机 IP 映射功能,那么 Compose 将会拒绝该 Compose 文件,并忽略所指定的主机 IP 。
长格式语法:这种长格式语法允许您配置一些在短格式中无法表达的额外字段。
target:容器端口。
published:公开暴露的端口。它被定义为一个字符串,并可以使用语法 start-end 的方式设置为一个范围。这意味着实际的端口会被分配一个在设定范围内的可用端口。
host_ip:主机 IP 映射。如果未设置,它会绑定到所有网络接口(0.0.0.0)。
protocol:端口协议(tcp 或 udp)。默认为 tcp。
app_protocol:此端口用于的应用协议(TCP/IP 级别4 / OSI 级别7)。这是可选的,并且可以作为 Compose 提供对它理解的协议更丰富行为的提示。在 Docker Compose 版本 2.26.0 中引入。
mode:在 Swarm 设置中指定端口的发布方式。如果设置为 host,它会在 Swarm 的每个节点上发布端口。如果设置为 ingress,它会在 Swarm 的节点之间允许负载均衡。默认为 ingress。
name:端口的人类可读名称,用于在服务中记录其使用情况。
ports:
- name: web
target: 80
host_ip: 127.0.0.1
published: "8080"
protocol: tcp
app_protocol: http
mode: host
- name: web-secured
target: 443
host_ip: 127.0.0.1
published: "8083-9000"
protocol: tcp
app_protocol: https
mode: host
- command:指定了容器启动后要运行的命令。此属性是必需的,并且您可以选择使用 shell 形式或 exec 形式。
- user:运行该命令的用户。如果未设置,则该命令将以与主服务命令相同的用户身份运行。
- privileged:允许 post_start 命令以具有特权访问权限的方式运行。
- working_dir:运行该命令的工作目录。如果未设置,则在与主服务命令相同的工作目录中运行。
- environment:为 post_start 命令专门设置环境变量。虽然该命令继承了为服务主命令定义的环境变量,但此部分允许您添加新变量或覆盖现有变量。
services:
test:
post_start:
- command: ./do_something_on_startup.sh
user: root
privileged: true
environment:
- FOO=BAR
欲了解更多信息,请参阅“使用生命周期钩子(Use lifecycle hooks.)”部分。
74、pre_stop:需要Docker Compose 2.30.0及以上版本。该属性定义了一组在容器停止之前运行的生命周期钩子。如果容器是自行停止或突然被终止的,那么这些钩子将不会运行。配置与 post_start相同。
75、privileged:配置服务容器以使用提升权限的方式运行。支持情况和实际影响因平台而异。
76、profiles:定义了服务在启用时所依据的命名配置文件列表。如果未进行指定,则服务将始终启动;但如果进行了指定,则只有在激活了相应的配置文件时,服务才会启动。如果存在的话,这些 profiles 将遵循 [a-zA-Z0-9][a-zA-Z0-9_.-]+ 这样的正则表达式格式。
services:
frontend:
image: frontend
profiles: ["frontend"]
phpmyadmin:
image: phpmyadmin
depends_on:
- db
profiles:
- debug
version: '3.9'
services:
# 基础服务 - 所有环境都需要
postgres:
image: postgres:15
environment:
POSTGRES_PASSWORD: secret
volumes:
- postgres_data:/var/lib/postgresql/data
redis:
image: redis:7-alpine
# 生产环境应用
app:
image: myapp:prod
environment:
- APP_ENV=production
- DB_HOST=postgres
depends_on:
- postgres
- redis
profiles: ["prod"]
ports:
- "8080:8080"
# 开发环境应用(带热重载)
app-dev:
image: myapp:dev
environment:
- APP_ENV=development
- DB_HOST=postgres
profiles: ["dev"]
volumes:
- ./app:/app
- /app/node_modules
ports:
- "3000:3000"
command: npm run dev
# 测试环境额外服务
selenium:
image: selenium/standalone-chrome
profiles: ["test", "integration"]
shm_size: 2gb
# 监控工具
prometheus:
image: prom/prometheus
profiles: ["monitoring"]
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
grafana:
image: grafana/grafana
profiles: ["monitoring"]
ports:
- "3001:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin
depends_on:
- prometheus
volumes:
postgres_data:
docker compose up 启动容器服务不带profiles标记的
docker compose --profile dev up 启动开发环境
docker compose --profile dev --profile monitoring up
docker compose --profile "*" up 启动所有服务,包括带prifiles的。
docker compose --profile dev config 查看不同profile的配置
77、provider:需要Docker Compose 2.36.0 及以上版本。该属性用于定义那些 Compose 无法直接管理的服务。Compose 将服务的生命周期交由专门的或第三方组件来负责管理。
database:
provider:
type: awesomecloud
options:
type: mysql
foo: bar
app:
image: myapp
depends_on:
- database
- type:属性是必需的。它定义了由 Compose 用于管理设置和拆除生命周期事件的外部组件。
- options:选项特定于所选的提供程序,且不由Compose规范进行验证。
- always:Compose 始终从镜像仓库拉取镜像。
- never:Compose 不会从镜像仓库拉取镜像,而是依赖平台缓存的镜像。如果没有缓存的镜像,则会报告失败。
- missing:仅当平台缓存中没有该镜像时,Compose 才会拉取镜像。如果未同时使用 Compose 构建规范,这是默认选项。为实现向后兼容,if_not_present 被视为该值的别名。即使使用“缺失时”拉取策略,也始终会拉取最新标签的镜像。
- build:Compose 构建镜像。如果镜像已存在,Compose 会重新构建该镜像。
- daily:如果上一次拉取操作发生在 24 小时之前,Compose 会检查镜像仓库以获取镜像更新。
- weekly:如果上一次拉取操作发生在 7 天之前,Compose 会检查镜像仓库以获取镜像更新。
- every_<时间段>:如果上一次拉取操作发生在<时间段>之前,Compose 会检查镜像仓库以获取镜像更新。时间段可以用周(w)、天(d)、小时(h)、分钟(m)、秒(s)表示,或使用这些单位的组合。
services:
test:
image: nginx
pull_policy: every_12h
- no:默认的重启策略。在任何情况下都不会重启容器。
- always:无论何时,只要容器被删除,该策略都会重启容器。
- on-failure[:max-retries]:如果退出代码表明存在错误,则该策略会重启容器。可选地,还可以限制 Docker 守护进程尝试的重启重试次数。
- unless-stopped:该策略无论退出代码如何都会重启容器,但在服务停止或被删除时会停止重启操作。
restart: "no"
restart: always
restart: on-failure
restart: on-failure:3
restart: unless-stopped
81、runtime:指定用于服务容器的运行时环境。例如,runtime 可以是 OCI 运行时规范的一种实现名称(an implementation of OCI Runtime Spec,),比如“runc”。
web:
image: busybox:latest
command: true
runtime: runc
默认使用的运行环境是“runc”。若要使用其他运行环境,请参阅“替代运行环境( Alternative runtimes)”部分。
82、scale:指定了此服务默认要部署的容器数量。若同时设置了这两个值,则“scale”必须与“Deploy Specification”中的“replicas”属性保持一致。
83、secrets:该属性允许按服务级别访问由“secrets”顶级元素定义的敏感数据。服务可以被授予访问多个 secret 的权限。
支持两种不同的语法形式:短格式语法和长格式语法。在同一个 Compose 文件中,可以同时使用长格式语法和短格式语法来表示密钥信息。
如果密钥不在平台上存在,或者未在“Compose”文件的顶层 secrets 部分中进行定义,那么该操作将会报告错误。
在顶级 secrets 定义的密钥禁止按时授予对该密钥的任何服务访问权限。此类授权必须在服务规范中明确列出,作为密钥服务元素的一部分。
短格式语法:这种段格式的语法变体仅指定了密钥名称。这使得容器能够访问该密钥,并将其以只读方式挂载到容器内的 /run/secrets/ 目录中。源名称和目标挂载点都设置为密钥名称。
以下示例使用了简短的语法来授予 frontend 服务对 server-certificate 密钥的访问权限。服务器证书的值被设置为文件“./server.cert”中的内容。
services:
frontend:
image: example/webapp
secrets:
- server-certificate
secrets:
server-certificate:
file: ./server.cert
- source:平台中该秘密的名称。
- target:在服务的任务容器中的 /run/secrets/ 目录中要挂载的文件的名称,或者如果需要使用其他位置,则为文件的绝对路径。如果未指定,则默认值为源。
- uid 和 gid:在服务的任务容器中的 /run/secrets/ 目录中拥有该文件的数字 uid 或 gid。
- mode:在服务的任务容器中的 /run/secrets/ 目录中挂载该文件的权限,以八进制表示形式。默认值为世界可读权限(模式 0444)。如果设置了.则可写位必须忽略。可以设置可执行位。
services:
frontend:
image: example/webapp
secrets:
- source: server-certificate
target: server.cert
uid: "103"
gid: "103"
mode: 0o440
secrets:
server-certificate:
file: ./server.cert
84、security_opt :改变了每个容器的默认标注方案。
security_opt:
- label=user:USER
- label=role:ROLE
如需更改默认的标签设置方案,请参阅“安全配置(Security configuration).”部分。
85、shm_size:配置了服务容器所允许使用的共享内存的大小(在 Linux 系统中为 /dev/shm 分区)。其值以字节为单位进行指定。
86、stdin_open:将服务的容器配置为使用已分配的输入标准流来运行。这与使用“-i”标志运行容器的效果相同。如需了解更多信息,请参阅“保持输入标准流打开(Keep stdin open)”。
支持的值为true 或者 false
87、stop_grace_period:规定了在尝试停止容器时,如果容器未响应 SIGTERM(或者与停止信号相关的任何其他信号)的情况下,Compose 必须等待多长时间,然后才会发送 SIGKILL 信号。该时间是以持续时间的形式来表示的。
默认情况下,容器在接收到 SIGKILL 信号前需等待 10 秒钟才会退出。
stop_grace_period: 1s
stop_grace_period: 1m30s
88、stop_signal :定义了 Compose 用于停止服务容器的信号。若未设置,则 Compose 会通过发送 SIGTERM 信号来停止这些容器。
stop_signal: SIGUSR1
89、storage_opt :定义服务存储驱动选项
storage_opt:
size: '1G'
90、sysctls:用于定义在容器中要设置的内核参数。sysctls 可以采用数组或映射的形式。
sysctls:
net.core.somaxconn: 1024
net.ipv4.tcp_syncookies: 0
sysctls:
- net.core.somaxconn=1024
- net.ipv4.tcp_syncookies=0
只能使用在内核中进行命名空间处理的系统控制参数。Docker 不支持在容器内部更改系统控制参数,因为这会同时影响主机系统。有关支持的系统控制参数的概述,请参阅在运行时配置命名空间内核参数(configure namespaced kernel parameters (sysctls) at runtime)。
91、tmpfs:在容器内部挂载一个临时文件系统。该文件系统可以是一个单一的值,也可以是一个列表。
tmpfs:
- <path>
- <path>:<options>
- path:容器内部用于挂载 tmpfs 的路径。
- options:以逗号分隔的用于 tmpfs 挂载的选项列表。可用的选项如下:
- mode:设置文件系统的权限。
- uid:设置拥有已挂载的 tmpfs 文件系统的用户 ID 。
- gid:设置拥有已挂载的 tmpfs 文件系统的组 ID。
services:
app:
tmpfs:
- /data:mode=755,uid=1009,gid=1009
- /run
92:tty:将服务的容器配置为以终端仿真器(TTY)的形式运行。这与使用 -t 或 --tty 标志运行容器的效果相同。如需了解更多信息,请参阅“分配伪终端”。
支持的值为 true 或者 false。
93、ulimits :覆盖容器的默认限制设置。其设定方式为:对于单个限制,可指定为一个整数;对于软限制或硬限制,则需以映射形式进行指定。
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
94、use_api_socket :当“use_api_socket”被设置时,容器能够通过 API 通道与底层容器引擎进行交互。凭证会被挂载到容器内部,因此该容器仅作为针对容器引擎相关命令的纯粹执行代理。通常,由容器运行的命令可以将内容推送到您的注册表中,并从您的注册表中拉取内容。
95、user:覆盖用于运行容器进程的用户。默认设置由镜像决定,例如 Dockerfile 中的 USER 指令。如果没有设置,默认则是以 root 身份运行。
96、userns_mode :用于设置服务的用户命名空间。其支持的值因平台而异,并可能取决于平台的配置情况。
userns_mode: "host"
- host:使容器使用与主机相同的 UTS 命名空间
uts: "host"
98、volumes:用于定义服务容器可访问的挂载主机路径或命名卷。可以使用 volumes属性定义多种类型的挂载,比如 volume、bind、tmpfs或npipe。
如果挂载的是主机路径,并且只有单个服务使用,可以声明为服务定义的一部分。如果在多个服务之间重复使用一个卷,需要在顶级属性volumes中声明一个命名卷。
以下示例展示了 backend 服务使用了命名卷 db-data,还有一个单个服务的绑定挂载。
services:
backend:
image: example/backend
volumes:
- type: volume
source: db-data
target: /data
volume:
nocopy: true
subpath: sub
- type: bind
source: /var/run/postgres/postgres.sock
target: /var/run/postgres/postgres.sock
volumes:
db-data:
- VOLUME:可以是托管容器的平台上的主机路径(绑定挂载)或者是一个卷名称。
- CONTAINER_PATH:卷在容器中的挂载路径。
- ACCESS_MODE:以逗号分隔的选项列表:
- rw:读写访问。如果未指定则为默认值。
- ro:只读访问。
- z:SELinux 选项,表示绑定挂载的主机内容在多个容器之间共享。
- Z:SELinux 选项,表示绑定挂载的主机内容是私有且不供其他容器共享。
- 在未安装 SELinux 的系统中,SELinux 的重新标签绑定挂载选项将被忽略。
- 部署到本地容器运行时的时候,Compose只支持相对的主机路径。因为相对路径是从 Compose 文件的父目录中解析出来的,而这种解析方式仅适用于本地环境。当 Compose 部署到非本地平台时,它会拒绝使用相对主机路径的 Compose 文件,并会给出错误提示。为了避免命名卷的歧义,相对路径应始终以 . 或... 开头。
- 对于绑定挂载,短格式语法会在主机上的源路径处创建一个目录(如果该目录不存在的话)。这是为了与 Docker Compose 的旧版本保持兼容性。可以通过使用长格式语法并设置 create_host_path 为 false 来避免这种情况。
- type:挂载类型。可选值为 volume, bind, tmpfs, image, npipe 或 cluster。
- source:挂载的来源,绑定挂载为主机上的路径、镜像挂载为 Docker 镜像引用,或者是在顶层“volumes”键中定义的卷的名称。对于 tmpfs 挂载不适用。
- target:容器中挂载卷的路径。
- read_only:设置卷为只读的标志。
- bind:用于配置额外的绑定选项:
- propagation:用于绑定的传播模式。
- create_host_path:如果源路径所在的主机目录不存在,则创建该目录。默认值为 true。
- selinux: 重新标签选项 z(共享)或 Z(私有)
- volume:配置额外的卷选项:
- nocopy:创建卷时禁用从容器中复制数据的标志。
- subpath:在卷内部挂载的路径,而非卷根路径。
- tmpfs:配置额外的 tmpfs 选项:
- size:tmpfs 挂载的大小(以字节为单位,可以是数字或以字节单位表示)。
- mode:tmpfs 挂载的文件模式,以 Unix 权限位(八进制数)表示。在 Docker Compose 版本 2.14.0 中引入。
- image:配置额外的镜像选项:
- subpath:在源镜像内部指定用于挂载的路径,而非镜像根目录。在 Docker Compose 版本 2.35.0 中可用。
- consistency:挂载的一致性要求。可用值取决于平台。
volumes_from:
- service_name
- service_name:ro
- container:container_name
- container:container_name:rw
100、working_dir :覆盖容器所指定的、由镜像定义的工作目录,例如 Dockerfile 中的“WORKDIR”指令所指定的目录。
更多推荐
所有评论(0)