CHAPTER 12 Compose(一)


编排(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

跟日志相关的配置,包括一系列子配置

  1. logging.driver :类似于Docker中的--log-driver参数,指定日志驱动类型。目前支持三种日志驱动类型:
driver: "jsonfile" 
driver: "syslog"
driver: "none" 
  1. 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(失败时)、unless­stopped (除非停止)。
注意Swarm模式下要使用restart_policy。在生产环境中推荐配置为always或者unless­stopped。
例如,配置除非停止:

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等配置项。

  1. endpoint_mode指定服务端点模式。包括两种类型:
    vip: Swarm分配一个前端的虚拟地址,客户端通过给地址访问服务,而无须关心后端的应用容器个数;
    dnsrr: Swarm分配一个域名给服务,用户访问域名时候回按照轮流顺序返回容器地址。
    例如:
version:'3' 
services: 
	redis: image: web:stable
	deploy: 
		mode: replicated 
		replicas: 3 
		endpoint_mode: vip 
  1. labels
    指定服务的标签。注意标签信息不会影响到服务内的容器。例如:
version: "3" 
services: 
	web: 
		image: web:stable 
		deploy: 
			labels: 
				description: "This is  a  web applicationservice." 
  1. mode
    定义容器副本模式,可以为:
    global: 每个Swarm节点上只有一个该应用容器;
    replicated: 整个集群中存在指定份数的应用容器副本,默认值。
    例如,指定集群中web应用保持3个副本:
version: '3' 
services: 
	redis: image: web:stable
	deploy: 
		mode: replicated 
		replicas: 3 
		endpoint_mode: vip 
  1. placement
    定义容器放置的限制(constraints)和配置(preferences)。限制可以指定只有符合要求的节点上才能运行该应用容器;配置可以指定容器的分配策略。例如,指定集群中web应用容器只存在于高安全的节点上,并且在带有zone标签的节点上均匀分配。
version: '3' 
services: 
	db: 
		image: web:stable
		deploy:
			placement:
				constraints:
					- node.labels.security==high
				preferences: 
					- spread: node.labels.zone
  1. replicas
    容器副本模式为默认的replicated时,指定副本的个数。
  2. 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 
  1. 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
  1. 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值