title: Docker三剑客之Compose(三)——Compose配置文件详解
date: 2015-12-05 15:20:17
tags: docker
categories: Docker 三剑客
Docker Compose
是一个编排多容器分布式部署的工具,提供命令集管理容器化应用的完整开发周期,包括服务构建,启动和停止。
这篇文章介绍Compose的配置文件,它是一个YAML文件。所有的顶层字符定义了一个服务,每一个服务可以有多个配置,其中至少有image
或build
指定其镜像来源。默认配置文件是./docker-compose.yml
。
和docker run
一样,在Dockerfile中指定过的配置项(比如:CMD
, EXPOSE
, VOLUME
, ENV
)无需在Compose
配置文件中再次指定。
接下来介绍Compose
服务的配置项,主要有:
- build
- cap_add & cap_drop
- command
- cgroup_parent
- container_name
- devices
- dns & dns_search
- dockerfile
- env_file
- environment
- expose
- extends
- external_links
- extra_hosts
- image
- links
- log_driver
- net
- ports
- volumes & volume_driver
- volumes_from
build
build
的值或者是一个包含了Dockerfile
文件的目录,或者是一个git库的URL。使用相对路径时,相对目录是Compose
配置文件所在的目录。这个目录也作为上下文context
被发送给docker daemon
。
格式:
build: /path/to/build/dir
build
不能和image
同时使用
cap_add & cap_drop
添加或取消容器的能力capabilities
,可以通过man 7 capabilities
查看后面值的列表;
示例:
cap_add:
- ALL
cap_drop:
- NET_ADMIN
- SYS_ADMIN
command
使用command:
可以覆盖Dockerfile
中或拉去的镜像的CMD
命令;
command: bundle exec thin -p 3000
cgroup_parent
为容器指定一个可选的父cgroup
cgroup_parent: m-executor-abcd
container_name
指定一个容器名称,这回覆盖默认的容器名称
container_name: my-web-container
由于容器的名称必须互不相同,当指定了自定义的容器名称后,在使用docker-compose scale
命令时不能指定相应服务的容器个数大于1。否则会出错。
devices
列出设备间的映射,这和在docker client中使用--device
标识是一样的。
devices:
- "/dev/ttyUSB0:/dev/ttyUSB0"
dns & dns_search
dns
为服务容器指定dns服务器,dns_search
为容器指定dns search domain
。两个都可以是单个值也可以是列表:
dns: 8.8.8.8
dns:
- 8.8.8.8
- 8.8.4.4
dockerfile
dockerfile
指令必须和build
指令一起使用,指定可选的Dockerfile
的位置。
build: /path/to/build/dir
dockerfile: Dockerfile-alternate
dockerfile
指令不能和image
指令一起使用,否则会报错;
env_file
通过文件添加环境变量,可以是单个也可以是列表;如果通过docker-compose -f
指定了Compose配置文件的位置,则env_file的位置相对于这个位置。
通过environment
指令指定的环境变量会覆盖env_file
中定义的环境变量。
env_file: .env
env_file:
- ./common.env
- ./apps/web.env
env文件中,每一行是一个VAR=VAL
对,以#
开头的行被认为是注释,忽略掉,例如:
# Set Rails/Rack environment
RACK_ENV=development
environment
用于添加环境变量,可以有如下两种格式:
environment:
RACK_ENV: development
SHOW: 'true'
SESSION_SECRET:
environment:
- RACK_ENV=development
- SHOW=true
- SESSION_SECRET
expose
对外暴露端口,但不绑定到宿主机上,这些端口一般只用于--link
。
expose:
- "3000"
- "8000"
extends
extends
指令使用其它服务的配置扩展当前服务的配置,通常在extends
中要指定file
和service
两个标识。file
用来指定用于扩展的服务的配置文件;service
用于指定用于扩展的服务的名称。例如:
web:
extends:
file: common-services.yml
service: webapp
上述配置的意思是使用common-services.yml
中的webapp
服务扩展当前文件中的web
服务。扩展的结果就好像在当前服务(web
)的配置中添加了扩展服务(webapp
)的配置一样。关于配置扩展的更多内容不久后会写一篇单独的文章介绍。
external_links
external_links
指令用于连接定义在docker-compose.yml
文件之外甚至Compose
项目之外的容器,尤其是提供了共享服务的容器。其值的格式与--link
标识很像,也是CONTAINER:ALIAS
的形式,例如:
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql
extra_hosts
extra_hosts
指令用于向容器添加IP到主机名的映射,这些数据会写入到容器的/etc/hosts
文件中,格式为:
extra_hosts:
- "somehost:162.242.195.82"
- "otherhost:50.31.209.229"
写入到/etc/hosts
文件中为:
162.242.195.82 somehost
50.31.209.229 otherhost
image
image
指令用于指定服务使用的镜像,本地的或是远程的,Compose
会自动将其pull
下来。其值可以是标签,也可以是镜像ID。
image: ubuntu
image: orchardup/postgresql
image: a4bc65fd
links
links
指令用于连接到其他服务的容器,值的格式为SERVICE:ALIAS
(服务名:别名),也可以只指定服务名(此时,别名和服务名一样)。
links:
- db
- db:database
- redis
和docker run
中的--link
标识一样,links
也会将连接到的容器的IP地址写入/etc/hosts
文件。同时也会创建相应的环境变量。
log_driver
为服务指定log driver,这和docker run
中的--log-driver
标签是一样的,默认值是json-file
。
log_driver: "json-file"
log_driver: "syslog"
log_driver: "none"
只有json-file
被docker-compose up
和docker-compose logs
直接支持。使用其他的driver不会产生日志。
net
为服务容器指定网络模式,其作用和docker run
中的--net
标识是一样的。
net: "bridge"
net: "none"
net: "container:[name or id]"
net: "host"
更多内容请参考Docker之四种网络模式
ports
对外暴露接口,与docker run
中的-p
标识的效果一样,将容器的内部接口映射到宿主机的接口上。值的格式也与-p
标识一样。
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"
volume & volume_driver
向容器添加卷,既可以指定容器中的目录为卷,也可以将宿主机的目录挂载到容器中作为卷。
volumes:
- /var/lib/mysql
- ./cache:/tmp/cache
- ~/configs:/etc/configs/:ro
可以指定宿主机上的相对路径,指定相对路径时其相对于Compose
配置文件的目录,相对路径必须以.
或..
开头。
volumes_from
挂载其他容器或服务中的数据卷,通时可选指定ro
或rw
。
volumes_from:
- service_name
- container_name
- service_name:rw