当前位置 博文首页 > RtxTitanV的博客:Docker Compose配置文件详解(V3)
Docker Compose配置文件是Docker Compose的核心,用于定义服务、网络和数据卷。格式为YAML,默认路径为./docker-compose.yml
,可以使用.yml
或.yaml
扩展名,目前Compose配置文件格式的最新版本为V3。Compose配置文件中涉及的配置项也比较多,但大部分配置项的含义跟docker run
命令相关选项是类似的。
本文主要参考官方文档对目前最新的V3版Compose配置文件进行一个总结。都是一些概念性的内容,不涉及具体操作。
这里主要对Compose配置文件的版本的相关要点进行一个简单的总结。至于每个版本具体的变化和升级信息可以参考官方的Compose配置文件版本与升级指南。
当前有三种版本的Compose配置文件格式:
version
来指定。bridge
网络上,并且可以从其他容器的IP地址访问,需要使用links
来启用容器之间的发现。version
来指定,具体配置如version: '2'
或version: '2.1'
等。2
,且所有服务必须在services
配置项下声明。links
不是必要的。version
来指定,具体配置如version: '3'
或version: '3.1'
等。关于Compose配置文件版本的常见注意事项:
0
而不是最新版本,因此将不支持再更高版本中才加入的新功能。比如version: '3'
,使用的是3.0版本而不是目前最新的3.8版本。Compose配置文件格式具有多种版本。其中Compose配置文件格式版本与Docker的兼容性关系如下表所示:
Compose配置文件格式版本 | Docker Engine版本 |
---|---|
3.8 | 19.03.0+ |
3.7 | 18.06.0+ |
3.6 | 18.02.0+ |
3.5 | 17.12.0+ |
3.4 | 17.09.0+ |
3.3 | 17.06.0+ |
3.2 | 17.04.0+ |
3.1 | 1.13.1+ |
3.0 | 1.13.0+ |
2.4 | 17.12.0+ |
2.3 | 17.06.0+ |
2.2 | 1.13.0+ |
2.1 | 1.12.0+ |
2.0 | 1.10.0+ |
1.0 | 1.9.1.+ |
如果使用的较旧版本的Docker,可以参考官方的Compose版本发布列表。其中的每组发行说明都详细说明了支持的Docker Engine版本和兼容的Compose配置文件格式版本。
在1.20.0版本,Compose在docker-compose
命令中引入了一个新的选项--compatibility
,目的在于帮助开发人员更轻松地过渡到V3版。启用该选项后,docker-compose
命令会读取每个服务定义的deploy
部分,并尝试将其转换为等效的V2配置项。目前,以下deploy
下的配置项已被转换:
resources
下的limits
和reservations
下的memory
replicas
restart_policy
下的 condition
和max_attempts
所有的其他配置项都将被忽略,如果这些被忽略的配置项存在则会发出一个警告。可以使用带--compatibility
的Config
命令查看将用于deploy的配置。
注意请勿在生成环境使用兼容模式!
建议不要在生产环境中使用--compatibility
选项。由于使用非Swarm模式属性生成的配置仅是近似值,因此可能会产生意外的结果。
Docker Compose配置文件是一个用于定义服务、网络和数据卷的YAML文件。其中服务定义了该服务启动的每个容器的配置,就像将命令行参数传递给docker run
一样,网络和数据卷的定义类似于docker network create
和docker volume create
。跟docker run
一样,如果在Dockerfile中通过诸如CMD
、EXPOSE
、VOLUME
和ENV
这些指令指定了相关选项,那么在默认情况下,不需要在docker-compose.yml
中再次指定它们。下面是从官网引过来的一个Compose配置文件的示例,可以先大致了解一下它的结构:
version: "3.8"
services:
redis:
image: redis:alpine
ports:
- "6379"
networks:
- frontend
deploy:
replicas: 2
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
db:
image: postgres:9.4
volumes:
- db-data:/var/lib/postgresql/data
networks:
- backend
deploy:
placement:
constraints:
- "node.role==manager"
vote:
image: dockersamples/examplevotingapp_vote:before
ports:
- "5000:80"
networks:
- frontend
depends_on:
- redis
deploy:
replicas: 2
update_config:
parallelism: 2
restart_policy:
condition: on-failure
result:
image: dockersamples/examplevotingapp_result:before
ports:
- "5001:80"
networks:
- backend
depends_on:
- db
deploy:
replicas: 1
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
worker:
image: dockersamples/examplevotingapp_worker
networks:
- frontend
- backend
deploy:
mode: replicated
replicas: 1
labels: [APP=VOTING]
restart_policy:
condition: on-failure
delay: 10s
max_attempts: 3
window: 120s
placement:
constraints:
- "node.role==manager"
visualizer:
image: dockersamples/visualizer:stable
ports:
- "8080:8080"
stop_grace_period: 1m30s
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement:
constraints:
- "node.role==manager"
networks:
frontend:
backend:
volumes:
db-data:
顶层的version
、services
、networks
和volumes
将Compose配置文件分为四个部分,其中version
指定Compose配置文件的版本,services
定义服务,networks
定义网络,volumes
定义数据卷。
服务定义了该服务启动的每个容器的配置,就像将命令行参数传递给docker run
一样。比如以下配置:
services:
redis:
image: redis:alpine
services
下的redis
是用户自定义的服务名称,redis
下的image
只是众多服务配置项中的其中一个,意思是指定镜像名称或id。下面就对服务的相关配置项进行一个总结。
在构建时应用的配置项。一般直接指定Dockerfile
所在文件夹路径,可以是绝对路径,或者相对于Compose配置文件的路径。可以指定为包含构建上下文(context)路径的字符串。例如:
version: "3.8"
services:
webapp:
build: ./dir
也可以使用context
指定上下文路径,使用dockerfile
基于上下文路径指定Dockerfile文件,使用args
指定构建参数。例如:
version: "3.8"
services:
webapp:
build:
context: ./dir
dockerfile: Dockerfile-alternate
args:
buildno: 1
如果同时指定了build
和image
。例如:
build: ./dir
image: webapp:tag
Compose会在./dir
目录下构建一个名为webapp
,标签为tag
的镜像。
使用
docker stack deploy
时的注意事项:在swarm mode下部署堆栈时,build
配置项被忽略。因为docker stack
命令不会在部署之前构建镜像。
指定包含Dockerfile
的目录路径或git仓库url。该目录是发送给Docker守护进程(Daemon)的构建上下文(context)。当配置的值是相对路径时,它将被解释为相对于Compose配置文件的路径。例如:
build:
context: ./dir
指定上下文为Compose配置文件目录下的dir
目录。
指定Dockerfile文件。Compose会使用指定的Dockerfile文件构建镜像,但必须要指定构建上下文路径。例如:
build:
context: .
dockerfile: Dockerfile-alternate
Compose会使用Compose配置文件所在目录下名为Dockerfile-alternate
的Dockerfile文件构建镜像。
添加构建参数,这些只能在构建过程中访问的环境变量。首先在Dockerfile文件中指定参数:
ARG buildno
ARG gitcommithash
RUN echo "Build number: $buildno"
RUN echo "Based on commit: $gitcommithash"
然后build
中指定参数,以下两种写法都可以:
build:
context: .
args:
buildno: 1
gitcommithash: cdc3b19
build:
context: .
args:
- buildno=1
- gitcommithash=cdc3b19
这时构建过程中使用的参数的值为args
指定的值。在指定构建参数时也可以不指定值,在这种情况下,构建过程中使用的参数的值为运行Compose的环境中的值。例如:
args:
- buildno
- gitcommithash
使用布尔值时的注意事项:YMAL中布尔类型的值(
"true"
、"false"
、"yes"
、"no"
、"on"
、"off"
)必须用引号引起来,以便解析器将它们解释为字符串。
在3.2版的配置文件格式中加入
指定缓存解析镜像列表。例如:
build:
context: .
cache_from:
- alpine:latest
- corp/web_app:3.14
在3.3版的配置文件格式中加入
将元数据以标签的形式添加到生成的镜像中。可以使用数组或字典两种格式。推荐使用反向DNS写法以避免和其他应用的标签冲突。例如:
build:
context: .
labels:
com.example.description: "Accounting webapp"
com.example.department: "Finance"
com.example.label-with-empty-value: ""
build:
context: .
labels:
- "com.example.description=Accounting webapp"
- "com.example.department=Finance"
- "com.example.label-with-empty-value"
在3.4版的配置文件格式中加入
设置容器网络连接以获取构建过程中的RUN
指令。例如:
build:
context: .
network: custom_network_1
设置为none
可以在构建期间禁用网络连接。例如:
build:
context: .
network: none
在3.5版的配置文件格式中加入
指定容器的/dev/shm
分区大小。指定的值为表示字节数的整数值或表示字节值的字符串。例如:
build:
context: .
shm_size: 10000000
build:
context: .
shm_size: '2gb'
在3.4版的配置文件格式中加入
指定在Dockerfile中定义的构建阶段,即镜像只构建到指定阶段就停止构建。例如:
build:
context: .
target: prod
指定构建阶段为prod
,即镜像只构建到prod
阶段,prod
阶段之后的内容不会被构建。
添加或删除容器内核能力(capability)。完整的capability列表可查看man 7 capabilities。例如,让容器拥有所有内核能力:
cap_add:
- ALL
例如,删除NET_ADMIN
和SYS_ADMIN
能力:
cap_drop:
- NET_ADMIN
- SYS_ADMIN
使用
docker stack deploy
时的注意事项:在swarm mode下部署堆栈时,cap_add
和cap_drop
配置项将被忽略。
为容器指定一个可选的父控制组。例如:
cgroup_parent: m-executor-abcd
使用
docker stack deploy
时的注意事项:在swarm mode下部署堆栈时,cgroup_parent
配置项将被忽略。
覆盖容器启动后默认执行的命令。可以写成字符串形式。例如:
command: bundle exec thin -p 3000
也可以写成JSON数组形式。例如:
command: ["bundle", "exec", "thin", "-p", "3000"]
在3.3版的配置文件格式中加入
为每个服务授予对配置(configs)的访问权限。支持short和long两种格式的语法。更多configs信息,参考configs。
注意:该配置(config)必须已存在或者在堆栈文件顶层
configs
配置项中定义,否则堆栈部署将失败。
short语法仅指定config名称来授予容器访问config的权限并将其挂载到容器的/<config_name>
上。source名称和目标挂载点都设置为config名称。例如以下示例,授予了redis
服务对configs的my_config
和my_other_config
的访问权限,其中my_config
的值设置到文件./my_config.txt
的内容中,my_other_config
定义为外部资源,这意味着它已经在Docker中通过运行docker config create
命令或其他堆栈部署进行定义,如果外部config不存在,堆栈部署将会失败并显示config not found
错误:
version: "3.8"
services:
redis:
image: redis:latest
deploy:
replicas: 1
configs:
- my_config
- my_other_config
configs: