docker编排参数详解(docker-compose.yml配置文件编写)

Posted 程序猿技术大咖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker编排参数详解(docker-compose.yml配置文件编写)相关的知识,希望对你有一定的参考价值。

    docker compose 在 Docker 容器运用中具有很大的学习意义,docker compose 是一个整合发布应用的利器。而使用 docker compose 时,懂得如何编排 docker compose 配置文件是很重要的。


前言

      关于 docker compose 技术可以查看官方文档 Docker Compose

以下的内容是确立在已经下载好 Docker 以及 Docker Compose,可参看 Docker Compose 的官方安装教程 Install Docker Compose


Docker Compose 配置文件的构建参数说明

docker编排参数详解(docker-compose.yml配置文件编写)

首先,官方提供了一个 docker-compose.yml 配置文件的标准例子

version: "3"
 services:

  redis:
    image: redis:alpine
    ports:
      - "6379"    networks:
      - frontend
    deploy:
      replicas: 2      update_config:
        parallelism: 2        delay: 10s      restart_policy:
        condition: on-failure

  db:
    image: postgres:9.4    volumes:
      - db-data:/var/lib/postgresql/data
    networks:
      - backend
    deploy:
      placement:
        constraints: [node.role == manager]

  vote:
    image: dockersamples/examplevotingapp_vote:before
    ports:
      - 5000:80    networks:
      - frontend
    depends_on:
      - redis
    deploy:
      replicas: 2      update_config:
        parallelism: 2      restart_policy:
        condition: on-failure

  result:
    image: dockersamples/examplevotingapp_result:before
    ports:
      - 5001:80    networks:
      - backend
    depends_on:
      - db
    deploy:
      replicas: 1      update_config:
        parallelism: 2        delay: 10s      restart_policy:
        condition: on-failure

  worker:
    image: dockersamples/examplevotingapp_worker
    networks:
      - frontend
      - backend
    deploy:
      mode: replicated
      replicas: 1      labels: [APP=VOTING]
      restart_policy:
        condition: on-failure
        delay: 10s        max_attempts: 3        window: 120s      placement:
        constraints: [node.role == manager]

  visualizer:
    image: dockersamples/visualizer:stable
    ports:
      - "8080:8080"    stop_grace_period: 1m30s
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"    deploy:
      placement:
        constraints: [node.role == manager]

networks:
  frontend:
  backend:

volumes:
  db-data:


此文件配置了多个服务,关于此配置文件的各个语句含义就需要弄懂配置选项的含义了


文件配置

compose 文件是一个定义服务、 网络和卷的 YAML 文件 。Compose 文件的默认路径是 ./docker-compose.yml

提示:可以是用 .yml .yaml 作为文件扩展名  


服务定义包含应用于为该服务启动的每个容器的配置,就像传递命令行参数一样 docker container create。同样,网络和卷的定义类似于 docker network createdocker volume create


正如 docker container create 在 Dockerfile 指定选项,如 CMD、 EXPOSE、VOLUME、ENV,在默认情况下,你不需要再次指定它们docker-compose.yml。

可以使用 Bash 类 ${VARIABLE} 语法在配置值中使用环境变量。


配置选项

1.bulid

 服务除了可以基于指定的镜像,还可以基于一份 Dockerfile,在使用 up 启动之时执行构建任务,这个构建标签就是 build,它可以指定 Dockerfile 所在文件夹的路径。Compose 将会利用它自动构建这个镜像,然后使用这个镜像启动服务容器。


build: /path/to/build/dir

也可以是相对路径

build: ./dir


设定上下文根目录,然后以该目录为准指定 Dockerfile

build:
  context: ../
  dockerfile: path/of/Dockerfile


例:

version: '3'
services:
  webapp:
    build: ./dir


如果 context 中有指定的路径,并且可以选定 Dockerfile 和 args。那么 args 这个标签,就像 Dockerfile 中的 ARG 指令,它可以在构建过程中指定环境变量,但是在构建成功后取消,在 docker-compose.yml 文件中也支持这样的写法:

version: '3'
services:
  webapp:
    build:
      context: ./dir
      dockerfile: Dockerfile-alternate
      args:
        buildno: 1


ENV 不同的是,args值可以为空值

args:
  - buildno
  - password


如果要指定 image 以及 build ,选项格式为

build: ./dir
image: webapp:tag

这会在 ./dir 目录生成一个名为 webaapp 和标记为 tag 的镜像


Note:当用(Version 3) Compose 文件在群集模式下部署堆栈时,该选项被忽略。因为 docker stack 命令只接受预先构建的镜像


2. context

context 选项可以是 Dockerfile 的文件路径,也可以是到链接到 git 仓库的 url.

当提供的值是相对路径时,它被解析为相对于撰写文件的路径,此目录也是发送到 Docker 守护进程的 context

build:
  context: ./dir


3. dockerfile

使用此 dockerfile 文件来构建,必须指定构建路径

build:
  context: .
  dockerfile: Dockerfile-alternate


4. args

添加构建参数,这些参数是仅在构建过程中可访问的环境变量

首先, 在Dockerfile中指定参数:

ARG buildno
ARG password

RUN echo "Build number: $buildno"RUN script-requiring-password.sh "$password"


然后指定 build 下的参数,可以传递映射或列表

build:
  context: .
  args:
    buildno: 1
    password: secret

build:
  context: .
  args:
    - buildno=1
    - password=secret


指定构建参数时可以省略该值,在这种情况下,构建时的值默认构成运行环境中的值

args:
  - buildno
  - password

  Note: YAML 布尔值(true,false,yes,no,on,off)必须使用引号括起来,以为了能够正常被解析为字符串


5. cache_from

编写缓存解析镜像列表

build:
  context: .
  cache_from:
    - alpine:latest
    - corp/web_app:3.14


6. labels

使用 Docker标签 将元数据添加到生成的镜像中,可以使用数组或字典。

建议使用反向 DNS 标记来防止签名与其他软件所使用的签名冲突

build:
  context: .
  labels:
    com.example.description: "Accounting webapp"
    com.example.department: "Finance"
    com.example.label-with-empty-value: ""

build:
  context: .
  labels:
    - "com.example.description=Accounting webapp"
    - "com.example.department=Finance"
    - "com.example.label-with-empty-value"


7.shm_size

设置容器 /dev/shm 分区的大小,值为表示字节的整数值或表示字符的字符串

build:
  context: .
  shm_size: '2gb'

build:
  context: .
  shm_size: 10000000


8. target

根据对应的 Dockerfile 构建指定 Stage

build:
    context: .
    target: prod


9. cap_add、cap_drop

添加或删除容器功能,可查看 man 7 capabilities

cap_add:
  - ALL

cap_drop:
  - NET_ADMIN
  - SYS_ADMIN


Note:当用(Version 3) Compose 文件在群集模式下部署堆栈时,该选项被忽略。因为 docker stack 命令只接受预先构建的镜像


10. command

覆盖容器启动后默认执行的命令

command: bundle exec thin -p 30001


该命令也可以是一个列表,方法类似于 dockerfile:

command: ["bundle""exec""thin""-p""3000"]


11. configs

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


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


  • 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:
     externaltrue


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


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


  • LONG 语法

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

  • source:Docker 中存在的配置的名称

  • target:要在服务的任务中装载的文件的路径或名称。如果未指定则默认为 /<source> 

  • uidgid:在服务的任务容器中拥有安装的配置文件的数字 UID 或 GID。如果未指定,则默认为在Linux上。Windows不支持。

  • mode:在服务的任务容器中安装的文件的权限,以八进制表示法。例如,0444 代表文件可读的。默认是 0444。如果配置文件无法写入,是因为它们安装在临时文件系统中,所以如果设置了可写位,它将被忽略。可执行位可以设置。如果您不熟悉 UNIX 文件权限模式,Unix Permissions Calculator


下面示例在容器中将 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


可以同时授予多个配置的服务相应的访问权限,也可以混合使用 LONG 和 SHORT 语法。定义配置并不意味着授予服务访问权限。


12. cgroup_parent

可以为容器选择一个可选的父 cgroup_parent

cgroup_parent: m-executor-abcd


  注意:当 使用(Version 3)Compose 文件在群集模式下部署堆栈时,忽略此选项 


13. container_name

为自定义的容器指定一个名称,而不是使用默认的名称

container_name: my-web-container


因为 docker 容器名称必须是唯一的,所以如果指定了一个自定义的名称,不能扩展一个服务超过 1 个容器


14. credential_spec

为托管服务账户配置凭据规范,此选项仅适用于 Windows 容器服务

credential_spec 上的配置列表格式为 file://<filename>registry://<value-name>

使用 file: 应该注意引用的文件必须存在于CredentialSpecs,docker 数据目录的子目录中。在 Windows 上,该目录默认为 C:ProgramDataDocker。以下示例从名为C:ProgramDataDockerCredentialSpecsmy-credential-spec.json 的文件加载凭证规范 :

credential_spec:
  filemy-credential-spec.json

使用 registry: 将从守护进程主机上的 Windows 注册表中读取凭据规范。其注册表值必须位于:

HKLMSOFTWAREMicrosoftWindows NTCurrentVersionVirtualizationContainersCredentialSpecs

下面的示例通过 my-credential-spec 注册表中指定的值加载凭证规范:

credential_spec:
  registry: my-credential-spec


15. deploy

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

version: '3'
services:
  redis:
    image: redis:alpine
    deploy:
      replicas: 6      
      update_config:
        parallelism: 2        
        delay: 10s     
      restart_policy:
        condition: on-failure


这里有几个子选项

  • endpoint_mode

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

  • endpoint_mode:vip :Docker 为该服务分配了一个虚拟 IP(VIP),作为客户端的  “前端“ 部位用于访问网络上的服务。



version: "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:

相关信息:Swarm 模式 CLI 命令 、Configure 服务发现


  • labels

指定服务的标签,这些标签仅在服务上设置。

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

通过将 deploy 外面的 labels 标签来设置容器上的 labels

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


  • mode

global:每个集节点只有一个容器

replicated:指定容器数量(默认)

version: '3'
services:
  worker:
    image: dockersamples/examplevotingapp_worker
    deploy:
      mode: global


  • 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


  • replicas

如果服务是 replicated(默认),需要指定运行的容器数量

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


  •  resources

配置资源限制

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

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


  • restart_policy

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

condition:值可以为 noneon-failure 以及 any(默认)

delay:尝试重启的等待时间,默认为 0

max_attempts:在放弃之前尝试重新启动容器次数(默认:从不放弃)。如果重新启动在配置中没有成功 window,则此尝试不计入配置max_attempts 值。例如,如果 max_attempts 值为 2,并且第一次尝试重新启动失败,则可能会尝试重新启动两次以上。
windows:在决定重新启动是否成功之前的等时间,指定为持续时间(默认值:立即决定)。

version: "3"
services:
  redis:
    image: redis:alpine
    deploy:
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
        window: 120s


  • update_config


配置更新服务,用于无缝更新应用(rolling update)

parallelism:一次性更新的容器数量

delay:更新一组容器之间的等待时间。

failure_action:如果更新失败,可以执行的的是 continue、rollback 或 pause (默认)

monitor:每次任务更新后监视失败的时间(ns|us|ms|s|m|h)(默认为0)

max_failure_ratio:在更新期间能接受的失败率

order:更新次序设置,top-first(旧的任务在开始新任务之前停止)、start-first(新的任务首先启动,并且正在运行的任务短暂重叠)(默认 stop-first

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


不支持 Docker stack desploy 的几个子选项 
build、cgroup_parent、container_name、devices、tmpfs、external_links、inks、network_mode、restart、security_opt、stop_signal、sysctls、userns_mode

……




推荐阅读










写文不易,你的转发、点赞、赞赏就是对我最大的支持

我们一起愉快的玩耍吧

docker编排参数详解(docker-compose.yml配置文件编写)

docker编排参数详解(docker-compose.yml配置文件编写) docker编排参数详解(docker-compose.yml配置文件编写) docker编排参数详解(docker-compose.yml配置文件编写) docker编排参数详解(docker-compose.yml配置文件编写) docker编排参数详解(docker-compose.yml配置文件编写) docker编排参数详解(docker-compose.yml配置文件编写) docker编排参数详解(docker-compose.yml配置文件编写) docker编排参数详解(docker-compose.yml配置文件编写)

docker编排参数详解(docker-compose.yml配置文件编写) docker编排参数详解(docker-compose.yml配置文件编写) docker编排参数详解(docker-compose.yml配置文件编写) docker编排参数详解(docker-compose.yml配置文件编写) docker编排参数详解(docker-compose.yml配置文件编写) docker编排参数详解(docker-compose.yml配置文件编写) docker编排参数详解(docker-compose.yml配置文件编写) docker编排参数详解(docker-compose.yml配置文件编写)

docker编排参数详解(docker-compose.yml配置文件编写)docker编排参数详解(docker-compose.yml配置文件编写) “程序猿技术大咖”,您值得拥有!
docker编排参数详解(docker-compose.yml配置文件编写)
公众号ID:cxyjsdk
长按左侧二维码关注

以上是关于docker编排参数详解(docker-compose.yml配置文件编写)的主要内容,如果未能解决你的问题,请参考以下文章

Docker Compose 1.18.0 之服务编排详解

Docker-Compose

Docker-Compose

docker-compos

ubuntu18.04在线安装dockernvidia-docker2与docker-compos

Docker 从入门到实践系列四 - Docker 容器编排利器 Docker Compose