docker-compose.md

安装

pip

python 2.7+的系统同yum先安装pip命令。

# yum install -y python2-pip
# pip install docker-compose

网络安装

# curl -L "https://github.com/docker/compose/releases/download/1.9.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose

compose file

blkio_config

用于为此服务设置块IO限制的一组配置选项。

version: '2.2'
services:
foo:
image: busybox
blkio_config:
weight: 300
weight_device:
- path: /dev/sda
weight: 400
device_read_bps:
- path: /dev/sdb
rate: '12mb'
device_read_iops:
- path: /dev/sdb
rate: 120
device_write_bps:
- path: /dev/sdb
rate: '1024k'
device_write_iops:
- path: /dev/sdb
rate: 30

DEVICE_READ_BPS, DEVICE_WRITE_BPS

为给定设备上的读/写操作设置每秒字节数限制。 列表中的每个项目必须有两个键:

  • 路径,为受影响的设备定义符号路径
  • 速率,可以是表示字节数的整数值,也可以是表示字节值的字符串。

DEVICE_READ_IOPS, DEVICE_WRITE_IOPS

为给定设备上的读/写操作设置每秒操作的限制。 列表中的每个项目必须有两个键:

  • 路径,为受影响的设备定义符号路径
  • 速率,作为表示每秒允许的操作次数的整数值。

WEIGHT

修改分配给该服务的带宽相对于其他服务的比例。 采用10到1000之间的整数值,其中500是默认值。

WEIGHT_DEVICE

微调设备的带宽分配。 列表中的每个项目必须有两个键:

  • 路径,为受影响的设备定义符号路径
  • 权重,一个10到1000之间的整数值

build

在构建时应用的配置选项。

build可以指定为包含构建上下文的路径的字符串,也可以指定具有在上下文中指定的路径的对象,也可以指定dockerfile和args。

build: ./dir

build:
context: ./dir
dockerfile: Dockerfile-alternate
args:
buildno: 1

如果您指定了镜像以及构建,那么Compose会使用镜像中指定的webapp和可选标记命名构建的镜像:

build: ./dir
image: webapp:tag

这将生成一个名为webapp和标记标签的图像,该镜像由./dir构建。

CONTEXT

可以是包含Dockerfile的目录的路径,也可以是到git存储库的url。

当提供的值是相对路径时,它被解释为相对于撰写文件的位置。 这个目录也是发送到Docker守护进程的构建上下文。

使用生成的名称构建并标记它,然后使用该镜像。

build:
context: ./dir

DOCKERFILE

替代Dockerfile。

组合使用一个替代文件来构建。还必须指定构建路径。

build:
context: .
dockerfile: Dockerfile-alternate

ARGS

添加构建参数,这些参数只有在构建过程中才可访问的环境变量。

首先,在Dockerfile中指定参数:

ARG buildno
ARG password RUN echo "Build number: $buildno"
RUN script-requiring-password.sh "$password"

然后在构建键下面指定参数。你可以通过一个映射或一个列表:

build:
context: .
args:
buildno: 1
password: secret build:
context: .
args:
- buildno=1
- password=secret

在指定构建参数时,您可以省略该值,在这种情况下,它在构建时的值是构成正在运行的环境中的值。

args:
- buildno
- password

EXTRA_HOSTS

在构建时添加主机名映射。使用与docker客户端相同的值——加载主机参数。

extra_hosts:
- "somehost:162.242.195.82"
- "otherhost:50.31.209.229"

一个带有ip地址和主机名的条目是在容器内的/etc/hosts中创建的。

162.242.195.82  somehost
50.31.209.229 otherhost

LABELS

使用Docker标签为生成的镜像添加元数据。您可以使用数组或字典。

建议您使用反向dns标记来防止您的标签与其他软件所使用的标签相冲突。

build:
context: .
labels:
com.example.description: "Accounting webapp"
com.example.department: "Finance"
com.example.label-with-empty-value: "" build:
context: .
labels:
- "com.example.description=Accounting webapp"
- "com.example.department=Finance"
- "com.example.label-with-empty-value"

NETWORK

在构建期间设置网络容器连接到运行指令。

build:
context: .
network: host build:
context: .
network: custom_network_1

SHM_SIZE

为这个构建的容器设置/dev/shm分区的大小。指定为表示字节数或表示字节值的字符串的整数值。

build:
context: .
shm_size: '2gb' build:
context: .
shm_size: 10000000

TARGET

构建在Dockerfile中定义的指定阶段。

  build:
context: .
target: prod

cap_add, cap_drop

添加或删除容器功能。See man 7 capabilities for a full list.

cap_add:
- ALL cap_drop:
- NET_ADMIN
- SYS_ADMIN

command

覆盖默认的命令。

command: bundle exec thin -p 3000

该命令也可以是一个列表,与dockerfile类似:

command: ["bundle", "exec", "thin", "-p", "3000"]

cgroup_parent

为容器指定一个可选的父cgroup。

cgroup_parent: m-executor-abcd

container_name

指定一个定制的容器名,而不是生成的默认名称。

container_name: my-web-container

因为Docker容器的名称必须是唯一的,所以如果您指定了一个自定义名称,您就不能将服务扩展到一个容器之外。尝试这样做会导致错误。

devices

设备映射列表。使用与设备docker客户端创建选项相同的格式。

devices:
- "/dev/ttyUSB0:/dev/ttyUSB0"

depends_on

在服务之间表达依赖性,这有两个影响:

  • 在依赖顺序中,docker-compose up启动服务。在下面的例子中,db和redis在web之前就开始了。
  • docker-compose up SERVICE自动包含服务的依赖项。在下面的例子中,docker-compose up web也创建和启动db和redis。

    简单的例子:
version: '2'
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres

healthcheck表示您想要依赖于等待另一个容器的“healthy”(从healthcheck中获得成功的状态)。

例子:

version: '2.1'
services:
web:
build: .
depends_on:
db:
condition: service_healthy
redis:
condition: service_started
redis:
image: redis
db:
image: redis
healthcheck:
test: "exit 0"

在上面的示例中,在开始web之前,要为要启动的redis服务(遗留行为)和db服务进行等待。

dns

定制的DNS服务器。可以是一个单独的值,也可以是一个列表。

dns: 8.8.8.8
dns:
- 8.8.8.8
- 9.9.9.9

dns_opt

将定制的DNS选项列表添加到容器的resolv.conf文件中。

dns_opt:
- use-vc
- no-tld-query

dns_search

定制的DNS搜索领域。可以是一个单独的值,也可以是一个列表。

dns_search: example.com
dns_search:
- dc1.example.com
- dc2.example.com

tmpfs

在容器中装入一个临时文件系统。可以是一个单独的值,也可以是一个列表。

tmpfs: /run
tmpfs:
- /run
- /tmp

entrypoint

覆盖默认的入口点。

entrypoint: /code/entrypoint.sh

入口点也可以是一个列表,与dockerfile类似:

entrypoint:
- php
- -d
- zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so
- -d
- memory_limit=-1
- vendor/bin/phpunit

注意:设置ENTRYPOINT不仅覆盖了服务映像上的任何默认入口点,还包括了入口点Dockerfile指令,并清除了图像上的任何默认命令——这意味着如果Dockerfile中有CMD指令,那么它将被忽略。

env_file

从一个文件中添加环境变量。可以是一个单独的值,也可以是一个列表。

如果您已经指定了一个带有docker-compose -f FILE的组合文件,那么envfile中的路径相对于文件所在的目录来说是相对的。

在环境部分中声明的环境变量将覆盖这些值——即使这些值是空的或未定义的,这也是成立的。

env_file: .env

env_file:
- ./common.env
- ./apps/web.env
- /opt/secrets.env

environment

添加环境变量。您可以使用数组或字典。布尔值;True、False、yes no,需要用引号括起来,以确保它们不会被YML解析器转换为True或False。

只有一个键的环境变量被解析为在机器组合上运行的值,这对于秘密或特定于主机的值是有帮助的。

environment:
RACK_ENV: development
SHOW: 'true'
SESSION_SECRET: environment:
- RACK_ENV=development
- SHOW=true
- SESSION_SECRET

注意:如果您的服务指定了构建选项,那么在构建过程中定义的变量不会自动可见。使用build的args子选项来定义构建时环境变量。

expose

公开端口,而不将它们发布到主机上——它们只能访问链接的服务。只能指定内部端口。

expose:
- "3000"
- "8000"

extends

在当前文件或其他文件中扩展另一个服务,可选地覆盖配置。

您可以在任何服务上使用扩展和其他配置键。扩展值必须是一个定义了一个必需的服务和一个可选的文件键的字典。

extends:
file: common.yml
service: webapp

服务被扩展的服务的名称,例如web或database。该文件是定义该服务的组合配置文件的位置。

如果您省略了文件,那么在当前文件中查找服务配置。文件的值可以是一个绝对或相对路径。如果指定一个相对路径,则将其视为相对于当前文件的位置。

您可以扩展服务本身来扩展另一个服务。你可以无限期延长。组合不支持循环引用,如果遇到一个错误,就会返回一个错误。

external_links

链接到这个docker-compose.yml之外的容器,甚至在组合之外,特别是对于提供共享或公共服务的容器。当指定容器名和链接别名(CONTAINER:ALIAS)时,external_links遵循与links类似的语义。

external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql

extra_hosts

添加主机名映射。 使用与docker客户端--add-host参数相同的值。

extra_hosts:
- "somehost:162.242.195.82"
- "otherhost:50.31.209.229"

group_add

指定容器内的用户应该作为成员的附加组(通过名称或数字)。必须在容器和要添加的主机系统中存在组。当多个容器(作为不同的用户运行)需要在主机系统上读取或写入相同的文件时,这是有用的一个例子。该文件可以由所有容器共享的组拥有,并在group_add中指定。

version: '2'
services:
myservice:
image: alpine
group_add:
- mail

在创建的容器中运行id显示用户属于mail组,如果不使用group_add,情况就不会如此。

healthcheck

配置一个检查,以确定该服务的容器是否“healthy ”。

healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 1m30s
timeout: 10s
retries: 3
start_period: 40s

interval,timeout和start_period被指定为持续时间。

test必须是一个字符串或一个列表。 如果是列表,则第一项必须是NONE,CMD或CMD-SHELL。 如果它是一个字符串,则相当于指定CMD-SHELL,后跟该字符串。

# Hit the local web app
test: ["CMD", "curl", "-f", "http://localhost"] # As above, but wrapped in /bin/sh. Both forms below are equivalent.
test: ["CMD-SHELL", "curl -f http://localhost && echo 'cool, it works'"]
test: curl -f https://localhost && echo 'cool, it works'

要禁用图像设置的任何默认healthcheck,您可以使用disable: true。这相当于指定test: ["NONE"]。

healthcheck:
disable: true

注意:start_period选项是更新的功能,仅适用于2.3文件格式。

image

指定要启动容器的映像。可以是存储库/标记,也可以是局部镜像ID。

image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd

如果镜像不存在,Compose就尝试拉它,除非您也指定了构建,在这种情况下,它使用指定的选项来构建它,并使用指定的标记标记它。

init

在容器中运行一个init,它可以转发信号并重新获得进程。要么设置一个布尔值来使用默认的init,要么指定一条自定义的路径。

version: '2.2'
services:
web:
image: alpine:latest
init: true version: '2.2'
services:
web:
image: alpine:latest
init: /usr/libexec/docker-init

isolation

指定容器的隔离技术。

labels

使用Docker labels向容器添加元数据。您可以使用数组或字典。

建议您使用反向dns标记来防止您的标签与其他软件所使用的标签相冲突。

labels:
com.example.description: "Accounting webapp"
com.example.department: "Finance"
com.example.label-with-empty-value: "" labels:
- "com.example.description=Accounting webapp"
- "com.example.department=Finance"
- "com.example.label-with-empty-value"

links

链接到另一个服务中的容器。 既可以指定服务名称又可以指定链接别名(“SERVICE:ALIAS”),或者仅指定服务名称。链接是遗留选项。 我们建议使用网络。

web:
links:
- "db"
- "db:database"
- "redis"

链接服务的容器可以在与别名相同的主机名中访问,也可以在没有指定别名的情况下使用服务名。

链接还以与依赖项相同的方式表示服务之间的依赖关系,因此它们决定了服务启动的顺序。

注意:如果您定义了链接和网络,那么带有链接的服务必须共享至少一个公共网络,以便进行通信。我们建议使用网络。

logging

为服务进行日志配置。

logging:
driver: syslog
options:
syslog-address: "tcp://192.168.0.42:123"

驱动程序名称指定服务容器的日志记录驱动程序,与docker run的--log-driver选项一样。

默认值是json文件。

driver: "json-file"
driver: "syslog"
driver: "none"

network_mode

网络模式。 使用与docker客户端相同的值--net参数,以及特殊的表单service:[service name]。

network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"

networks

加入网络,引用*网络密钥下的条目。

services:
some-service:
networks:
- some-network
- other-network

ALIASES

网络上此服务的别名(备用主机名)。 同一网络上的其他容器可以使用服务名称或别名来连接到某个服务的容器。

由于别名是网络范围的,相同的服务可以在不同的网络上具有不同的别名。

services:
some-service:
networks:
some-network:
aliases:
- alias1
- alias3
other-network:
aliases:
- alias2

在下面的例子中,提供了三种服务(web,worker和db)以及两个网络(新的和旧的)。 数据库服务可以在新网络上的主机名数据库或数据库以及旧数据库上的db或mysql*问。

version: '2'

services:
web:
build: ./web
networks:
- new worker:
build: ./worker
networks:
- legacy db:
image: mysql
networks:
new:
aliases:
- database
legacy:
aliases:
- mysql networks:
new:
legacy:

IPV4_ADDRESS, IPV6_ADDRESS

加入网络时,为此服务的容器指定一个静态IP地址。

*网络部分中的相应网络配置必须具有ipam块,其中包含每个静态地址的子网和网关配置。 如果需要IPv6寻址,则必须设置enable_ipv6选项。

version: '2.1'

services:
app:
image: busybox
command: ifconfig
networks:
app_net:
ipv4_address: 172.16.238.10
ipv6_address: 2001:3984:3989::10 networks:
app_net:
driver: bridge
enable_ipv6: true
ipam:
driver: default
config:
- subnet: 172.16.238.0/24
gateway: 172.16.238.1
- subnet: 2001:3984:3989::/64
gateway: 2001:3984:3989::1

LINK_LOCAL_IPS

指定一个链接本地ip的列表。链路本地ip是一种特殊的ip,它属于一个众所周知的子网,由操作员完全管理,通常依赖于其部署的架构。因此,他们不是由docker(IPAM驱动)管理的。

version: '2.1'
services:
app:
image: busybox
command: top
networks:
app_net:
link_local_ips:
- 57.123.22.11
- 57.123.22.13
networks:
app_net:
driver: bridge

PRIORITY

指定一个优先级来指明Compose应该将服务的容器连接到其网络的顺序。 如果未指定,则默认值为0。

在以下示例中,应用服务首先连接到app_net_1,因为它具有最高优先级。 然后它连接到app_net_3,然后是app_net_2,它使用默认优先级值0。

version: '2.3'
services:
app:
image: busybox
command: top
networks:
app_net_1:
priority: 1000
app_net_2: app_net_3:
priority: 100
networks:
app_net_1:
app_net_2:
app_net_3:

pid

pid: "host"
pid: "container:custom_container_1"
pid: "service:foobar"

如果设置为以下格式之一:container:<container_name>service:<service_name>,则该服务共享指定容器或服务的PID地址空间。

如果设置为“主机”,则服务的PID模式是主机PID模式。 这将打开容器与主机操作系统之间的共享PID地址空间。 使用此标志启动的容器可以访问和操作裸机的名称空间中的其他容器,反之亦然。

pids_limit

调整一个容器的pid限制。设置为-1,无限的pid。

pids_limit: 10

ports

公开端口。 既可以指定两个端口(HOST:CONTAINER),也可以指定容器端口(选择临时主机端口)。

ports:
- "3000"
- "3000-3005"
- "8000:8000"
- "9090-9091:8080-8081"
- "49100:22"
- "127.0.0.1:8001:8001"
- "127.0.0.1:5000-5010:5000-5010"
- "6060:6060/udp"
- "12400-12500:1240"

runtime

指定用于服务容器的运行时间。 默认运行时和可用运行时在docker info的输出中列出。

web:
image: busybox:latest
command: true
runtime: runc

scale

指定要为此服务部署的默认容器数量。 无论何时运行docker-compose,Compose都会创建或移除容器以匹配指定的编号。 该值可以使用--scale标志覆盖。

web:
image: busybox:latest
command: echo 'scaled'
scale: 3

security_opt

覆盖每个容器的默认标记方案。

security_opt:
- label:user:USER
- label:role:ROLE

stop_grace_period

指定在发送SIGKILL之前,如果试图停止一个容器(如果它没有处理SIGTERM)(或者使用stop_signal指定了任何停止信号),请等待多久。 指定为持续时间。

stop_grace_period: 1s
stop_grace_period: 1m30s

默认情况下,停止在发送SIGKILL之前等待10秒钟容器退出。

stop_signal

设置一个替代信号来停止容器。 默认停止使用SIGTERM。 使用stop_signal设置替代信号会导致停止发送该信号。

stop_signal: SIGUSR1

storage_opt

为此服务设置存储驱动程序选项。

storage_opt:
size: '1G'

sysctls

在容器中设置的内核参数。 您可以使用数组或字典。

sysctls:
net.core.somaxconn: 1024
net.ipv4.tcp_syncookies: 0 sysctls:
- net.core.somaxconn=1024
- net.ipv4.tcp_syncookies=0

ulimits

覆盖容器的默认ulimit。您可以将单个限制指定为整数或软/硬限制作为映射。

ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000

userns_mode

userns_mode: "host"

如果Docker守护程序配置了用户命名空间,则禁用此服务的用户命名空间。

volumes

装载主机文件夹或命名卷。 命名卷需要使用*卷密钥指定。

您可以在主机上挂载相对路径,该路径相对于正在使用的Compose配置文件的目录进行扩展。

SHORT SYNTAX

短语法使用通用的[SOURCE:]TARGET[:MODE]格式,其中SOURCE可以是主机路径或卷名称。 TARGET是卷安装的容器路径。 标准模式是ro为只读,rw为读写(默认)。

volumes:
# Just specify a path and let the Engine create a volume
- /var/lib/mysql # Specify an absolute path mapping
- /opt/data:/var/lib/mysql # Path on the host, relative to the Compose file
- ./cache:/tmp/cache # User-relative path
- ~/configs:/etc/configs/:ro # Named volume
- datavolume:/var/lib/mysql

LONG SYNTAX

长表单语法允许在短表单中不能表示的其他字段的配置。

  • type: the mount type volume, bind, tmpfs or npipe
  • source: the source of the mount, a path on the host for a bind mount, or the name of a volume defined in the top-level volumes key. Not applicable for a tmpfs mount.
  • target: the path in the container where the volume is mounted
  • read_only: flag to set the volume as read-only
  • bind: configure additional bind options
    • propagation: the propagation mode used for the bind
  • volume: configure additional volume options
    • nocopy: flag to disable copying of data from a container when a volume is created
version: "3.2"
services:
web:
image: nginx:alpine
ports:
- "80:80"
volumes:
- type: volume
source: mydata
target: /data
volume:
nocopy: true
- type: bind
source: ./static
target: /opt/app/static networks:
webnet: volumes:
mydata:

volume_driver

指定用于此服务上所有已声明卷的默认卷驱动程序。

volume_driver: mydriver

volumes_from

装载来自其他服务或容器的所有卷,可选择指定只读访问(ro)或读写(rw)。 如果未指定访问级别,则使用读写。

volumes_from:
- service_name
- service_name:ro
- container:container_name
- container:container_name:rw

restart

no是默认的重启策略,在任何情况下都不会重启容器。 指定为always时,容器总是重新启动。The on-failure policy restarts a container if the exit code indicates an on-failure error.

  - restart: no
- restart: always
- restart: on-failure

cpu_count, cpu_percent, cpu_shares, cpu_quota, cpus, cpuset, domainname, hostname, ipc, mac_address, mem_limit, memswap_limit, mem_swappiness, mem_reservation, oom_kill_disable, oom_score_adj, privileged, read_only, shm_size, stdin_open, tty, user, working_dir

每一个都是一个单独的值,类似于docker运行的对应。

cpu_count: 2
cpu_percent: 50
cpus: 0.5
cpu_shares: 73
cpu_quota: 50000
cpuset: 0,1 user: postgresql
working_dir: /code domainname: foo.com
hostname: foo
ipc: host
mac_address: 02:42:ac:11:65:43 mem_limit: 1000000000
memswap_limit: 2000000000
mem_reservation: 512m
privileged: true oom_score_adj: 500
oom_kill_disable: true read_only: true
shm_size: 64M
stdin_open: true
tty: true

https://docs.docker.com/compose/compose-file/compose-file-v2/

上一篇:Protobuf有没有比JSON快5倍?用代码来击破pb性能神话


下一篇:Android Protobuf应用及原理