附录 4、Docker-compose 配置文件编写指南
本文是《Docker必知必会系列》第十二篇,原文发布于个人博客:悟尘纪。
上一篇:Docker必知必会系列(附录3):Docker-compose 命令使用指南
前言
Compose 配置文件采用 YAML 格式,用于定义 services(服务), networks(网络)和 volumes(卷)。
文件的默认路径为./docker-compose.yml
。有多种版本格式——1、2、2.x 和3.x。 有关每个版本与Docker的兼容性、包含哪些内容以及如何升级的最新信息,请参阅官方文档: 关于版本和升级。
服务定义包含应用于该服务启动的每个容器的配置,就像将命令行参数传递给 docker run
一样。同样,网络和卷定义类似于 docker network create
和docker volume create
。
与 docker run
一样,Dockerfile 中指定的选项,例如 CMD
、 EXPOSE
、 VOLUME
、 ENV
,在缺省情况下都是遵守的——不需要再次以 docker-compose
方式指定它们。
您可以使用类似 Bash 的${VARIABLE}
语法在配置值中使用环境变量 - 有关完整详细信息,请参见变量替换。
文件结构和示例
这是一个投票应用程序的 Compose 文件示例:
配置指令
build
指定 Dockerfile
所在文件夹的路径,Compose
将会利用它自动构建镜像。如:
context、dockerfile和args
可以使用 context
指定文件夹路径(可以是包含 Dockerfile 的目录路径,也可以是 git 存储库的 url),使用 dockerfile
指定 Dockerfile
文件名,使用 arg
为 Dockerfile
中的变量赋值。如:
如果在 build
同时指定了 image
,那么 Compose 会使用在 image
中指定的名字和标签来命名最终构建的镜像。如:
这将从 ./dir
构建,生成名为 webapp
,标签为:tag
的镜像。
cache_from
可以使用 cache_from
指定构建镜像时使用的缓存:
labels
通过标签向生成的镜像添加元数据:
network
设置构建期间 run
指令要链接的网络:
sim_size
设置所构建容器的/dev/shm
分区大小:
target
按照在 Dockerfile
中定义的方式构建指定的阶段。 有关详细信息,请参阅 多阶段构建 文档。
cap_add, cap_drop
添加或删除容器的内核能力:
cgroup_parent
指定父 cgroup
组,意味着将继承该组的资源限制,如:cgroup_parent: m-executor-abcd
command
覆盖容器启动后默认执行的命令。如:command: echo "hello world"
configs
使用configs
按服务授予对配置的访问权限。详细内容请查看 官方文档。
container_name
指定容器名称。默认将会使用 项目名称_服务名称_序号
这样的格式。
注意: 指定容器名称后,该服务将无法进行扩展(scale),因为 Docker 不允许多个容器具有相同的名称。
depends_on
指定服务之间的依赖关系,以便按顺序启动服务。以下例子中会先启动 redis
db
再启动 web
注意:
web
服务不会等待redis
db
「完全启动」之后才启动。如果需要等待服务准备就绪,请参阅控制启动顺序 获取有关此问题的更多信息以及解决该问题的策略。
deploy
仅用于 Swarm mode
,详细内容请查看 官方文档。
devices
指定设备映射关系。使用与 docker 客户端 --device
相同的选项格式:
dns
自定义 DNS
服务器,可以是单个值或列表。
dns_search
配置 DNS
搜索域,可以是单个值或列表。
entrypoint
重写默认入口点,如:entrypoint: ["php", "-d", "memory_limit=-1", "vendor/bin/phpunit"]
env_file
从文件中添加环境变量。可以是单个值或列表。
如果通过 docker-compose -f FILE
方式来指定了 Compose 文件,则 env_file
中变量的路径相对于文件所在目录。
在 environment
声明的变量,会覆盖这些值。即使这些值为空或未定义。
env文件中每一行必须符合 VAL=VAL
格式,以 #
开头的行被视为注释,并被忽略。空行也会被忽略。
environment
设置环境变量。你可以使用数组或字典两种格式。任何布尔值(True、 False、 yes、 no)都需要用引号括起来,以确保 YML 解析器不会将它们转换为 True 或 False。
只有名称的变量会自动解析为 Compose 运行主机上对应变量的值,可以用来防止泄露不必要的数据。
expose
在不将端口发布到主机的情况下公开端口——它们只能被链接的服务访问。 只能指定内部端口。
external_links
注意:不推荐使用,建议使用
networks
指令代替。
链接到 docker-compose.yml
外部的容器,甚至并非 Compose
管理的外部容器。
extra_hosts
添加主机名映射,使用与 Docker 中的 --add-host
参数相同的值:
会在启动后的服务容器的 /etc/hosts
文件中添加如下两条条目。
healthcheck
通过命令检查容器是否健康运行。
test
必须是字符串或列表。 如果是一个列表,则第一个参数必须是 NONE
、 CMD
或 CMD-shell
。 如果它是一个字符串,那么它等价于指定 CMD-SHELL
,然后指定该字符串。以下写法效果是一样的。
要禁用镜像默认健康检查设置,可以使用 disable: true
。 这相当于指定 test: ["NONE"]。
image
指定要从哪个镜像启动容器。如果镜像在本地不存在,也没有指定了 build
,Compose
将会尝试拉取这个镜像。
init
在容器中运行一个 init,用于转发信号和回收进程。 将此选项设置为 true,以便为服务启用此特性。
默认使用的 init 二进制文件是 Tini,并安装在守护进程主机上的
/usr/libexec/docker-init
中。 可以通过init-path
配置选项将守护进程配置为使用自定义 init 二进制文件。
labels
为容器添加 Docker 元数据(metadata)信息。
logging
配置日志选项。
驱动程序名称为服务的容器指定了一个日志驱动程序,与 docker 运行 ---log-driver
选项一样。
只有
json-file
和journald
驱动程序可以直接从docker-compose up
和docker-compose logs
中获得日志。 使用其他驱动程序都不打印日志。
可以使用 options
配置日志驱动的相关参数。与 docker run
的 --log-opt
选项一样。如 json-file
支持的:
network_mode
设置网络模式。和 docker run
的 --network
参数一样。
networks
配置容器连接的网络。
aliases
同一网络上的其他容器可以使用服务名称或这个别名连接到服务的一个容器。由于别名是网络范围的,同一个服务在不同的网络上可以有不同的别名。
在上面的示例中,提供了三个服务(web
、 worker
和 db
)以及两个网络(new
和 legacy
)。 db
服务在 new
网络上的主机名为 db
或 database
,在 legacy
网络上主机名为 db
或 mysql
。
pid
将 PID 模式设置为 host
,将与主机系统共享进程命名空间。使用此标志启动的容器可以访问和操作宿主机名称空间中的其他容器,反之亦然。
ports
暴露端口信息。使用 HOST:CONTAINER
格式,或者仅指定容器端口(宿主机将随机选择端口)都可以。
当使用
HOST:CONTAINER
格式来映射端口时,如果使用的容器端口小于 60 并且没放到引号里,可能会得到错误结果,因为YAML
会自动解析xx:yy
这种数字格式为 60 进制。为避免出现这种问题,建议数字串都采用引号包括起来的字符串格式。
secrets
存储敏感数据,例如 mysql
服务密码。
以上示例授予redis
服务对my_secret
和my_other_secret
秘密的访问权限。 my_secret
的值设置为文件./my_secret.txt
的内容,并将 my_other_secret
定义为外部资源,这意味着它已经在Docker中定义,可以通过运行docker secret create
命令进行定义。如果外部机密不存在,则部署将失败并显示secret not found
错误。
security_opt
指定容器模板标签(label)机制的默认属性(用户、角色、类型、级别等)。例如配置标签的用户名和角色名。
stop_grace_period
指定 stop_signal
在发送 SIGKILL
之前,如果容器无法处理 SIGTERM
(或已使用指定的任何停止信号)而试图停止容器的等待时间 。
默认情况下,stop
在发送 SIGKILL
之前等待10秒以退出容器。
stop_signal
设置替代信号来停止容器。在默认情况下使用的是 SIGTERM 停止容器。
sysctls
配置容器内核参数。
tmpfs
挂载一个临时文件系统到容器。
ulimits
指定容器的 ulimits 限制值。
volumes
数据卷所挂载路径设置。可以设置为宿主机路径(HOST:CONTAINER
)或者数据卷名称(VOLUME:CONTAINER
),并且可以设置访问模式 (HOST:CONTAINER:ro
)。
该指令中路径支持相对路径。
如果路径为数据卷名称,必须在文件中配置数据卷。
其它指令
此外,还有包括 domainname, hostname, ipc, mac_address, privileged, read_only, shm_size, restart, stdin_open, tty, user, working_dir
等指令,基本跟 docker run
中对应参数的功能一致。
指定容器中运行应用的用户名。
指定容器中工作目录。
指定容器中搜索域名、主机名、mac 地址等。
允许容器中运行一些特权命令。
指定容器退出后的重启策略为始终重启。该命令对保持服务始终运行十分有效,在生产环境中推荐配置为 always
或者 unless-stopped
。
以只读模式挂载容器的 root 文件系统,意味着不能对容器内容进行修改。
打开标准输入,可以接受外部输入。
模拟一个伪终端。
读取变量
Compose 模板文件支持动态读取主机的系统环境变量和当前目录下的 .env
文件中的变量。
例如,下面的 Compose 文件将从运行它的环境中读取变量 ${MONGO_VERSION}
的值,并写入执行的指令中。
如果执行 MONGO_VERSION=3.2 docker-compose up
则会启动一个 mongo:3.2
镜像的容器。
若当前目录存在 .env
文件,执行 docker-compose
命令时将从该文件中读取变量。
在当前目录新建 .env
文件并写入以下内容。
执行 docker-compose up
则会启动一个 mongo:3.6
镜像的容器。
参考
官方文档: Compose file
Compose文件示例:Awesome compose
相关文章
下一篇:没有了
写在最后
至此,本系列文章已经阅读完成。
获取最新内容,请访问我的个人博客:悟尘纪。
评论