一 Docker Compose文件简介
compose文件使用yml格式,主要分为了四个区域:
- version:用于指定当前docker-compose.yml语法遵循哪一个版本
- services:服务,在它下面能够定义应用须要的一些服务,每一个服务都有本身的名字、使用的镜像、挂载的数据卷、所属的网络、依赖哪些其余服务等等。
- networks:应用的网络,在它下面能够定义应用的名字、使用的网络类型等。
- volumes:数据卷,在它下面能够定义数据卷,而后挂载到不一样的服务下去使用。
二 Docker Compose文件详解
2.1 version字段
用于指定当前compose文件语法遵循哪一个版本,Compose文件版本支持特定的Docker版本列表以下:
Compose文件格式
|
Docker Engine版本
|
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.+
|
示例:version: "3"
2.2 services区域
全部服务的定义都是定义在services区域中,services经常使用的配置项以下:
image:指定要启动容器的映像。能够是一个repository/tag或镜像ID来代表。
示例:
image: redis image: ubuntu:14.04 image: tutum/influxdb image: example-registry.com:4000/postgresql image: a4bc65fd
提示:image能够是本地也能够是远程的,若是本地不存在,compose会尝试pull下来,肉使用了build手动构建镜像,则使用指定的选项构建它,并使用指定的标签标记它。
build:该参数指定Dockerfile文件的路径,compose会经过Dockerfile构建并生成镜像,而后使用该镜像
示例:
1 version: '3'
2 services:
3 webapp:
4 build: ./dir
5 image: webapp:tag
提示:若是在构建镜像的时候你指定相关名字和tag,则生成指定的镜像和tag。
command:重写默认的命令,即指定启动容器的命令。
示例:
command: bundle exec thin -p 3000 或
command: ["bundle", "exec", "thin", "-p", "3000"]
links:连接到其余服务中的容器,能够指定服务名称和这个连接的别名,或者只指定服务名称。
示例:
1 web:
2 links:
3 - db
4 - db:database
5 - redis
此时,在容器内部,会在/etc/hosts文件中用别名建立几个条目,以下:
1 172.17.2.100 db
2 172.17.2.100 database
3 172.17.2.100 redis
external_links:连接到compose外部启动的容器,特别是对于提供共享和公共服务的容器。在指定容器名称和别名时,external_links遵循着和links相同的语义用法。
示例:
1 external_links:
2 - redis_1
3 - project_db_1:mysql
4 - project_db_1:postgresql
ports:暴露端口,指定宿主机到容器的端口映射,或者只指定容器的端口,则表示映射到主机上的随机端口。
提示:注意:以HOST:CONTAINER格式映射端口时,使用低于60的容器端口时可能会遇到错误的结果,由于YAML会将格式xx:yy中的数字解析为base-60值。所以,咱们建议始终将端口映射明确指定为字符串。
示例:
1 ports:
2 - "3000"
3 - "3000-3005"
4 - "8000:8000"
5 - "9090-9091:8080-8081"
6 - "49100:22"
7 - "127.0.0.1:8001:8001"
8 - "127.0.0.1:5000-5010:5000-5010"
9 - "6060:6060/udp"
示例2:
1 ports:
2 - target: 80
3 published: 8080
4 protocol: tcp
5 mode: host
解释:长格式语法容许配置没法以简短形式表示的其余字段。
- target:容器内的端口
- published:公开暴露的港口
- protocol:端口协议(tcp或udp)
- mode:host用于在每一个节点上发布主机端口,或者ingress用于负载平衡的群集模式端口。
expose:暴露端口,但不须要创建与宿主机的映射,只是会向连接的服务提供,只能指定内部端口。
示例:
1 expose:
2 - "3000"
3 - "8000"
environment:加入环境变量,可使用数组或者字典,只有一个key的环境变量能够在运行compose的机器上找到对应的值。
提示:任何布尔值; true,false,yes no,须要用引号括起来,以确保YML解析器不会将它们转换为True或False。
示例:
1 environment:
2 RACK_ENV: development
3 SHOW: 'true'
4 SESSION_SECRET:
5 environment:
6 - RACK_ENV=development
7 - SHOW=true
8 - SESSION_SECRET
env_file:从一个文件中引入环境变量,该文件能够是一个单独的值或者一个列表,若是同时定义了environment,则environment中的环境变量会重写这些值。
示例:
1 env_file: .env
2
3 env_file:
4 - ./common.env
5 - ./apps/web.env
6 - /opt/secrets.env
提示:列表中文件的顺序对于肯定分配给屡次显示的变量的值很是重要。列表中的文件从上到下进行处理。对于在文件中指定的相同变量a.env并在文件中 分配不一样的值b.env,若是b.env列在下面(后),则来自b.envstand 的值。
如:给出如下声明docker_compose.yml:
1 services:
2 some-service:
3 env_file:
4 - a.env
5 - b.env
如下文件:
# a.env VAR=1
和
# b.env VAR=hello
则$VAR是hello。
depends_on:指定与部署和运行服务相关的配置。
示例:
1 version: '3'
2 services:
3 web:
4 build: .
5 depends_on:
6 - db
7 - redis
8 redis:
9 image: redis
10 db:
11 image: postgres
服务依赖关系之间的Express依赖关系会致使如下行为:
- docker-compose up:以依赖顺序启动服务,在以上示例中,db和redis之在web以前启动。
- docker-compose up SERVICE:自动包含SERVICE依赖项。在以上示例中,docker-compose up web还建立并启动db和redis。
deploy:指定与部署和运行服务相关的配置。
示例:
1 version: '3'
2 services:
3 redis:
4 image: redis:alpine
5 deploy:
6 labels:
7 com.example.description: "This label will appear on all containers for the web service"
8 resources:
9 limits:
10 cpus: '0.50'
11 memory: 50M
12 reservations:
13 cpus: '0.25'
14 memory: 20M
15 replicas: 6
16 update_config:
17 parallelism: 2
18 delay: 10s
19 update_config:
20 parallelism: 2
21 delay: 10s
22 order: stop-first
23 restart_policy:
24 condition: on-failure
25 delay: 5s
26 max_attempts: 3
27 window: 120s
子选项说明:
labels:指定服务的标签。这些标签仅在服务上设置,而不是在服务的任何容器上设置。
mode:global:每一个集群节点只有一个容器,默认为replicated。
resources:资源限制,如上所示:redis服务被限制为使用不超过50M的内存和0.50(50%)的CPU时间,而且保留20M了内存和0.25CPU时间(始终可用)。
replicas:指定replicated后,或默认状况下课使用replicas指定副本数,
restart_policy:配置是否以及如何在容器退出时从新启动容器,包括:
- condition:其中之一none,on-failure或any(默认:) any。
- delay:从新启动尝试之间等待的时间,指定为持续时间(默认值:0)。
- max_attempts:在放弃以前尝试从新启动容器的次数(默认值:永不放弃)。若是在配置中未成功从新启动 window,则此尝试不会计入配置的max_attempts值。例如,若是max_attempts设置为“2”,而且第一次尝试时从新启动失败,则可能会尝试从新启动两次以上。
- window:在决定重启是否成功以前等待多长时间,指定为持续时间(默认值:当即决定)。
rollback_config:配置在更新失败的状况下应如何回滚服务。
- parallelism:一次回滚的容器数。若是设置为0,则全部容器同时回滚。
- delay:每一个容器组的回滚之间等待的时间(默认为0)。
- failure_action:若是回滚失败该怎么办。一个continue或pause(默认pause)
- monitor:每次更新任务后的持续时间以监视失败(ns|us|ms|s|m|h)(默认为0)。
- max_failure_ratio:回滚期间容忍的失败率(默认值为0)。
- order:回滚期间的操做顺序。其中之一stop-first(旧任务在启动新任务以前中止),或者start-first(首先启动新任务,而且正在运行的任务暂时重叠)(默认stop-first)。
update_config:配置服务应如何更新,用于配置滚动更新。
- parallelism:一次更新的容器数。
- delay:更新一组容器之间的等待时间。
- failure_action:更新失败时的行为。其中一个continue,rollback或者pause (默认:pause)。
- monitor:每次更新任务后的持续时间以监视失败(ns|us|ms|s|m|h)(默认为0)。
- max_failure_ratio:更新期间容忍的故障率。
- order:更新期间的操做顺序。其中一个stop-first(旧任务在启动新任务以前中止),或者start-first(首先启动新任务,而且正在运行的任务暂时重叠)(默认stop-first)注意:仅支持v3.4及更高版本。
注意:order仅支持v3.4及更高版本的撰写文件格式。
healthcheck:配置运行的检查以肯定此服务的容器是否“健康”。
示例:
1 healthcheck:
2 test: ["CMD", "curl", "-f", "http://localhost"]
3 interval: 1m30s
4 timeout: 10s
5 retries: 3
6 start_period: 40s
提示:healthcheck可参考:https://docs.docker.com/engine/reference/builder/#healthcheck
network_mode:网络类型,可指定容器运行的网络类型
示例:
1 network_mode: "bridge"
2 network_mode: "host"
3 network_mode: "none"
4 network_mode: "service:[service name]"
5 network_mode: "container:[container name/id]"
dns:自定义dns服务
1 dns: 8.8.8.8
2 dns:
3 - 8.8.8.8
4 - 9.9.9.9
2.3 networks区域
网络决定了服务之间以及服务和外界之间如何去通讯,在执行docker-compose up的时候,docker会默认建立一个默认网络,建立的服务也会默认的使用这个默认网络。服务和服务之间,可使用服务的名字进行通讯,也能够本身建立网络,并将服务加入到这个网络之中,这样服务之间能够相互通讯,而外界不可以与这个网络中的服务通讯,能够保持隔离性。
提示:注意:您的应用程序网络的名称基于“项目名称”,该名称基于其所在目录的名称。您可使用--project-name参数或COMPOSE_PROJECT_NAME环境变量覆盖项目名称,如当前的目录为myapp,期docker-compose.yml以下:
1 version: "3"
2 services:
3 web:
4 build: .
5 ports:
6 - "8000:8000"
7 db:
8 image: postgres
9 ports:
10 - "8001:5432"
运行时docker-compose up,则:
- 建立了一个名为myapp_default的网络。
- 使用web配置建立容器,在web下加入myapp_default网络。
- 使用db配置建立容器,在db下加入myapp_default网络。
示例:
1 version: '2'
2
3 services:
4 app:
5 image: busybox
6 command: ifconfig
7 networks:
8 app_net:
9 ipv4_address: 172.16.238.10
10
11 networks:
12 app_net:
13 driver: bridge
14 enable_ipv6: true
15 ipam:
16 driver: default
17 config:
18 - subnet: 172.16.238.0/24
19 gateway: 172.168.238.254
2.4 volumes区域
能够在Compose file文件上声明卷,同时也能够在本区域建立volumes_from,以便在多个服务中重用卷。
示例:
1 version: "3"
2 services:
3 db:
4 image: db
5 volumes:
6 - data-volume:/var/lib/db
7 backup:
8 image: backup-service
9 volumes:
10 - data-volume:/var/lib/backup/data
11 volumes:
12 data-volume:
提示:volumes可参考:https://docs.docker.com/compose/compose-file/#specifying-byte-values