Compose配置文件介绍

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 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 生成配置再部署

连接 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"

容器间的连接:

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-filejournald时,可以通过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:
CONTENTS