Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。它允许用户使用YAML格式的配置文件(通常是docker-compose.yml)来配置应用程序所需的所有服务,并可以通过一个命令来启动或关闭这些容器。
服务配置(接上一篇)docker-compose详解(三)
11. dns
自定义DNS服务器。可以是一个值或一个列表。例如:
dns: 8.8.8.8
dns:
- 8.8.8.8
- 9.9.9.9
12. dns_search
自定义DNS搜索域。可以是一个值或一个列表。例如:
dns_search: example.com
dns_search:
- dc1.example.com
- dc2.example.com
13. entrypoint
覆盖默认的入口命令。注意设置entrypoint会覆盖所有在服务镜像上使用Dockerfile的ENTRYPOINT指令设置的默认入口命令,并清除掉服务镜像上任何使用Dockerfile的CMD指令设置的启动容器时默认执行的命令。可以写成字符串形式,例如:
entrypoint: /code/entrypoint.sh
也可以写成JSON数组形式,例如:
entrypoint: ["php", "-d", "memory_limit=-1", "vendor/bin/phpunit"]
14. env_file
从文件中获取环境变量。可以是一个值或一个列表。例如:
env_file: .env
env_file:
- ./common.env
- ./apps/web.env
- /opt/runtime_opts.env
如果指定了Compose配置文件,env_file路径为相对于该文件所在目录的路径。如果环境文件中设置有与environment选项同名的变量,将以后者为准,无论这些变量的值是空还是未定义。其中环境文件每行都以VAR=VAL格式声明环境变量,以#开头的行被解析为注释,和空行一样将被忽略。环境文件示例如下:
# Set Rails/Rack environment
RACK_ENV=development
如果变量的值被引号引起来(通常是shell变量),则引号也包含在传递给Compose的值中。如果以列表的形式同时指定了多个环境文件,列表中文件的顺序对于给多次出现的环境变量确定值十分重要,且列表中的文件是从上到下处理的。如果指定了多个环境文件且有至少两个文件声明了相同名称但不同值的环境变量,那么指定列表中顺序靠下的文件将覆盖顺序靠上的文件中的相同名称的环境变量的值。例如:
services:
some-service:
env_file:
- a.env
- b.env
如果a.env中有VAR=1,b.env中有VAR=2,则最终$VAR=2。
注意:这里所说的环境变量是针对宿主机的Compose而言的,如果在服务中指定了build配置项,那么这些变量并不会进入构建过程中,如果要定义构建时用的环境变量首选build的arg子选项。
15. environment
设置环境变量。可以使用数组或字典两种格式。任何布尔类型的值都必须用引号引起来,以便解析器将它们解释为字符串。值设置了键没设置值的环境变量可以在运行Compose的主机环境中解析它们的值,这对于使用密钥和特定于主机的值用处很大。例如:
environment:
RACK_ENV: development
SHOW: 'true'
SESSION_SECRET:
environment:
- RACK_ENV=development
- SHOW=true
- SESSION_SECRET
注意:这里所说的环境变量是针对宿主机的Compose而言的,如果在服务中指定了build配置项,那么这些变量并不会进入构建过程中,如果要定义构建时用的环境变量首选build的arg子选项。
16. expose
暴露指定端口,但不映射到宿主机,只被连接的服务访问。只能指定内部端口。例如:
expose:
- "3000"
- "8000"
17. external_links
链接到docker-compose.yml外部的容器,甚至并非Compose管理的外部容器,特别是对于提供共享或公共服务的容器。在同时指定容器名称和链接别名(CONTAINER:ALIAS)时,external_links与旧版本中的配置项links有类似的语义。例如:
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql
注意:Compose项目里面的容器连接到外部容器的前提条件是外部容器中必须至少有一个容器连接到与项目内的服务的同一个网络里面。建议使用networks代替旧版本中的配置项Links。
使用docker stack deploy时的注意事项:在swarm mode下部署堆栈时,external_links配置项将被忽略。
18. extra_hosts
添加主机名到IP的映射。使用和Docker客户端中的--add-host的参数一样的值。例如:
extra_hosts:
- "somehost:162.242.195.82"
- "otherhost:50.31.209.229"
会在启动后的服务容器中的/etc/hosts文件中添加如下两条具有主机名和IP地址的条目:
162.242.195.82 somehost
50.31.209.229 otherhost
19. healthcheck
配置运行检查以确定服务容器是否健康。支持以下配置选项:
test:指定健康检测的方法。
interval:启动容器到进行健康检查的间隔时间以及两次健康检查的间隔时间。
timeout:单次健康检查的超时时间,超过该时间该次健康检查失败。
retries:健康检查失败后的最大重试次数,重试了最大次数依然失败,容器将被视为unhealthy。
start_period:为需要时间引导的容器提供的初始化时间,在此期间检查失败将不计入最大重试次数,但是如果在启动期间健康检查成功,则会将容器视为已启动,并且所有连续失败将计入最大重试次数。
其中interval、timeout和start_period都被指定为持续时间(durations)。start_period是在3.4版的配置文件格式中加入。test必须是字符串或JSON数组格式。如果是JSON数组格式,第一项必须是NONE、CMD或CMD-SHELL其中之一。如果是字符串格式,则等效于指定CMD-SHELL后跟该字符串的JSON数组格式。
例如以下示例,指定检测方法为访问http://localhost,健康检查间隔时间为1m30s,健康检查超时时间为10s,重试次数为3,启动容器后等待健康检查的初始化时间为40s:
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 1m30s
timeout: 10s
retries: 3
start_period: 40s
例如以下示例,两种形式等效:
test: ["CMD-SHELL", "curl -f http://localhost || exit 1"]
test: curl -f https://localhost || exit 1
使用disable: true可以设置镜像禁用所有健康检查,相对于test: ["NONE"]。例如:
healthcheck:
disable: true
20. image
指定要从中启动容器的镜像。可以写仓库/标签(repository/tag)或镜像ID。示例如下:
image: redis
image: ubuntu:18.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd
如果镜像不存在,Compose会自动拉取镜像,除非指定了build,这种情况下会使用指定选项构建镜像并给镜像打上指定标签。
21. init
在3.7版的配置文件格式中加入
在容器内运行一个初始化程序以转发信号并获取进程。设置为true即可为服务启动此功能。例如:
version: "3.8"
services:
web:
image: alpine:latest
init: true
注意:默认使用的初始化二进制文件是Tini,并安装在主机守护进程的/usr/libexec/docker-init。可以通过Daemon configuration file中的init-path将守护进程配置为使用自定义的初始化二进制文件 。
22. isolation
指定容器的隔离技术。Linux上只支持default值。Windows上支持default、process和hyperv这三个值。
23. 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"
24. links
警告:--link是Docker的遗留功能。它最终可能会被删除。建议您使用用户自定义网络代替--link来进行两个容器间的通信。用户自定义的网络不支持--link在容器之间共享的环境变量的功能。但是可以使用例如数据卷之类的其他机制以更可控的方式在容器之间共享环境变量。
链接到其他服务中的容器。可以使用"SERVICE:ALIAS"或"SERVICE"的格式,其中SERVICE为服务名称,ALIAS为链接别名。例如:
web:
links:
- "db"
- "db:database"
- "redis"
链接服务的容器可以通过与别名相同的主机名访问,如果未指定别名,则可以使用服务名。默认情况下,不需要链接即可使服务进行通信,任何服务都可以使用该服务的名称访问任何其他服务。链接也可以和depends_on一样表示服务之间的依赖关系 ,因此可以确定服务启动的顺序。
注意:如果同时定义链接和网络,则它们之间具有链接的服务必须共享至少一个公共网络才能进行通信。
使用docker stack deploy时的注意事项:在swarm mode下部署堆栈时,links配置项将被忽略。
25. logging
服务的日志配置。例如:
logging:
driver: syslog
options:
syslog-address: "tcp://192.168.0.42:123"
driver配置项指定服务容器的日志驱动,与docker run中的--log-driver选项一样。默认值为json-file,这里列举三种日志驱动类型:
# jsonfile
driver: "json-file"
# syslog
driver: "syslog"
# none
driver: "none"
使用options配置项为日志驱动指定日志记录选项,与docker run中的--log-opt选项一样。例如:
driver: "syslog"
options:
syslog-address: "tcp://192.168.0.42:123"
默认日志驱动json-file具有限制日志存储量的选项。例如以下示例,max-size设置最大存储大小为200k,max-file设置存储的最大文件数为10,随着日志超过最大限制,将删除较旧的日志文件以允许存储新日志:
options:
max-size: "200k"
max-file: "10"