YAML文件参考
compose文件格式为.yaml,默认文件名为docker-compose.yml。
services配置参考
注意:compose文件有两个版本:version 1和version 2。关于版本1和版本2的区别请参考Versioning章节。
image
指定为镜像名称或镜像 ID。如果镜像在本地不存在,Compose 将会尝试拉取这个镜像,除非你同时指定了build
。
例如:
image: ubuntu:14.04
注意:在版本1中,使用同时使用build和image将会出错
build
指定Dockerfile所在文件夹的路径。Compose将会利用它自动构建这个镜像,然后使用这个镜像。
build: /path/to/build/dir
command
覆盖容器启动后默认执行的命令。
command: bundle exec thin -p 3000
亦可像dockerfile一样,写成列表的形式:
command: [bundle, exec, thin, -p, 3000]
container_name
指定容器的名称,若不指定将会为容器生成一个默认名称。容器名称必须唯一,否则出错。
container_name: my-web-container
depends_on
两个容器之间的依赖:
docker-compose up
将会按照依赖关系启动容器。在下面的例子中,db
和redis
将先于web
启动。docker-compose up SERVICE
将会自动启动容器所依赖的容器。下面的例子中,使用docker-compose up web
启动web
容器时,将会创建和启动db
和redis
。version: '2' services: web: build: . depends_on: - db - redis redis: image: redis db: image: postgres
entrypoint
覆盖默认的entrypoint。
entrypoint: /code/entrypoint.sh
亦可像dockerfile一样,将entrypoint写为列表的形式:
entrypoint:
- php
- -d
- zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so
- -d
- memory_limit=-1
- vendor/bin/phpunit
env_file
从文件中获取环境变量,可以为单独的文件路径或是文件路径列表。
如果通过docker-compose -f FILE
指定了模板文件,则env_file
中路径会基于模板文件路径。
如果有变量名称与environment
指令冲突,environment
指令会覆盖该变量,即以environment
指令为准。
env_file: .env
env_file:
- ./common.env
- ./apps/web.env
- /opt/secrets.env
环境变量文件中每一行必须符合格式,支持 # 开头的注释行。
# Set Rails/Rack environment
RACK_ENV=development
environment
设置环境变量。你可以使用数组或字典两种格式。
任何布尔值:true、false、yes、no,需要用引号('')括起来,因为YML解析器会将其转化为True或False。
只给定名称的变量会自动获取它在 Compose 主机上的值,可以用来防止泄露不必要的数据。
environment:
RACK_ENV: development
SHOW: 'true'
SESSION_SECRET:
environment:
- RACK_ENV=development
- SHOW=true
- SESSION_SECRET
expose
暴露端口,但不映射到宿主机,只被连接的容器访问。
仅可以指定内部端口为参数
expose:
- "3000"
- "8000"
labels
注:常用
为容器增加元数据(metadata),可使用数组或字典的形式。
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"
net
只支持版本1,版本2中使用
network_mode
网络模式,与docker run
命令中--net
参数一致。container:...
形式能够使用服务的名称代替容器的名称或id。
net: "bridge"
net: "host"
net: "none"
net: "container:[service name or container name/id]"
network_mode
只支持版本2,版本1中使用
net
网络模式,与docker run
命令中--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
只支持版本2,版本1中使用
net
网络连接。参考网络配置参考
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
)以及两个网络(new和legacy)。
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地址。
networks章节中需要有相应的网络配置:必须含有ipam
,并且子网和网关配置正确。如果要配置IPv6地址,com.docker.network.enable_ipv6
驱动选项必须配置为true
。
一个例子:
version: '2'
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
driver_opts:
com.docker.network.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
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"
volumes
卷挂载路径设置。可以设置宿主机路径 (HOST:CONTAINER
) 或加上访问模式 (HOST:CONTAINER:ro
)。
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
volumes_from
从另一个服务或容器挂载它的所有卷。ro指定只读,rw指定读写,默认为rw。
volumes_from:
- service_name
- service_name:ro
- container:container_name
- container:container_name:rw
注意:
container:...
形式只在版本2中支持,版本1中直接写容器名称不需要container:
标签,如下:
- service_name
- service_name:ro
- container_name
- container_name:rw
cap_add,capdrop
增加或删除容器的能力。 例如:
cap_add:
- ALL
cap_drop:
- NET_ADMIN
- SYS_ADMIN
说明:cap-add: -ALL将为容器增加所有的功能。cap_drop: - NET_ADMIN - SYS_ADMIN将删除容器的网络和系统能力。
cgroup_parent
为容器 指定一个可选的父cgroup。
cgroup_parent: m-executor-abcd
devices
设备映射列表。等同于使用docker run
命令创建容器时的--device
选项。
devices:
- "/dev/ttyUSB0:/dev/ttyUSB0"
dns
自定义DNS服务。可以是一个或是列表。
dns: 8.8.8.8
dns:
- 8.8.8.8
- 9.9.9.9
dns_search
自定义DNS服务查询域。可以是一个或是列表。
dns_search: example.com
dns_search:
- dc1.example.com
- dc2.example.com
tmpfs
在容器中挂在临时的文件系统。可以是一个或是列表。
tmpfs: /run
tmpfs:
- /run
- /tmp
extends
基于已有的服务进行扩展,可以是当前文件也可以是其他文件。
例如我们已经有了一个webapp
服务,模板文件为common.yml
。
# common.yml
webapp:
build: ./webapp
environment:
- DEBUG=false
- SEND_EMAILS=false
编写一个新的development.yml
文件,使用common.yml
中的webapp
服务进行扩展。
# development.yml
web:
extends:
file: common.yml
service: webapp
ports:
- "8000:8000"
links:
- db
environment:
- DEBUG=true
db:
image: postgres
后者会自动继承common.yml
中的webapp
服务及相关环境变量。
external_links
链接到docker-compose.ym
l外部的容器,甚至并非Compose
管理的容器。参数格式跟links
类似。
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql
extra_hosts
增加主机名映射。与docker run
命令参数--add-host
一致。
extra_hosts:
- "somehost:162.242.195.82"
- "otherhost:50.31.209.229"
在容器的/etc/hosts文件里,会创建完整的ip地址和主机名:
162.242.195.82 somehost
50.31.209.229 otherhost
links
链接到其它服务中的容器。使用[服务名称](同时作为别名)或[服务名称:服务别名](SERVICE:ALIAS
)格式都可以。
web:
links:
- db
- db:database
- redis
Links同时也表达了服务奖的依赖关系(就像 depends_on
定义的那样),所以服务的启动顺序已经被确定了。
logging
只支持版本2,在版本1中使用
log_driver
和log_opt
为服务配置logging。
logging:
driver: syslog
options:
syslog-address: "tcp://192.168.0.42:123"
driver:
为服务的容器定义了logging驱动的名称,与docker run
中--log-driver
参数一致。
默认的值是json-file
driver: "json-file"
driver: "syslog"
driver: "none"
注意:只有
json-file
驱动,在docker-compose up
和docker-compose logs
中能够直接获取。使用其他的驱动将不会打印任何日志。
使用关键字options
定义logging选项,与docker run
中--log-opt
参数一致。
options
是一个键值对key: value
,例如:
driver: "syslog"
options:
syslog-address: "tcp://192.168.0.42:123"
log_driver
只支持版本1,版本2中使用
logging
定义日志驱动,默认是json-file
。
log_driver: syslog
log_opt
只支持版本1,版本2中使用
logging
用键值对key: value
形式定义日志的选项,一个syslo
g选项的例子如下:
log_opt:
syslog-address: "tcp://192.168.0.42:123"
pid
跟主机系统共享进程命名空间。打开该选项的容器可以相互通过进程 ID 来访问和操作。
pid: "host"
security_opt
为每个容器重写默认的标签方案。
security_opt:
- label:user:USER
- label:role:ROLE
stop_signal
设置停止容器的信号。默认停止使用SIGTERM
。
stop_signal: SIGUSR1
ulimits
重写容器的默认ulimits。
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
cpu_shares, cpu_quota, cpuset, domainname, hostname, ipc, mac_address, mem_limit, memswap_limit, privileged, read_only, restart, shm_size, stdin_open, tty, user, working_dir
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
privileged: true
restart: always
read_only: true
shm_size: 64M
stdin_open: true
tty: true
网络配置参考
顶级(即与services关键字处于同一级别)networks关键字可以创建自定义网络。
driver
指定网络使用的驱动。默认的驱动取决于Docker引擎的配置,
在单主机上,大都是bridge
,在Swarm上,一般是overlay
。
如果驱动无法获取,Docker引擎将会返回一个错误。
driver: overlay
driver_opts
为网络指定一系列的可选项,使用键值对的形式。这些选项是依赖驱动的,可参阅驱动文档获取更多信息。可选的。
driver_opts:
foo: "bar"
baz: 1
ipam
指定自定义IPAM配置。包含若干属性,每个属性都是可选的:
driver
:自定义IPAM驱动,代替默认值。config
:带有零个或多个配置块的列表,每个配置块可包含如下关键字:subnet
:网段的子网,采用CIDR的形式ip_range
:容器IP范围gateway
:IPV4或IPV6网关aux_addresses
:网络驱动的附加IPV4或IPV6地址,作为主机名和IP的映射
一个完整的例子如下:
ipam:
driver: default
config:
- subnet: 172.28.0.0/16
ip_range: 172.28.5.0/24
gateway: 172.28.5.254
aux_addresses:
host1: 172.28.1.5
host2: 172.28.1.6
host3: 172.28.1.7
external
如果设置external
为true
,表示该网络时在在Compose外面创建的。docker-compose up
将不会创建该网络,如果该网络不存在将会出错。
关键字external
不能与其他的网络配置关键字同时使用(driver
、driver_opt
、ipam
)。
下面的例子中,proxy
是与外界的网关。Compose将会在已存在的网络中查找outside
,并将proxy服务的容器和该网络连接。
version: '2'
services:
proxy:
build: ./proxy
networks:
- outside
- default
app:
build: ./app
networks:
- default
networks:
outside:
external: true
可将Compose file中使用的网络名与实际网络名分开指定:
networks:
outside:
external:
name: actual-name-of-network
变量替代
Compose文件中配置项里可以包含环境变量的值。Compose可以只用运行docker-compose
主机上的sHell环境变量值。比如,shell中含有环境变量EXTERNAL_PORT=8000
,在compose文件中可这样使用:
web:
build: .
ports:
- "${EXTERNAL_PORT}:5000"
运行docker-compose
后,Compose在shell中查找EXTERNAL_PORT环境变量,并用其值进行替换。本例中,在创建web
容器前,将会使用端口映射8000:5000
。
若shell中没有设置该环境变量,Compose将会使用空字符串替代。
支持$VARIABLE
和${VARIABLE}
两种形式的变量。
若果配置中需要使用$
符号,请使用$$
。