docker compose configuration

不支持docker stack deploy选项

  • build
  • cgroup_parent
  • container_name
  • devices
  • tmpfs
  • external_links
  • links
  • network_mode
  • restart
  • security_opt
  • stop_signal
  • sysctls
  • userns_mode

command

覆盖默认命令

command: bundle exec thin -p 3

configs

使用服务 configs 配置为每个服务赋予相应的访问权限,支持两种不同的语法

[warning] Note: 配置必须存在或在 configs 此堆栈文件的顶层中定义,否则堆栈部署失效

1. SHORT 语法

SHORT 语法只能指定配置名称,这允许容器访问配置并将其安装在 /<config_name> 容器内,源名称和目标装入点都设为配置名称

version: "3.3"
services:
  redis:
    image: redis:latest
    deploy:
      replicas: 1
    configs:
      - my_config
      - my_other_config
configs:
  my_config:
    file: ./my_config.txt
  my_other_config:
    external: true

以上实例使用 SHORT 语法将 redis 服务访问授予 my_configmy_other_config ,并被 my_other_config 定义为外部资源,这意味着它已经在 Docker 中定义。可以通过 docker config create 命令或通过另一个堆栈部署。如果外部部署配置都不存在,则堆栈部署会失败并出现 config not found 错误

**[warning] Note: config 定义仅在 3.3 版本或在更高版本的撰写文件格式中受支持,YAML 的布尔值(true, false, yes, no, on, off)必须要使用引号引起来(单引号、双引号均可),否则会当成字符串解析。

2. LONG 语法

LONG 语法提供了创建服务配置的更加详细的信息

  • source:Docker 中存在的配置的名称
  • target: 要在服务的任务中装载的文件的路径或名称。如果未指定则默认为 /<source>
  • uidgid: 在服务的任务容器中拥有安装的配置文件的数字 UIDGID。如果未指定,则默认为在Linux上。Windows不支持。
  • mode: 在服务的任务容器中安装的文件的权限,以八进制表示法。例如,0444 代表文件可读的。默认是 0444

下面示例在容器中将 my_config 名称设置为 redis_config,将模式设置为 0440(group-readable)并将用户和组设置为 103。该 redis 服务无法访问 my_other_config 配置

version: "3.3"
services:
  redis:
    image: redis:latest
    deploy:
      replicas: 1
    configs:
      - source: my_config
        target: /redis_config
        uid: '103'
        gid: '103'
        mode: 0440
configs:
  my_config:
    file: ./my_config.txt
  my_other_config:
    external: true

deploy

指定与部署和运行服务相关的配置

1.endpoint_mode

指定连接到群组外部客户端服务发现方法

  • endpoint_mode: vip - Docker 为该服务分配了一个虚拟 IP(VIP),作为客户端的 “前端“ 部位用于访问网络上的服务。
  • endpoint_mode: dnsrr - DNS轮询(DNSRR)服务发现不使用单个虚拟 IP。Docker为服务设置 DNS 条目,使得服务名称的 DNS 查询返回一个 IP 地址列表,并且客户端直接连接到其中的一个。如果想使用自己的负载平衡器,或者混合 Windows 和 Linux 应用程序,则 DNS 轮询调度(round-robin)功能就非常实用
ersion: "3.3"

services:
  wordpress:
    image: wordpress
    ports:
      - "8080:80"
    networks:
      - overlay
    deploy:
      mode: replicated
      replicas: 2
      endpoint_mode: vip

  mysql:
    image: mysql
    volumes:
       - db-data:/var/lib/mysql/data
    networks:
       - overlay
    deploy:
      mode: replicated
      replicas: 2
      endpoint_mode: dnsrr

volumes:
  db-data:

networks:
  overlay:

2.labels

指定服务的标签,这些标签仅在服务上设置,而不是在服务的任何容器上设置

version: "3"
services:
  web:
    image: web
    deploy:
      labels:
        com.example.description: "This label will appear on the web service"

要在容器上设置标签,请使用deploy之外的labels设置

version: "3"
services:
  web:
    image: web
    labels:
      com.example.description: "This label will appear on all containers for the web service"

3.mode

  • global: 每个集节点只有一个容器
  • replicated: 指定容器数量(默认)
version: '3'
services:
  worker:
    image: dockersamples/examplevotingapp_worker
    deploy:
      mode: global

4.placement

指定 constraintspreferences

version: '3'
services:
  db:
    image: postgres
    deploy:
      placement:
        constraints:
          - node.role == manager
          - engine.labels.operatingsystem == ubuntu 14.04
        preferences:
          - spread: node.labels.zone

5.replicas

指定运行的容器数量

version: '3'
services:
  worker:
    image: dockersamples/examplevotingapp_worker
    networks:
      - frontend
      - backend
    deploy:
      mode: replicated
      replicas: 6

6.resources

配置资源限制

示例中,redis服务被限制为使用不超过50M的内存和0.50(50%)的可用处理时间(CPU),并且保留20M的内存和0.25CPU时间

version: '3'
services:
  redis:
    image: redis:alpine
    deploy:
      resources:
        limits:
          cpus: '0.50'
          memory: 50M
        reservations:
          cpus: '0.25'
          memory: 20M

7.restart_policy

配置容器的重新启动,代替 restart

  • condition: 值可以为 noneon-failure 以及 any(默认)
  • delay: 尝试重启的等待时间,默认为 0
  • max_attempts: 在放弃之前尝试重新启动容器次数(默认:从不放弃)。
  • windows: 在决定重新启动是否成功之前的等时间,指定为持续时间(默认值:立即决定)。
version: "3"
services:
  redis:
    image: redis:alpine
    deploy:
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
        window: 120s

8.rollback_config

配置在更新失败的情况下应如何回滚服务

  • parallelism: 一次回滚的容器数。如果设置为0,则所有容器同时回滚
  • delay: 每个容器组的回滚之间等待的时间(默认为0
  • failure_action: 如果回滚失败该怎么办。continue继续或pause暂停之一(默认pause)
  • monitor: 每次更新任务后监视失败的持续时间(ns|us|ms|s|m|h) (默认 0s)
  • max_failure_ratio: 回滚期间容忍的失败率 (默认 0)
  • order: 回滚期间的操作顺序。 stop-first(旧任务在启动新任务之前停止)或start-first(首先启动新任务,并且正在运行的任务暂时重叠)(默认stop-first

9.update_config

  • parallelism:一次性更新的容器数量
  • delay:更新一组容器之间的等待时间。
  • failure_action:如果更新失败,可以执行的的是 continuerollbackpause (默认)
  • monitor:每次任务更新后监视失败的时间(ns|us|ms|s|m|h)(默认为0
  • max_failure_ratio:在更新期间能接受的失败率
  • order:更新次序设置,top-first(旧的任务在开始新任务之前停止)、start-first(新的任务首先启动,并且正在运行的任务短暂重叠)(默认 stop-first

[warning] 注意:order仅对v3.4及更高版本的撰写文件格式支持

version: '3.4'
services:
  vote:
    image: dockersamples/examplevotingapp_vote:before
    depends_on:
      - redis
    deploy:
      replicas: 2
      update_config:
        parallelism: 2
        delay: 10s
        order: stop-first

depends_on

服务依赖关系之间的依赖关系

例如下面容器会先启动 redisdb 两个服务,最后才启动 web 服务

version: '3'
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres

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

在容器内安装临时文件系统。可以是单个值或列表

[info] Version 3.6及以上启用

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

在容器内安装临时文件系统。 Size参数指定tmpfs mount的大小(以字节为单位)。默认无限制

 - type: tmpfs
     target: /app
     tmpfs:
       size: 1000

entrypoint

Dockerfile 中有一个指令叫做 ENTRYPOINT 指令,用于指定接入点。覆盖 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

env_file

从文件添加环境变量。可以是单个值或列表。
environment 环境中的设置的变量会会覆盖这些值,无论这些值未定义还是为 None

env_file: .env

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

environment

添加环境变量,可以使用数组或字典。与上面的 env_file 选项完全不同,反而和 arg 有几分类似,这个标签的作用是设置镜像变量,它可以保存变量到镜像里面,也就是说启动的容器也会包含这些变量设置,这是与 arg 最大的不同。
一般 arg 标签的变量仅用在构建过程中。而 environmentDockerfile 中的 ENV 指令一样会把变量一直保存在镜像、容器中,类似 docker run -e 的效果

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

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

expose

暴露端口而不将它们发布到主机, 它们只能被链接服务访问。只能指定内部端口,如果需要发布到主机需要使用ports

expose:
 - "3000"
 - "8000"

extra_hosts

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

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

容器启动后在/etc/hosts查看hosts

162.242.195.82  somehost
50.31.209.229   otherhost

healthcheck

[info] Version 2.1 及以上启用

配置运行的检查以确定此服务的容器是否健康, 参考healthcheck文档

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

[info] 注意:start_period仅支持v3.4及更高版本

  • intervaltimeout 以及 start_period 都定为持续时间
  • test 必须是字符串或列表,如果它是一个列表,第一项必须是 NONECMDCMD-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 || exit 1"]
test: curl -f https://localhost || exit 1

禁用图像设置的任何默认运行状况检查,可以使用disable:true。这相当于指定test:[“NONE”]

healthcheck:
  disable: true

image

指定图像以从中启动容器。可以是image/tagimage ID

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

labels

使用 Docker 标签将元数据添加到容器,可以使用数组或字典

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"

logging

配置日志服务

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

driver值是指定服务器的日志记录驱动程序,默认值为 json-file,与 --log-diver 选项一样

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

[info] 注意:只有驱动程序 json-filejournald 驱动程序可以直接从 docker-compose updocker-compose logs 获取日志。使用任何其他方式不会显示任何日志。

services:
  some-service:
    image: some-service
    logging:
      driver: "json-file"
      options:
        max-size: "200k"
        max-file: "10"

networks

加入指定网络

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

aliases

同一网络上的其他容器可以使用服务器名称或别名来连接到其他服务的容器

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

ports

映射端口

[warning] 注意: 端口映射与network_mode:host不兼容

1.SHORT 语法

可以使用 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"

[warning] 注意:当使用 HOST:CONTAINER 格式来映射端口时,如果使用的容器端口小于 60 可能会得到错误得结果,因为YAML 将会解析 xx:yy 这种数字格式为 60 进制,所以建议采用字符串格式。

2.LONG 语法

LONG 语法支持SHORT 语法不支持的附加字段

  • target:容器内的端口
  • published:公开的端口
  • protocol: 端口协议(tcpudp
  • mode:通过host 用在每个节点还是哪个发布的主机端口或使用 ingress 用于集群模式端口进行平衡负载
ports:
  - target: 80
    published: 8080
    protocol: tcp
    mode: host

[info] 注意:LONG语法是v3.2中的新增功能

stop_grace_period

在发送 SIGKILL 之前指定 stop_signal ,如果试图停止容器(如果它没有处理 SIGTERM(或指定的任何停止信号)),则需要等待的时间

stop_grace_period: 1s
stop_grace_period: 1m30s

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

sysctls

在容器中设置的内核参数,可以为数组或字典

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

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

ulimits

覆盖容器的默认限制,可以单一地将限制值设为一个整数,也可以将soft/hard 限制指定为映射

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

volumes

挂载一个目录或者一个已存在的数据卷容器,可以直接使用 HOST:CONTAINER 这样的格式,或者使用 HOST:CONTAINER:ro 这样的格式,后者对于容器来说,数据卷是只读的,这样可以有效保护宿主机的文件系统

version: "3.2"
services:
  web:
    image: nginx:alpine
    volumes:
      - type: volume
        source: mydata
        target: /data
        volume:
          nocopy: true
      - type: bind
        source: ./static
        target: /opt/app/static

  db:
    image: postgres:latest
    volumes:
      - "/var/run/postgres/postgres.sock:/var/run/postgres/postgres.sock"
      - "dbdata:/var/lib/postgresql/data"

volumes:
  mydata:
  dbdata:

1.SHORT 语法

可以选择在主机(HOST:CONTAINER)或访问模式(HOST:CONTAINER:ro)上指定路径。

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

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

2.LONG 语法

LONG 语法有些附加字段

  • type:安装类型,可以为 volumebindtmpfs
  • source:安装源,主机上用于绑定安装的路径或定义在顶级 volumes密钥中卷的名称 ,不适用于 - tmpfs 类型安装。
  • target:卷安装在容器中的路径
  • read_only:标志将卷设置为只读
  • bind:配置额外的绑定选项
  • propagation:用于绑定的传播模式
  • volume:配置额外的音量选项
  • nocopy:创建卷时禁止从容器复制数据的标志
  • tmpfs:配置额外的 tmpfs 选项
  • sizetmpfs 的大小,以字节为单位

[info] 注意:LONG语法是v3.2中的新增功能

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:

volumes_from

从其它容器或者服务挂载数据卷,可选的参数是 :ro:rw,前者表示容器只读,后者表示容器对数据卷是可读可写的(默认情况为可读可写的)。

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

restart

默认值为 no ,即在任何情况下都不会重新启动容器;当值为 always 时,容器总是重新启动;当值为 on-failure 时,当出现 on-failure 报错容器退出时,容器重新启动。

restart: "no"
restart: always
restart: on-failure
restart: unless-stopped

[danger] 注意:使用v3 Compose文件在deploying a stack in swarm mode ,将忽略此选项。请改用restart_policy

results matching ""

    No results matching ""