©
本文档使用
php.cn手册 发布
Compose文件是一个定义Docker应用程序的服务,网络和卷的YAML文件。
现在在这些参考文献中描述了撰写文件格式,这些文件格式针对每个版本。
参考文件 | 在这个版本中改变了什么 |
---|---|
版本3(最新,推荐) | 版本3更新 |
版本2 | 版本2更新 |
版本1 | 版本1更新 |
下面的主题解释了版本之间的差异,Docker Engine兼容性以及如何升级。
有几种版本的Compose文件格式 - 1,2,2.x和3.x
此表显示哪些Compose文件版本支持特定的Docker版本。
Compose file format | Docker Engine release |
---|---|
3.3 | 17.06.0+ |
3.2 | 17.04.0+ |
3.1 | 1.13.1+ |
3.0 | 1.13.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.+ |
除了表格中显示的Compose文件格式版本外,Compose本身的发布时间表也如发布版本中所示,但文件格式版本并不一定随每个发行版而增加。例如,Compose文件格式3.0首先在Compose版本1.10.0中引入,并在随后的版本中逐步版本化。
在Docker和Compose兼容性上寻找更多细节?我们建议尽可能保持最新的版本。但是,如果您使用的是较旧版本的Docker,并且想要确定哪个Compose版本兼容,请参阅撰写发行说明。每套发行说明都详细介绍了哪些版本的Docker Engine受支持,以及兼容的Compose文件格式版本。(另见#3404号讨论。)
有关版本和如何升级的详细信息,请参阅版本控制和升级。
目前有三种版本的Compose文件格式:
版本1,传统格式。这是通过省略version
YAML根部的一个键来指定的。
版本2.x. 这是通过YAML根部的一个version: '2'
或者version: '2.1'
等等条目指定的。
版本3.x是最新和推荐的版本,旨在在Compose和Docker Engine的swarm模式之间交叉兼容。这是通过YAML根部的一个version: '3'
或者version: '3.1'
等等条目指定的。
兼容性矩阵显示映射到Docker Engine发行版的Compose文件版本。
要将项目移到更高版本,请参阅升级部分。
注意:如果您使用多个Compose文件或扩展服务,则每个文件的版本必须相同 - 例如,不能在单个项目中混合使用版本1和版本2。
根据您使用的版本,有几件事情会有所不同:
结构和允许的配置键
您必须运行的最低Docker引擎版本
撰写关于网络的行为
下面将解释这些差异。
撰写不声明版本的文件被认为是“版本1”。在这些文件中,所有服务都是在文档的根部声明的。
版本1是支持撰写高达1.6.x版。它将在未来的Compose版本中被弃用。
版本1文件不能声明命名卷,网络或构建参数。
使用版本1时,Compose不利用网络:每个容器都放置在默认bridge
网络上,并且可以通过其IP地址上的每个其他容器进行访问。您将需要使用链接来启用容器之间的发现。
例:
web: build: . ports: - "5000:5000" volumes: - .:/code links: - redis redis: image: redis
使用版本2语法撰写文件必须在文档的根目录中指明版本号。所有服务必须在services
密钥下声明。
版本2文件由Compose 1.6.0+支持,并且需要版本为1.10.0+的Docker引擎。
命名卷可以在volumes
密钥下声明,网络可以在networks
密钥下声明。
默认情况下,每个容器都加入一个应用程序范围的默认网络,并且可以在与服务名称相同的主机名上发现。这意味着链接很不必要。有关更多详细信息,请参阅撰写中的联网。
简单的例子:
version: '2'services: web: build: . ports: - "5000:5000" volumes: - .:/code redis: image: redis
一个更广泛的例子,定义卷和网络:
version: '2'services: web: build: . ports: - "5000:5000" volumes: - .:/code networks: - front-tier - back-tier redis: image: redis volumes: - redis-data:/var/lib/redis networks: - back-tier volumes: redis-data: driver: local networks: front-tier: driver: bridge back-tier: driver: bridge
添加了其他几个选项来支持联网,例如:
aliases
该depends_on
选项可用于代替链接以指示服务和启动顺序之间的依赖关系。版本:'2'服务:web:build:。depends_on: - db - redis redis:image:redis db:image:postgres
ipv4_address
, ipv6_address
版本2中也添加了变量替换。
引入仅在Docker引擎版本1.12.0以上提供的新参数的版本2的升级。Compose 1.9.0+支持版本2.1文件。
引入以下附加参数:
link_local_ips
isolation
labels
对于卷和网络
name
为卷
userns_mode
healthcheck
sysctls
pids_limit
2.1版本的升级引入了仅在Docker Engine版本1.13.0+中可用的新参数。Compose 1.13.0+支持版本2.2文件。该版本还允许您指定服务配置中的默认缩放编号。
引入以下附加参数:
init
scale
2.2版的升级引入了仅在Docker Engine版本17.06.0以上版本中提供的新参数。Compose 1.16.0+支持版本2.3文件。
引入以下附加参数:
target
用于构建配置
start_period
对于 healthchecks
为了在Compose和Docker Engine的swarm模式之间交叉兼容,版本3删除了几个选项并添加了更多选项。
删除:volume_driver
,volumes_from
,cpu_shares
,cpu_quota
,cpuset
,mem_limit
,memswap_limit
,extends
,group_add
。请参阅升级指南以了解如何迁移这些指南。(有关更多信息extends
,请参阅扩展服务。)
补充:部署
引入仅适用于Docker Engine 17.06.0及更高版本的新参数的版本3的升级。
引入以下附加参数:
建立 labels
credential_spec
configs
部署 endpoint_mode
在版本2.x和3.x之间,撰写文件的结构是相同的,但是几个选项已被删除:
volume_driver
:不是在服务上设置卷驱动,而是使用顶层volumes
选项定义卷并在那里指定驱动。版本:“3”服务:db:image:postgres卷: - data:/ var / lib / postgresql / data卷:data:驱动程序:mydriver
volumes_from
:要在服务之间共享卷,请使用顶级volumes
选项对其进行定义,并从使用服务级别volumes
选项共享服务的每个服务中引用它。
cpu_shares
,cpu_quota
,cpuset
,mem_limit
,memswap_limit
:这些已被替换下的资源键deploy
。请注意,deploy
配置仅在使用时生效docker stack deploy
,并被忽略docker-compose
。
extends
:对于version: "3.x"
撰写文件,此选项已被删除。(有关更多信息,请参阅扩展服务。)
group_add
:对于version: "3.x"
撰写文件,此选项已被删除。
pids_limit
:此选项尚未在version: "3.x"
Compose文件中引入。
link_local_ips
in networks
:该选项尚未在version: "3.x"
Compose文件中引入。
在大多数情况下,从版本1移动到2是一个非常简单的过程:
将整个文件缩进一层,并services:
在顶部放置一个键。
version: '2'
在文件顶部添加一行。
如果您使用特定的配置功能,则会更加复杂:
dockerfile
:现在生活在build
关键之下:build:context:。dockerfile:Dockerfile-alternate
log_driver
,log_opt
:这些现在生活在logging
密钥下:logging:driver:syslog options:syslog-address:“tcp://192.168.0.42:123”
links
使用环境变量:如环境变量引用中所述,由链接创建的环境变量已被弃用一段时间。在新的Docker网络系统中,它们已被删除。您应该直接连接到适当的主机名或使用链接主机名设置相关的环境变量:web:links: - db environment: - DB_PORT = tcp:// db:5432
external_links
:Compose在运行版本2项目时使用Docker网络,因此链接的行为稍有不同。特别是,两个容器必须连接到至少一个共同的网络才能通信,即使明确地链接在一起。将外部容器连接到应用程序的默认网络,或者将外部容器和服务的容器连接到外部网络。
net
:这现在被network_mode:net:host - > network_mode:host net:bridge - > network_mode:bridge net:none - > network_mode:none 替代如果您正在使用net: "container:[service name]"
,您现在必须network_mode: "service:[service name]"
改用它。net:“container:web” - > network_mode:“service:web”如果你正在使用net: "container:[container name/id]"
,这个值不需要改变。net:“container:cont-name” - > network_mode:“container:cont-name”net:“container:abc12345” - > network_mode:“container:abc12345”
volumes
使用命名卷:现在必须在volumes
Compose文件的顶级部分显式声明这些命令。如果某个服务装载了一个已命名的卷data
,则必须data
在顶级volumes
部分中声明一个卷。整个文件可能如下所示:版本:'2'服务:db:image:postgres卷: - data:/ var / lib / postgresql / data卷:data:默认情况下,Compose创建一个卷,其名称带有前缀与您的项目名称。如果您希望仅调用data
它,请将其声明为external:volumes:data:external:true