Compose配置文件介绍
此文主要描述Docker Compose file version 3 格式,第三版本会和1x,2x有很多不同。
一、服务配置
Compose文件是一个YAML
文件,用于定义服务,网络和数据卷等。 Compose文件的默认路径为./docker-compose.yml
。
Compose作服务编排,简单的说,就是把docker run
的一堆启动参数文件化,使一条命令(docker-compose up
)完成多个容器的构建启动成为可能。
build
顾名思义,就是构建镜像,可以指定Dockerfile
路径,构建参数等。
build: ./dir
build:
context: ./dir
dockerfile: Dockerfile-alternate
args:
buildno: 1
注:如果这个compose文件是用来部署一个stack到swarm节点,这个选项就不能有,因为
docker stack
命令只接受已经构建的镜像
context
指定Dockerfile路径,可以是本地文件(绝对路径或者相对路径),可以是git仓库。
build:
context: ./dir
dockerfile
如果上例子指定的dockerfile名字不叫Dockerfile
,可以通过该指令给出。
build:
context: .
dockerfile: Dockerfile-alternate
args
用于构建阶段的参数
cap_add, cap_drop
添加或者删除容器功能
cap_add:
- ALL
cap_drop:
- NET_ADMIN
- SYS_ADMIN
注:stack 部署会忽略该选项。
command
覆盖镜像默认的command
command: bundle exec thin -p 3000
# 可以是一个list
command: [bundle, exec, thin, -p, 3000]
cgroup_parent
为容器指定父cgroup
cgroup_parent: m-executor-abcd
注:stack 部署会忽略该选项。
container_name
默认自动为容器命名,可以通过该选择指定。
deploy
部署相关配置,如部署数量,重启策略。如果通过docker-compose run
启动,会自动忽略该配置。
deploy:
replicas: 6
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
注:只支持version 3
mode
Either global (exactly one container per swarm node) or replicated (a specified number of containers). The default is replicated.
如果配置为globle
,表示所有swarm节点都有一个容器,如果配置为replicated
,可以指定容器数量,默认为replicated
mode: global
replicas
如果服务mode配置为replicated
,replicas
就是用来指定容器数量的
mode: replicated
replicas: 6
placement
指定容器的放置约束。
placement:
constraints:
- node.role == manager
- engine.labels.operatingsystem == ubuntu 14.04
update_config
服务更新配置:
- parallelism: 同事update的容器数
- delay: 一组容器update时间隔时间
- failure_action: 如果1个容器更新失败,是继续(continue)还是暂停(pausem default)
- monitor: 每次任务后,监视故障的持续时间
- max_failure_ratio: 升级的最大失败次数
update_config:
parallelism: 2
delay: 10s
resources
配置资源约束。 这将替换版本3之前的文件中的旧资源约束选项(cpu_shares,cpu_quota,cpuset,mem_limit,memswap_limit)。
resources:
limits:
cpus: '0.001'
memory: 50M
reservations:
cpus: '0.0001'
memory: 20M
restart_policy
Configures if and how to restart containers when they exit. Replaces restart.
配置容器退出时的启动策略。替换restart
- condition:
none
,on-failure
, 或者any
(默认: any). - delay: 重启间隔(default: 0).
- max_attempts: 最大重启次数 (default: never give up).
- window: 在决定重新启动是否成功之前等待的时间,default: decide immediately).
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
window: 120s
labels
指定服务的标签。 这些标签只能在服务上设置,而不能在服务的任何容器上设置。
version: "3"
services:
web:
image: web
deploy:
labels:
com.example.description: "This label will appear on the web service"
在deploy
外设置
version: "3"
services:
web:
image: web
labels:
com.example.description: "This label will appear on all containers for the web service"
devices
列出devices
devices:
- "/dev/ttyUSB0:/dev/ttyUSB0"
注:stack 部署会忽略该选项。
depends_on
服务依赖,如果使用docker-compose up
启动,也将会启动所依赖的服务。
version: '2'
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
注:depends_on 不会等待所依赖的服务启动完成后再启动,因为无法判断一个服务是否已经启动完成。
可以结合healthcheck
判断服务健康状态。但注意只在2.1
版本中, 后文会介绍到。
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"
dns
指定dns服务
dns: 8.8.8.8
dns:
- 8.8.8.8
- 9.9.9.9
注:stack 部署会忽略该选项。
dns_search
指定dns domain
dns_search: example.com
dns_search:
- dc1.example.com
- dc2.example.com
注:stack 部署会忽略该选项。
tmpfs
挂载一个临时目录到容器
tmpfs: /run
tmpfs:
- /run
- /tmp
注:stack 部署会忽略该选项。
entrypoint
覆盖默认的entrypoint
entrypoint: /code/entrypoint.sh
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默认的entrypoint,如果dockerfile只有一个CMD指令,他将被忽略。
env_file
通过文件添加环境变量,将覆盖默认的变量。
env_file: .env
env_file:
- ./common.env
- ./apps/web.env
- /opt/secrets.env
一行一个key=value,以#开头的会被忽略
# Set Rails/Rack environment
RACK_ENV=development
注:如果您的服务指定了构建选项,则在构建期间不会自动显示环境文件中定义的变量。 使用build的args子选项来定义构建时环境变量。
值只能是一个值,不能是变量。
environment
添加环境变量。如果是boolean,注意引号的使用方式。
environment:
RACK_ENV: development
SHOW: 'true'
SESSION_SECRET:
environment:
- RACK_ENV=development
- SHOW=true
- SESSION_SECRET
注:如果您的服务指定了构建选项,则在构建期间将不会自动显示在环境中定义的变量。 使用build的args子选项来定义构建时环境变量。
expose
暴露端口给主机。
expose:
- "3000"
- "8000"
extends
在当前文件或另一个文件中扩展另一个服务,可选地覆盖配置。
您可以在任何服务上使用扩展与其他配置键。 extends值必须是使用必需的服务和可选文件键定义的字典。
extends:
file: common.yml
service: webapp
如果省略文件Compose在当前文件中查找服务配置。 文件值可以是绝对路径或相对路径。 如果指定相对路径,则Compose将其视为相对于当前文件的位置。
不支持循环引用。
注:部署到stack时不支持该选项,可以通过
docker-compose config
生成配置再部署
external_links
连接 docker-compose.yml
外的服务
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql
注:如果使用version 2和以上版本,至少有一个外部容器和他共用相同网络。部署到stack时会被忽略。
extra_hosts
extra_hosts:
- "somehost:162.242.195.82"
- "otherhost:50.31.209.229"
group_add
Version 2 file format and up.
添加组,组必须同时存在于要添加的容器和主机系统中。
version: '2'
services:
image: alpine
group_add:
- mail
healthcheck
Version 2.1 file format and up.
配置容器启动监控检查:
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 1m30s
timeout: 10s
retries: 3
# 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
image
指定镜像:格式可以有以下几种
image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd
labels
给容器添加元数据
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
容器间的连接:
web:
links:
- db
- db:database
- redis
其实就是在容器中的/etc/hosts
添加容器id和别名的映射。
如果同时配置了link是和networks,至少有一个共用的网络。 部署到stack会被忽略
logging
Logging configuration for the service. 记录服务的日志:
logging:
driver: syslog
options:
syslog-address: "tcp://192.168.0.42:123"
driver: "json-file" # default
driver: "syslog"
driver: "none"
注:只有使用
json-file
和journald
时,可以通过docker-compose logs 查看日志。其他方式将不打印任何日志
network_mode
网络模式。和docker run -net 拒用相同功能。
network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"
注:部署stack时会被忽略
networks
引用顶级网络配置的条目
services:
some-service:
networks:
- some-network
- other-network
ipv4_address, ipv6_address
给容器指定静态ip。和networks结合使用。
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
ports
容器和主机的端口映射
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"
volumes
数据卷挂载
version: "3"
services:
db:
image: db
volumes:
- data-volume:/var/lib/db
backup:
image: backup-service
volumes:
- data-volume:/var/lib/backup/data
volumes:
data-volume: