Compose file文件的使用说明
Docker Compose编排工具的使用非常简单,只需要如下三步。
(1)编写Dockerfile文件。使用Dockerfile定义应用程序的环境,这样可以在任何地方使用他,Dockerfile的作用就是为每个服务构建镜像;
(2)定义yml文件(通常是docker-compose.yml)。就是将前面介绍的服务部署指令及相关参数都统一在该文件中编写和配置,这样就省去了针对不同服务各自运行的麻烦;
(3)运行服务部署指令。根据具体的部署需求,来执行相应的部署指令,Docker会读取docker-compose.yml文件内容启动整个应用服务。
在上述三步中,第一步中Dockerfile文件的编写已经在第7章有过讲解,而第三部的服务部署指令会在后面服务部署环节进行说明,所以现在需要掌握的就是如何编写docker-compose.yml文件。接下来,将针对Compose file文件的定义和配置进行详细讲解。
这里先通过一个Compose file文件的示例来进行展示说明,具体内容如文件1所示。
文件1 docker-compose.yml
1 version: '3'
2 services:
3 web:
4 image: id/imagename:lable
5 restart: on-failure
6 container_name: my-web-container
7 ports:
8 - 8080:8080
9 networks:
10 - example-net
11 depends_on:
12 - db
13 deploy:
14 replicas: 2
15 restart_policy:
16 condition: on-failure
17 db:
18 image: mysql:5.6
19 restart: on-failure
20 container_name: my-mysql-container
21 ports:
22 - 3306:3306
23 volumes:
24 - example-mysql:/var/lib/mysql
25 networks:
26 - example-net
27 environment:
28 MYSQL_ROOT_PASSWORD: root
29 MYSQL_DATABASE: mysql_database
30 deploy:
31 replicas: 1
32 restart_policy:
33 condition: on-failure
34 placement:
35 constraints: [node.role == manager]
36 networks:
37 example-net:
38 volumes:
39 example-mysql:
针对文件1中的内容,先不用过多考虑细节描述,在总体上可以看到以下配置内容。
● version:"3"表示文件是使用3版本的约束进行编写的;
● services:下面包含有web和db两个服务配置项,每一个服务配置项都有镜像image、端口ports、网络networks和部署deploy等配置信息,同时web服务配置依赖于db服务配置;
● networks(网络)和volumes(数据卷):在服务部署时会自动创建example-net网络和example-mysql数据卷。
结合上述示例进行整体介绍后,相信大家已经对Compose file文件的配置和样式已经有了一个初步的了解。下面将对Compose file文件中一些常用的配置进行更详细的解释,具体说明如下。
1. version(版本)
version通常在一个docker-compose.yml文件的最顶部,用来表示文件内容的约束版本(类似于XML文件约束),本书编写时的最新版本为3.3版本。
2. services(服务)
services用来声明服务,在services下的所有同缩进的应用名称都代表一个服务,如上面示例中的web和db。在进行多服务部署的时候,有多少个服务需要同时部署,就需要在services参数下面声明并配置多少个服务。
3. image(镜像)
所有启动的服务都是依赖镜像构建的,所以每一个服务下面首先要声明依赖的镜像名称,一般都是xxx/xxx:lable的形式。如果是本地私有仓库镜像,一般为IP:PORT/xxx:lable(如果省略了lable标签,则默认是latest)的形式。
4. restart(重启策略)
restart表示服务重启策略,在使用Compose file文件启动所有服务过程中,有些服务由于个别原因可能会启动失败。为了保证服务正常启动,需要使用该参数来确定服务重启(在集群环境下该属性会被忽略)。
restart服务重启策略可以设为四个值,分别如下。
restart: "no" #服务默认值为no,即服务失败后没有任何动作
restart: always #表示服务会一直重新启动
restart: on-failure #表示服务提示失败错误后会重新启动
restart: unless-stopped #表示只有服务在停止后才会重启
5. container_name(容器名称)
container_name 表示单个服务启动后的容器名称。在3版本以后,如果是在集群多实例环境下部署,该参数就会被忽略。
6. ports(端口)
ports用于指定服务向外暴露的端口。Compose支持多种形式的ports端口映射,在上面示例中使用了比较常规的端口映射方式(宿主机端口:容器端口)来暴露服务。
7. networks(网络)
networks用于配置服务网络。在前面介绍Docker时,已经介绍过在进行服务部署时最好使用自定义网络,这里就可以使用networks参数。上面示例中指定了各个服务启动后的网络管理为example-net,该网络会在服务启动时自动创建。
8. depends_on(服务依赖)
depends_on表示多个服务之间的依赖关系,用来确定服务启动的先后顺序。针对该参数,需要特别注意以下两点。
● depends_on决定了服务的依赖关系,如示例中的web依赖db,所以db服务会先于web服务启动,但并不表示db服务完全启动成功后才启动web服务,它只决定启动的先后顺序而已;
● 在3版本中,depends_on参数将会被忽略。
9. links(服务关联)
links表示多个服务之间的相互访问关系,即可以通过服务名称或别名来访问关联的服务;同时也具有depends_on参数一样的服务依赖关系,即可以确定服务启动的先后顺序。针对该参数,也需要注意以下几点。
● 同depends_on一样,links确定了服务的依赖关系,但它只决定服务启动的先后顺序而已;
● 如果同时定义了links和networks参数,使用links连接的服务必须有一个共同的网络;
● 在3版本中,links参数也将会被忽略。
10. deploy(服务集群部署)
deploy参数是Docker Compose针对Swarm集群部署提供的(在非集群环境下该参数及其子参数会被忽略)。该参数及其子参数专门用于指定与服务部署和运行相关的配置,并且该参数只有在3版本以及部署到Swarm集群时才会生效。
11. replicas(服务实例副本)
replicas表示服务实例的副本数量。在Swarm集群环境下,为了实现服务器端的负载均衡,通常会将一个服务实例复制多个副本运行,如上述实例中的web服务就提供了2个副本。
12. restart_policy(重启策略)
restart_policy参数同前面介绍的restart类似,都是用来配置服务重启策略的,只是该属性配置在deploy参数下,并只在集群环境下生效。该参数包含多个子属性及属性值,具体示例如下。
restart_policy:
condition: on-failure #表示服务重启的条件,值有none、on-failure和any
delay: 5s #表示重启服务之间等待时间,默认为0
max_attempts: 3 #表示失败后尝试重启的次数
window: 120s #表示等待多久来确定服务是否启动成功
13. placement(位置约束)
placement用来配置指定位置的约束,当服务在Swarm集群环境下部署时会随机分配到管理节点和其他工作节点上。在上述示例中由于将mysql数据挂载到了本机example-mysql数据卷中,所以使用了placement的子参数constraints: [node.role == manager]指定该服务只在manager管理节点上运行。
14. volumes(数据卷)
volumes表示数据卷,就是将容器中的数据备份到宿主机地址(具体可回顾前面章节介绍的数据管理)。上述示例中是将mysql数据挂载到本地example-mysql数据卷中,如果该数据卷不存在,服务启动时也会默认创建。
15. environment(环境变量)
environment用于配置服务启动时需要的环境变量,如上述示例中MYSQL_ROOT_PASSWORD表示数据库root用户的密码,MYSQL_DATABASE表示数据库启动后自动创建的数据库。
至此,针对Compose file文件的主要配置参数就已经介绍完毕。在实际服务部署过程中,Compose file文件只需要配置一些主要的参数即可。除了上述配置外,Compose file还为我们提供了众多参数来满足各种配置需求,这里就不一一说明了,有兴趣的读者可以参考官网说明,具体地址为https://docs.docker.com/compose/compose-file/
。