Compose
- 12.1 Compose简介
- 12.2 安装与卸载
- 12.3 Compose模板文件
- 12.3.1 Compose模板文件主要命令
- 1 build
- 2 cap_add, cap_drop
- 3 command
- 4 configs
- 5 cgroup_parent
- 6 container_name
- 7 devices
- 8 depends_on
- 9 dns
- 10 dns_search
- 11 dockerfile
- 12 entrypoint
- 13 env_file
- 14 environment
- 15 expose
- 16 extends
- 17 external_links
- 18 extra_hosts
- 19 healthcheck
- 20 image
- 21 isolation
- 22 labels
- 23 links
- 24 logging
- 25 network_mode
- 26 networks
- 27 pid
- 28 ports
- 29 secrets
- 30 security_opt
- 31 stop_grace_period
- 32 stop_signal
- 33 sysctls
- 34 ulimits
- 35 userns_mode
- 36 volumes
- 37 restart
- 38 deploy
- 39 其他指令
- 40 读取环境变量
- 41 扩展特性
编排(Orchestration)功能,是复杂系统是否具有灵活可操作性的关键。特别在Docker应用场景中,编排意味着用户可以灵活地对各种容器资源实现定义和管理。
Compose作为Docker官方编排工具,其重要性不言而喻,它可以让用户通过编写一个简单的模板文件,快速地创建和管理基于Docker容器的应用集群。
本章将介绍Compose项目的具体情况,以及如何进行安装和使用,最后还通过具体案例来展示如何编写Compose模板文件。
12.1 Compose简介
Compose项目是Docker官方的开源项目,负责实现对基于Docker容器的多应用服务的快速编排。从功能上看,跟OpenStack中的Heat十分类似。其代码目前在https://github.com/docker/compose
上开源。
Compose定位是“定义和运行多个Docker容器的应用”,其前身是开源项目Fig,目前仍然兼容Fig格式的模板文件。
通过第一部分中的介绍,读者已经知道使用一个Dockerfile模板文件,可以让用户很方便地定义一个单独的应用容器。然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个Web项目,除了Web服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括前端的负载均衡容器等。
Compose恰好满足了这样的需求。它允许用户通过一个单独的docker-compose.yml
模板文件(YAML格式)来定义一组相关联的应用容器为一个服务栈(stack)。
Compose中有几个重要的概念:
- 任务(task):一个容器被称为一个任务。任务拥有独一无二的ID,在同一个服务中的多个任务序号依次递增。
- 服务(service):某个相同应用镜像的容器副本集合,一个服务可以横向扩展为多个容器实例。
- 服务栈(stack):由多个服务组成,相互配合完成特定业务,如Web应用服务、数据库服务共同构成Web服务钱,一般由一个docker-compose.yml文件定义。
Compose的默认管理对象是服务栈,通过子命令对栈中的多个服务进行便捷的生命周期管理。Compose项目由Python编写,实现上调用了Docker服务提供的API来对容器进行管理。因此,只要所操作的平台支持Docker API,就可以在其上利用Compose来进行编排管理
12.2 安装与卸载
Compose目前支持Linux和MacOS平台,两者的安装过程大同小异。安装Compose之前,要先安装Docker引擎,请参考第一部分中章节,在此不再赘述。
Compose可以通过Python的pip工具进行安装,可以直接下载编译好的二进制文件使用,甚至直接运行在Docker容器中。前两种方式是传统方式,适合本地环境下安装使用;最后一种方式则不破坏系统环境,更适合云计算场景。
12.2.1 pip安装
这种方式是将Compose当作一个Python应用从PyPI源中安装。执行安装命令:
pip install -U docker-compose
python -m pip install requests 'certifi<=2020.4.5.1'
[root@dbc-server-554 pip-20.2.4]# docker-compose -v
/usr/lib/python2.7/site-packages/paramiko/transport.py:33: CryptographyDeprecationWarning: Python 2 is no longer supported by the Python core team. Support for it is now deprecated in cryptography, and will be removed in the next release.
from cryptography.hazmat.backends import default_backend
docker-compose version 1.26.2, build unknown
注意可能会出现语法错误,如下
def where() -> str:
^
SyntaxError: invalid syntax"
原因是Certifi 在 2020.04.05.2 (commit) 中删除了 python 2.7,Certifi 的最后一个 python 2.7 版本是 2020.04.5 (github),所以我们如果程序上述错误,重新安装certifi<=2020.4.5.1即可解决
之后,可以添加bash补全命令:
[root@dbc-server-554 pip-20.2.4]# curl -L https://raw.githubusercontent.com/docker/compose/1.26.2/contrib/com-pletion/bash/docker-compose > /etc/bash_completion.d/docker-compose
笔者这访问不了,所以不补全了。
12.2.2 二进制包
官方定义编译好二进制包,供大家使用。这些发布的二进制包可以在https://github.com/docker/compose/releases
页面找到
将这些二进制文件下载后直接放到执行路径下,并添加执行权限即可。例如,在Linux平台上
$ sudo curl -L https://github.com/docker/compose/releases/download/1.19.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
$ sudo chmod a+x /usr/local/bin/docker-compose
可以使用docker-compose version
命令来查看版本信息,以测试是否安装成功
官网安装教程
如果服务器网络不良或者离线,无法通过curl下载,也可以通过其他服务器下载后上传到服务器进行配置
[root@node-252 sonar]# mv /home/docker-compose-linux-x86_64 /usr/local/bin/docker-compose
[root@node-252 sonar]# chmod a+x /usr/local/bin/docker-compose
[root@node-252 sonar]# docker-compose -v
Docker Compose version v2.17.2
12.2.3 容器中执行
set -e
VERSION="1.19.0"
IMAGE="docker/compose:’$VERSION"
# Setup options for connecting to docker host
if [ -z "$DOCKER_HOST"] ; then
DOCKER_HOST= " /var/run/docker.sock "
fi
if [ -S "$DOCKER_HOST" ] ; then
DOCKER_ADDR="-v $DOCKER_HOST:$DOCKER_HOST -e DOCKER_HOST"
else
DOCKER ADDR="-e DOCKER_HOST - e DOCKER_TLS_VERIFY -e DOCKER CERT PATH"
fi
# Setup volume mounts for compose config and context
if ["$(pwd)"!='/'] ; then
VOLUMES= " -v $(pwd):$(pwd) "
fi
if [ -n "$COMPOSE_FILE"];then
compose_dir=$(dirname $COMPOSE_FILE)
fi
# TODO: a lso check --file argument
if [ -n "$compose_dir"]; then
VOLUMES= "$VOLUMES -v $compose_dir:$compose_dir"
fi
if[ -n "$HOME"];then
VOLUMES="$VOLUMES -v $HOME:$HOME -v $HOME:/root"
# mount $HOME in /root to s hare docker.config
fi
# Only allocate tty if we detect one
if [ -t 1 ]; then
DOCKER RUN OPTIONS= "t"
fi
if[ -t 0 ] ; then
DOCKER_RUN_OPTIONS="$DOCKER_RUN_OPTIONS -i"
fi
exec docker run --rm $DOCKER RUN OPTIONS $DOCKER_ADDR $COMPOSE_OPTIONS $VOLUMES -w "$(pwd)" $IMAGE "$@"
编辑脚本run.sh,用于下载运行docker-compose容器
12.2.4 卸载
如果是二进制包方式安装的,删除二进制文件即可:
sudo rm /usr/local/bin/docker-compose
如果是通过Pythonpip工具安装的,则可以执行如下命令删除:
$ sudo pip uninstall docker-compose
12.3 Compose模板文件
模板文件是使用Compose的核心,涉及的指令关键字也比较多。但大家不用担心,这里的大部分指令与docker create | run
相关参数的含义都是类似的。默认的模板文件名称为docker-compose.yml,格式为YAML格式,目前最新的版本为v3
compose file version
The Compose file is a YAML file defining version (DEPRECATED), services (REQUIRED), networks, volumes, configs and secrets. The default path for a Compose file is compose.yaml (preferred) or compose.yml in working directory. Compose implementations SHOULD also support docker-compose.yaml and docker-compose.yml for backward compatibility. If both files exist, Compose implementations MUST prefer canonical compose.yaml one.
官方示例:
services:
frontend:
image: awesome/webapp
ports:
- "443:8043"
networks:
- front-tier
- back-tier
configs:
- httpd-config
secrets:
- server-certificate
backend:
image: awesome/database
volumes:
- db-data:/etc/data
networks:
- back-tier
volumes:
db-data:
driver: flocker
driver_opts:
size: "10GiB"
configs:
httpd-config:
external: true
secrets:
server-certificate:
external: true
networks:
# The presence of these objects is sufficient to define them
front-tier: {}
back-tier: {}
注意每个服务都必须通过image指令指定镜像或build指令(需要Dockerfile)等来自动构建生成镜像。
如果使用build指令,在Dockerfile中设置的选项(例如:CMD、EXPOSE、VOLUME、ENV等)将会自动被获取,无须在docker-compose.yml中再次设置。
12.3.1 Compose模板文件主要命令
命令 | 功能 |
---|---|
build | 指定Dockerfile所在文件夹的路径 |
cap_add, cap_drop | 指定容器的内核能力(capacity)分配 |
command | 覆盖容器启动后默认执行的命令 |
cgroup_parent | 指定父cgroup组,意味着将继承该组的资源限制。目前不支持Swarm模式 |
container_name | 指定容器名称。目前不支持Swarm模式 |
devices | 指定设备映射关系,不支持Swarm模式 |
depends_on | 指定多个服务之间的依赖关系 |
dns | 自定义DNS服务器 |
dns_search | 配置DNS搜索域 |
dockerfile | 指定额外的编译镜像的Dockefile文件 |
entrypoint | 覆盖容器中默认的人口命令 |
env_file | 从文件中获取环境变量 |
environment | 设置环境变量 |
expose | 暴露端口,但不映射到宿主机,只被连接的服务访问 |
extends | 基于其他模板文件进行扩展 |
external links | 链接到docker-compose.yml外部的容器 |
extra_hosts | 指定额外的host名称映射信息 |
healthcheck | 指定检测应用健康状态的机制 |
image | 指定为镜像名称或镜像ID |
isolation | 配置容器隔离的机制 |
labels | 为容器添加Docker元数据信息 |
links | 链接到其他服务中的容器 |
logging | 跟日志相关的配置 |
network mode | 设置网络模式 |
networks | 所加入的网络 |
pid | 跟主机系统共享进程命名空间 |
ports | 暴露端口信息 |
secrets | 配置应用的秘密数据 |
security_opt | 指定容器模板标签(label)机制的默认属性(用户、角色、类型、级别等) |
stop_grace_period | 指定应用停止时,容器的优雅停止期限。过期后则通过SIGKILL强制退出。默认值为10s |
stop_signal | 指定停止容器的信号 |
sysctls | 配置容器内的内核参数。目前不支持Swarm模式 |
ulimits | 指定容器的ulimits限制值 |
userns_mode | 指定用户命名空间模式。目前不支持Swann模式 |
volumes | 数据卷所挂载路径设置 |
restart | 指定重启策略 |
deploy | 指定部署和运行时的容稽相关配置。该命令只在Swarm模式下生效,且只支持docker stack deploy命令部署 |
运行我们的第一个compose
[root@dbc-server-554 compose]# cat compose.yml
version: '3'
services:
app:
build: /root/docker/compose
ports:
- "5000:5000"
[root@dbc-server-554 compose]# cat dockerfile
#parentimage
ARG version=7
FROM training/webapp
LABEL version="1.0" maintainer="newbee"
STOPSIGNAL SIGKILL
cmd python app.py
[root@dbc-server-554 compose]# docker-compose -f compose.yml up -d
[+] Running 2/2
⠿ Network compose_default Created 0.1s
⠿ Container compose-app-1 Started 0.7s
[root@dbc-server-554 compose]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3077b1a5ba37 compose-app "/bin/sh -c 'python …" 3 seconds ago Up 2 seconds 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp compose-app-1
[root@dbc-server-554 compose]# curl 192.168.5.54:5000
Hello world!
常用参数介绍:
1 build
指定Dockerfile所在文件夹的路径(可以是绝对路径,或者相对docker-compose.yml文件的路径)。Compose将会利用它自动构建应用镜像,然后使用这个镜像,参考上例
build指令还可以指定创建镜像的上下文、Dockerfile路径、标签、Shm大小、参数和缓存来源等,相信内容查看以下链接
build官网说明
其中值得注意:
context (REQUIRED)
context defines either a path to a directory containing a Dockerfile, or a url to a git repository.
2 cap_add, cap_drop
指定容器的内核能力(capacity)分配。例如,让容器拥有所有能力可以指定为
cap_add:
- ALL
去掉NET_ADMIN能力可以指定为:
cap drop:
- NET_ADMIN
3 command
覆盖容器启动后默认执行的命令,可以为字符串格式或JSON数组格式。例如
command: echo "hello world"
#or
command: [ "bash", "-c", "echo", "hello world"]
4 configs
在Docker Swarm模式下,可以通过configs来管理和访问非敏感的配置信息。支持从文件读取或外部读取。例如
version: "3.3"
services:
app:
image: myApp:1.0
deploy:
replicas: 1
configs:
- file_config
- external_config
configs:
file_config:
file: ./config_file.cfg
external_config:
external: true
external
If set to true, external specifies that this volume already exist on the platform and its lifecycle is managed outside of that of the application. Compose implementations MUST NOT attempt to create these volumes, and MUST return an error if they do not exist.
If external is set to true , then the resource is not managed by Compose. If external is set to true and the network configuration has other attributes set besides name, then Compose Implementations SHOULD reject the Compose file as invalid.
5 cgroup_parent
指定父cgroup组,意味着将继承该组的资源限制。目前不支持在Swarm模式中使用。例如,创建了一个cgroup组名称为cgroups_1:
cgroup_parent: cgroups_1
6 container_name
指定容器名称。默认将会使用项目名称_服务名称_序号
这样的格式。目前不支持在Swarm模式中使用。例如:
container_name: docker-web-container
需要注意,指定容器名称后,该服务将无法进行扩展,因为Docker不允许多个容器实例重名。
7 devices
指定设备映射关系,不支持Swarm模式。例如:
devices:
- "/dev/ttyUSB1:/dev/ttyUSB0"
8 depends_on
指定多个服务之间的依赖关系。启动时,会先启动被依赖服务。例如,可以指定依赖于db服务:
depends_on: db
9 dns
自定义DNS服务器。可以是一个值,也可以是一个列表。例如:
dns: 8.8.8.8
dns:
- 8.8.8.8
- 9.9.9.9
10 dns_search
配置DNS搜索域。可以是一个值,也可以是一个列表。例如:
dns_search: example.com
dns search:
- domain1.example.com
- domain2.example.com
11 dockerfile
如果需要,指定额外的编译镜像的Dockefile文件,可以通过该指令来指定。例如:
dockerfile: Dockerfile-alternate
注意:该指令不能跟image同时使用,否则Compose不知道根据哪个指令来生成最终的服务镜像
12 entrypoint
覆盖容器中默认的入口命令。注意,也会取消掉镜像中指定的入口命令和默认启动命令。例如,覆盖为新的入口命令:
entrypoint: python app.py
13 env_file
从文件中获取环境变量,可以为单独的文件路径或列表。如果通过docker-compose -f FILE
方式来指定Compose模板文件,则env_file
中变量的路径会基于模板文件路径。如果有变量名称与environment指令冲突,则按照惯例,以后者为准。例如
env_file: .env
env_file:
- ./common.env
- ./apps/web.env
- ./opt/secrets.env
环境变量文件中每一行必须符合格式,支持#开头的注释行,例如:
# common.env: Set development environment
PROG_ENV=development
14 environment
设置环境变量,可以使用数组或字典两种格式。只给定名称的变量会自动获取运行Compose主机上对应变量的值,可以用来防止泄露不必要的数据。例如:
environment:
RACK_ENV: development
SESSION_SECRET:
#or
environment:
- RACK_ENV=development
- SESSION_SECRET
注意,如果变量名称或者值中用到true|false,yes|no
等表达布尔含义的词汇,最好放到引号里,避免YAML自动解析某些内容为对应的布尔语义:
https://yaml.org/type/bool.html中给出了这些特定词汇,包括
y|Y|yes|Yes|YES|n|N|no|No|NO
|true|True|TRUE|false|False|FALSE
|on|On|ON|off|Off|OFF
15 expose
暴露端口,但不映射到宿主机,只被连接的服务访问。仅可以指定内部端口为参数,如下所示:
expose:
- "3000"
- "8000"
映射到主机需要使用ports
16 extends
基于其他模板文件进行扩展。例如,我们已经有了一个webapp服务,定义一个基础模板文件为common.yml,如下所示:
[root@dbc-server-554 extends]# cat common.yaml
version: "3"
services:
webapp:
build: /root/docker/compose/extends/webapp
environment:
- DEBUG=false
- SEND_EMAILS=false
再编写一个新的development.yml文件,使用common.yaml中的webapp服务进行扩展:
[root@dbc-server-554 extends]# docker-compose -f development.yaml up -d
[+] Running 2/2
⠿ Container extends-db-1 Started 0.8s
⠿ Container extends-web-1 Started 1.6s
[root@dbc-server-554 extends]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
67ea90855faf extends-web "/bin/sh -c 'python …" 6 seconds ago Up 4 seconds 5000/tcp, 0.0.0.0:8000->8000/tcp, :::8000->8000/tcp extends-web-1
e752d9baed43 training/postgres "su postgres -c '/us…" 6 seconds ago Up 5 seconds 5432/tcp extends-db-1
[root@dbc-server-554 extends]# cat development.yaml
version: "3"
services:
web:
extends:
file: common.yaml
service: webapp
ports:
- "8000:8000"
links:
- db
environment:
- DEBUG=true
db:
image: training/postgres
后者会自动继承common.yml中的webapp服务及环境变量定义。使用extends需要注意以下两点:
- 要避免出现循环依赖,例如A依赖B,B依赖C,C反过来依赖A的情况
- extends不会继承links和volumes_from中定义的容器和数据卷资源。
一般情况下,推荐在基础模板中只定义一些可以共享的镜像和环境变量,在扩展模板中具体指定应用变量、链接、数据卷等信息
17 external_links
链接到docker-compose.yml外部的容器,甚至并非Compose管理的外部容器。参数格式跟links类似。
external_links:
- redis_1
- project_db_1:mysql
- project_db_2:postgresql
18 extra_hosts
类似Docker中的--add-host
参数,指定额外的host名称映射信息
extra_hosts:
- "googledns:8.8.8.8"
- "dockerhub:52.1.157.61"
会在启动后的服务容器中/etc/hosts文件中添加如下两条条目。
8.8.8.8 googledns
52.1.157.61 dockerhub
19 healthcheck
指定检测应用健康状态的机制,包括检测方法(test)、间隔(interval)、超时(timeout)、重试次数(retries)、启动等待时间(start_period)等。
例如, 指定检测方法为访问8080端口, 间隔为30秒, 超时为15秒, 重试3次, 启动后等待30秒再做检查。
heathcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080"]
interval: 30s
timeout: 15s
retries: 3
start_period: 30s
20 image
指定为镜像名称或镜像ID。如果镜像在本地不存在,Compose将会尝试拉去这个镜像。例如:
image: ubuntu
21 isolation
配置容器隔离的机制, 包括default、process和hyperv。
22 labels
为容器添加Docker元数据(metadata)信息。例如可以为容器添加辅助说明信息。
labels:
com.startupteam.description:"webapp for a startup team"
com.startupteam.department:"devops department"
com.startupteam.release: "rc3 for v1.0"
23 links
链接到其他服务中的容器。使用服务名称(同时作为别名)
或服务名称:服务别名(SERVICE:ALIAS)
格式都可以。
web:
links:
- db
- db:database
- redis
使用的别名将会自动在服务容器中的/etc/hosts里创建。例如:
172.17.2.186 db
172.17.2.186 database
172.17.2.187 redis
被链接容器中相应的环境变量也将被创建。
24 logging
跟日志相关的配置,包括一系列子配置
- logging.driver :类似于Docker中的
--log-driver
参数,指定日志驱动类型。目前支持三种日志驱动类型:
driver: "jsonfile"
driver: "syslog"
driver: "none"
- logging.options:日志驱动的相关参数。例如:
logging:
driver: "syslog"
options:
syslog-address: "tcp://192.168.0.42:123"
#or
logging:
driver: "json-file"
options:
max-size: "lOOOk"
max-file: "20"
25 network_mode
设置网络模式。使用和docker client的--net
参数一样的值。
network_mode: "none"
network_mode: "bridge"
network_mode: "host"
network_mode: "service: [service name]"
network_mode: "container:[name or id] "
26 networks
所加入的网络。需要在顶级的networks字段中定义具体的网络信息。
例如,指定web服务的网络为web_net,并添加服务在网络中别名为web_app
services:
web:
networks:
web_net:
aliases: web_app
ipv4_address: 172.16.0.10
networks:
web_net:
driver: bridge
enable_ipv6: true
ipam:
driver: default
config:
subnet:172.16.0.0/24
官网示例
services:
some-service:
networks:
- some-network
- other-network
27 pid
跟主机系统共享进程命名空间。打开该选项的容器之间,以及容器和宿主机系统之间可以通过进程ID来相互访问和操作。
pid: "host"
28 ports
暴露端口信息。使用宿主:容器(HOST:CONTAINER)
格式,或者仅仅指定容器的端口(宿主将会随机选择端口)都可以。
ports:
- "3000"
- "8000:8000"
- "49100:22"
- "127.0.0.1:8001:8001"
#or
ports:
- target: 80
published: 8080
protocol: tcp
mode: ingress
注意:当使用HOST:CONTAINER格式来映射端口时,如果你使用的容器端口小于60并且没放到引号里,可能会得到错误结果,因为YAML会自动解析xx:yy这种数字格式为60进制。为避免出现这种问题,建议数字串都采用引号包括起来的字符串格式。
29 secrets
配置应用的秘密数据。可以指定来源秘密、挂载后名称、权限等。
version: "3.1"
services:
web:
image: webapp:stable
deploy:
replicas: 2
secrets:
- source: web_secret
target: web_secret
uid: '103'
gid: '103'
mode: 0444
secrets:
web_secret:
file: ./web_secret.txt
30 security_opt
指定容器模板标签(label)机制的默认属性(用户、角色、 类型、 级别等)。例如,配置标签的用户名和角色名:
security_opt:
- label:user:USER
- label:role:ROLE
31 stop_grace_period
指定应用停止时,容器的优雅停止期限。过期后则通过SIGKILL强制退出。默认值为10s。
32 stop_signal
指定停止容器的信号,默认为SIGTERM。
33 sysctls
配置容器内的内核参数。Swarm模式中不支持。
例如, 指定连接数为4096和开启TCP的syncookies:
sysctls:
net.core.somaxconn: 4096
net.ipv4.tcp_syncookies: 1
34 ulimits
指定容器的ulimits限制值。例如,指定最大进程数为65535,指定文件句柄数为20000(软限制,应用可以随时修改,不能超过硬限制)和40000(系统硬限制,只能root用户提高)。
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
35 userns_mode
指定用户命名空间模式。Swarm模式中不支持。
例如,使用主机上的用户命名空间:
userns_mode: "host"
36 volumes
数据卷所挂载路径设置。可以设置宿主机路径(HOST:CONTAINER)或加上访问模式(HOST:CONTAINER:ro)。支持driver、driver_opts、external、labels、name等子配置。该指令中路径支持相对路径。例如
volumes:
- /var/lib/mysql
- cache/:/tmp/cache
- ~/configs:/etc/configs/:ro
或者可以使用更详细的语法格式:
volumes:
- type: volume
source: mydata
target: Idata
volume: nocopy: true
volumes:
mydata:
37 restart
指定重启策略,可以为no(不重启)、always(总是)、on-failure(失败时)、unlessstopped (除非停止)。
注意Swarm模式下要使用restart_policy。在生产环境中推荐配置为always或者unlessstopped。
例如,配置除非停止:
restart:unless-stopped
38 deploy
指定部署和运行时的容器相关配置。该命令只在Swarm模式下生效,且只支持docker stack deploy命令部署。
version:'3'
services:
redis:
image: web:stable
deploy:
replicas: 3
update_config:
parallelism: 2
delay: 10s
restart__policy:
condition: on-failure
deploy命令中包括endpoint_mode、labels、mode、placement、replicas、resources、restart_policy、update_config等配置项。
- endpoint_mode指定服务端点模式。包括两种类型:
vip: Swarm分配一个前端的虚拟地址,客户端通过给地址访问服务,而无须关心后端的应用容器个数;
dnsrr: Swarm分配一个域名给服务,用户访问域名时候回按照轮流顺序返回容器地址。
例如:
version:'3'
services:
redis: image: web:stable
deploy:
mode: replicated
replicas: 3
endpoint_mode: vip
- labels
指定服务的标签。注意标签信息不会影响到服务内的容器。例如:
version: "3"
services:
web:
image: web:stable
deploy:
labels:
description: "This is a web applicationservice."
- mode
定义容器副本模式,可以为:
global: 每个Swarm节点上只有一个该应用容器;
replicated: 整个集群中存在指定份数的应用容器副本,默认值。
例如,指定集群中web应用保持3个副本:
version: '3'
services:
redis: image: web:stable
deploy:
mode: replicated
replicas: 3
endpoint_mode: vip
- placement
定义容器放置的限制(constraints)和配置(preferences)。限制可以指定只有符合要求的节点上才能运行该应用容器;配置可以指定容器的分配策略。例如,指定集群中web应用容器只存在于高安全的节点上,并且在带有zone标签的节点上均匀分配。
version: '3'
services:
db:
image: web:stable
deploy:
placement:
constraints:
- node.labels.security==high
preferences:
- spread: node.labels.zone
- replicas
容器副本模式为默认的replicated时,指定副本的个数。 - resources
指定使用资源的限制,包括CPU、内存资源等。 例如,指定应用使用的CPU份额为10%~25%,内存为200MB到500MB。
version: '3'
services:
redis:
image: web:stable
deploy:
resources:
limits:
cpus: '0.25'
memory: 500M
reservations:
cpus: '0.10'
memory: 200M
- restart_policy
指定容器重启的策略。例如,指定重启策略为失败时重启,等待2s,重启最多尝试3次,检测状态的等待时间为10s。
version: "3"
services:
redis:
image: web:stable
deploy:
restart_policy:
condition: on-failure
delay: 2s
max_attempts: 3
window: 10s
- update_config
有些时候需要对容器内容进行更新,可以使用该配置指定升级的行为。包括每次升级多少个容器(parallelism)、升级的延迟(delay)、升级失败后的行动(failure_action)、检测升级后状态的等待时间(monitor)、升级后容忍的最大失败比例(max_failure_ratio)、升级顺序(order)等。 例如,指定每次更新两个容器、更新等待10s、先停止旧容器再升级。
version: "3.4"
services:
redis:
image: web:stable
deploy:
replicas: 2
update_config:
parallelism: 2
delay: 10s
order: stop-first
39 其他指令
此外,还有包括domainname、hostnarne、ipc、mac_address、privileged、read_only、shm_size、stdin_open、tty、user、working_dir等指令,基本跟docker-run中对应参数的功能一致。例如,指定容器中工作目录:
working_dir: /code
指定容器中搜索域名、主机名、mac地址等:
domainname: your_website.com
hostname: test
mac_address: 08-00-27-00-0C-OA
允许容器中运行一些特权命令:
privileged: true
40 读取环境变量
从1.5.0版本开始,Compose模板文件支持动态读取主机的系统环境变量。例如,下面的Compose文件将从运行它的环境中读取变量${MONGO_VERSION}
的值(不指定时则采用默认值3.2),并写入执行的指令中。
db:
image: "mango:${MONGO_VERSION-3.2}"
如果直接执行docker-compose up
则会启动一个mongo:3.2镜像的容器;如果执行MONGO_VERSION=2.8 docker-compose up
则会启动一个mongo:2.8镜像的容器。
41 扩展特性
从3.4开始,Compose还支持用户自定义的扩展字段。 利用YAML语法里的锚点引用功能来引用自定义字段内容。例如:
version: '3.4'
x-logging:
&default-logging
options:
max-size: '10m'
max-file: '10'
driver: json-file
services:
web:
image: webapp:stable
logging: *default-logging