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-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 create 和 docker 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:
external: true
以上实例使用 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>
uid 和 gid:在服务的任务容器中拥有安装的配置文件的数字 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:
file: my-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
指定 constraints 和 preferences
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:值可以为 none 、on-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
order: stop-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配置文件编写)的主要内容,如果未能解决你的问题,请参考以下文章