传送门:docker-compose.yml详解-(一)
本文是基于version 3
指定设备映射列表 (等同于 docker run --device 的作用)
devices:
- "/dev/ttyUSB0:/dev/ttyUSB0"
自定义DNS服务器。可以是单个值或列表。(等同于 docker run --dns 的作用)
dns: 8.8.8.8
dns:
- 8.8.8.8
- 9.9.9.9
设置 DNS 搜索域(等同于 docker run --dns-search 的作用)
dns_search: example.com
dns_search:
- dc1.example.com
- dc2.example.com
覆盖容器的默认 entrypoint 指令 (等同于 docker run --entrypoint 的作用)
entrypoint: /code/entrypoint.sh
入口点也可以是列表,类似于 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
注意
:设置entrypoint两者都会覆盖使用ENTRYPOINT , Dockerfile指令在服务映像上设置的任何默认入口点,并清除镜像上的任何默认命令-这意味着如果CMD Dockerfile中有指令,则将其忽略。
从文件添加环境变量。可以是单个值或列表。
如果您使用指定了Compose文件docker-compose -f FILE,则in env_file的路径 相对于该文件所在的目录。
如果多个文件中的变量重名则后面的变量覆盖前面的变量, environment 的值覆盖 env_file 的值
Compose环境文件中的每一行都采用VAR=VAL格式。以开头的行#被视为注释,并被忽略。空行也将被忽略。
env_file: .env
env_file:
- ./common.env
- ./apps/web.env
- /opt/secrets.env
添加环境变量。您可以使用数组或字典。任何布尔值(true,false,yes,no)都需要用引号引起来,以确保YML解析器不会将其转换为True或False。
environment 的值可以覆盖 env_file 的值 (等同于 docker run --env 的作用)。
environment:
RACK_ENV: development
SHOW: 'true'
SESSION_SECRET:
environment:
- RACK_ENV=development
- SHOW=true
- SESSION_SECRET
公开端口而不将其发布到主机上-只有链接的服务才能访问它们。只能指定内部端口。
expose:
- "3000"
- "8000"
连接不在 docker-compose.yml 中定义的容器或者不在 compose 管理的容器(docker run 启动的容器, 在 v3 版本中使用 swarm 部署时将忽略该选项)
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql
添加 host 记录到容器中的 /etc/hosts 中 (等同于 docker run --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
v2.1 以上版本, 定义容器健康状态检查, 类似于 Dockerfile 的 HEALTHCHECK 指令
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 1m30s
timeout: 10s
retries: 3
start_period: 40s
检查容器检查状态的命令, 该选项必须是一个字符串或者列表, 第一项必须是 NONE, CMD 或 CMD-SHELL, 如果其是一个字符串则相当于 CMD-SHELL 加该字符串
每次检查之间的间隔时间
运行命令的超时时间
重试次数
v3.4 以上新增的选项, 定义容器启动时间间隔
true 或 false, 表示是否禁用健康状态检测和 test: NONE 相同
指定用于启动容器的镜像。可以是存储库/标签或本地镜像ID。
image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd
如果镜像不存在,除非指定了build,否则Compose会尝试拉取它,在这种情况下,它将使用指定的选项来构建它并使用指定的标签对其进行标记。
注
:v3.7新增参数
true 或 false 表示是否在容器中运行一个 init, 它接收信号并传递给进程
version: "3.7"
services:
web:
image: alpine:latest
init: true
使用的默认初始化二进制文件是Tini,并安装在/usr/libexec/docker-init守护程序主机上。您可以通过init-path配置选项将守护程序配置为使用自定义init二进制文件 。
指定容器的隔离技术。在Linux上,唯一支持的值是default。在Windows中,可接受的值是default,process和 hyperv。
使用Docker标签将元数据添加到容器中。您可以使用数组或字典。
建议您使用反向DNS表示法,以防止标签与其他软件使用的标签冲突。
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"
警告:该--link是Docker的旧功能。它最终可能会被删除。除非绝对需要继续使用它,否则建议使用用户定义的网络 来促进两个容器之间的通信,而不要使用--link。用户定义的网络不支持的一项功能 --link是在容器之间共享环境变量。但是,可以使用其他机制(例如卷)以更可控的方式在容器之间共享环境变量。
链接到另一个服务中的容器。指定服务名称和链接别名(SERVICE:ALIAS),或者仅指定服务名称
链接也以与depends_on相同的方式表示服务之间的依赖关系 ,因此它们确定了服务启动的顺序。
在使用 swarm 部署时将忽略该选项
web:
links:
- db
- db:database
- redis
如果同时定义链接和网络,则它们之间具有链接的服务必须共享至少一个公共网络才能进行通信。
服务的日志记录配置。
logging:
driver: syslog
options:
syslog-address: "tcp://192.168.0.42:123"
指定日志记录驱动程序, 默认 json-file (等同于 docker run --log-driver 的作用)
默认值为json-file。
--og-driverdocker run
选项,请参考https://docs.docker.com/config/containers/logging/configure/
注意
:只有json-file和journald驱动程序才能从docker-compose up和直接提供日志docker-compose logs。使用任何其他驱动程序不会打印任何日志。
默认驱动程序json-file,具有用于限制存储的日志量的选项。为此,请使用键值对以获取最大存储大小和最大文件数:
设置单个日志文件的大小, 当到达这个值后会进行日志滚动操作
日志文件保留的数量
这是一个docker-compose.yml限制日志存储的示例文件:
version: "3.7"
services:
some-service:
image: some-service
logging:
driver: "json-file"
options:
max-size: "200k"
max-file: "10"
指定网络模式 (等同于 docker run --net 的作用, 在使用 swarm 部署时将忽略该选项)
network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"
注
:network_mode: "host"不能与链接混合使用
将容器加入指定网络 (等同于 docker network connect 的作用), networks 可以位于 compose 文件顶级键和 services 键的二级键
同一网络上的容器可以使用服务名称或别名连接到其中一个服务的容器
在下面的例子中,提供了三种服务(web,worker,和db),其中两个网络(new和legacy)。db服务是在可到达的主机名db或database连上new网络,并且db或mysql将连上legacy网络。
version: "3.7"
services:
web:
image: "nginx:alpine"
networks:
- new
worker:
image: "my-worker-image:latest"
networks:
- legacy
db:
image: mysql
networks:
new:
aliases:
- database
legacy:
aliases:
- mysql
networks:
new:
legacy:
加入网络后,为此服务的容器指定一个静态IP地址。
顶级网络部分中的相应网络配置 必须具有一个 ipam块,其中子网配置覆盖每个静态地址。
version: "3.7"
services:
app:
image: nginx:alpine
networks:
app_net:
ipv4_address: 172.16.238.10
ipv6_address: 2001:3984:3989::10
networks:
app_net:
ipam:
driver: default
config:
- subnet: "172.16.238.0/24"
- subnet: "2001:3984:3989::/64"
将PID模式设置为主机PID模式。这将打开容器和主机操作系统之间的PID地址空间共享。
pid: "host"
建立宿主机和容器之间的端口映射关系, ports 支持两种语法格式
要么指定两个端口(HOST:CONTAINER),要么仅指定容器端口(选择了临时主机端口)。
注意
:以这种HOST:CONTAINER格式映射端口时,使用低于60的容器端口可能会遇到错误的结果,因为YAML会将格式xx:yy中的数字解析为以60为底的值。因此,我们建议始终将端口映射显式指定为字符串。
# 暴露容器的 3000 端口, 宿主机的端口由 docker 随机映射一个没有被占用的端口
-"3000"
# 暴露容器的 3000 到 3005 端口, 宿主机的端口由 docker 随机映射没有被占用的端口
- "3000-3005"
# 容器的 8000 端口和宿主机的 8000 端口建立映射关系
- "8000:8000"
- "9090-9091:8080-8081"
# 指定映射宿主机的指定地址的
- "127.0.0.1:8001:8001"
- "127.0.0.1:5000-5010:5000-5010"
# 指定协议
- "6060:6060/udp"
长格式语法允许配置其他不能以短格式表示的字段。
注意
:长语法是v3.2中的新增功能
ports:
- target: 80
published: 8080
protocol: tcp
mode: host
no是默认的重启策略,在任何情况下都不会重启容器。当always指定时,容器总是重新启动。该 on-failure如果退出代码指示的故障错误政策重启的容器。
注意
:在v3版本文件以群集模式部署堆栈时,将忽略此选项 。请改用restart_policy。
restart: "no"
restart: always
restart: on-failure
restart: unless-stopped
不懂
为每个容器覆盖默认的标签 (在使用 swarm 部署时将忽略该选项)
security_opt:
- label:user:USER
- label:role:ROLE
指定在发送了 SIGTERM 信号之后, 容器等待多少秒之后退出(默认 10s)
stop_grace_period: 1s
stop_grace_period: 1m30s
指定停止容器发送的信号 (默认为 SIGTERM 相当于 kill PID; SIGKILL 相当于 kill -9 PID; 在使用 swarm 部署时将忽略该选项)
设置容器中的内核参数 (在使用 swarm 部署时将忽略该选项)
此选项需要Docker Engine 19.03或更高 版本。
可以使用数组或字典。
sysctls:
net.core.somaxconn: 1024
net.ipv4.tcp_syncookies: 0
sysctls:
- net.core.somaxconn=1024
- net.ipv4.tcp_syncookies=0
注
:v2版本文件格式及更高版本。
在容器内安装一个临时文件系统。可以是单个值或列表。
tmpfs: /run
tmpfs:
- /run
- /tmp
注
:v3.6版文件格式及更高版本。
在容器内安装一个临时文件系统。Size参数指定tmpfs安装的大小(以字节为单位)。默认情况下不受限制。
- type: tmpfs
target: /app
tmpfs:
size: 1000
覆盖容器的默认ulimit。可以将单个限制指定为整数,也可以将软/硬限制指定为映射。
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000