在线文档教程
Docker 17
撰写 | Compose

版本1 | Version 1 (Compose)

Compose 文件版本1参考

参考和准则

这些主题描述撰写文件格式的版本1。这是最古老的版本。

Compose 和 Docker 兼容性矩阵

有几种版本的 Compose 文件格式 - 1,2,2.x 和3.x 下面的表格是一个快速的样子。有关每个版本包含的内容以及如何升级的完整详细信息,请参阅关于版本和升级

此表显示哪些 Compose 文件版本支持特定的 Docker 版本。

Compose file formatDocker Engine release
3.317.06.0+
3.217.04.0+
3.11.13.1+
3.01.13.0+
2.317.06.0+
2.21.13.0+
2.11.12.0+
2.01.10.0+
1.01.9.1.+

除了编写表中显示的文件格式版本外,撰写本身也处于发布计划中,如撰写版本,但是文件格式版本并不一定会随每次发行版而增加。例如,撰写文件格式3.0是在撰写1.10.0版,并在随后的版本中逐步进行版本化。

服务配置参考

版本1撰写文件是 YAML 定义文件服务。

撰写文件的默认路径是./docker-compose.yml

针尖::您可以使用.yml.yaml文件的扩展名。他们都能工作。

服务定义包含将应用于为该服务启动的每个容器的配置,这与将命令行参数传递给docker run

正如docker run在 Dockerfile 指定选项(例如,CMDEXPOSEVOLUMEENV)是默认的尊重-你不需要再次指定它们docker-compose.yml

本节包含版本1中的服务定义所支持的所有配置选项的列表。

build

在构建时应用的配置选项。

build可以指定为包含生成上下文路径的字符串。

build: ./dir

注意 在版本1文件格式中,build有两种不同的方式:

  • build: .允许字符串 form() - 而不是版本2中允许的对象形式。

  • 使用build连同image是不允许的。尝试这样做会导致错误。

dockerfile

候补文件。

Composet 将使用要构建的备用文件。还必须指定生成路径。

build: . dockerfile: Dockerfile-alternate

注意 在版本1文件格式中,dockerfile有两种方式与新版本不同:

  • 它出现在旁边build,而不是作为一个子选项:

  • 使用dockerfile连同image是不允许的。尝试这样做会导致错误。

cap_add, cap_drop

添加或删除容器功能。见man 7 capabilities完整的名单。

cap_add: - ALL cap_drop: - NET_ADMIN - SYS_ADMIN

注意:在使用(版本3)Compose 文件的群集模式下部署堆栈时,会忽略这些选项。

命令

重写默认命令。

command: bundle exec thin -p 3000

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

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

cgroup_parent

为容器指定一个可选父 cgroup。

cgroup_parent: m-executor-abcd

container_name

指定自定义容器名称,而不是生成的默认名称。

container_name: my-web-container

因为 Docker 容器名称必须是唯一的,所以如果指定了自定义名称,则不能将服务扩展到超过1个容器。尝试这样做会导致错误。

器件

设备映射列表。使用与--deviceDocker 客户端创建选项相同的格式。

devices: - "/dev/ttyUSB0:/dev/ttyUSB0"

dns

自定义 DNS 服务器。可以是单个值,也可以是列表。

dns: 8.8.8.8 dns: - 8.8.8.8 - 9.9.9.9

dns_search

自定义 DNS 搜索域。可以是单个值或列表。

dns_search: example.com dns_search: - dc1.example.com - dc2.example.com

入口点

覆盖默认入口点。

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 中存在指令,它将被忽略。

env_file

从文件中添加环境变量。可以是单个值,也可以是列表。

如果您已经指定了 Compose 文件docker-compose -f FILE,则路径env_file相对于该文件所在的目录。

环境中指定的环境变量覆盖这些值。

env_file: .env env_file: - ./common.env - ./apps/web.env - /opt/secrets.env

撰写期望 env 文件中的每一行都是VAR=VAL格式。#以空行开头的行(即注释)被忽略。

# Set Rails/Rack environment RACK_ENV=development

注意:如果您的服务指定了构建选项,则在构建过程中,环境文件中定义的变量将不会自动显示。

该值按VAL原样使用,根本不作任何修改。例如,如果值被引号包围(如通常是 shell 变量的情况),则引用将包含在传递给 Compose 的值中。

请记住,列表中文件的顺序在确定分配给多次显示的变量的值时非常重要。列表中的文件从上到下进行处理。对于在文件中指定的相同变量a.env并在文件中分配了不同的值b.env,如果b.env在下面列出(在)之后,则来自b.envstand 的值。例如,在下面的声明中docker_compose.yml

services: some-service: env_file: - a.env - b.env

和下列文件:

# a.env VAR=1

# b.env VAR=hello

$VAR将是hello

环境

添加环境变量。您可以使用数组或字典。任何布尔值; 真,假,需要用引号括起来以确保它们不被 YML 解析器转换为 True 或 False。

只有一个密钥的环境变量会在计算机上运行时解析为它们的值,这对于密钥或主机特定的值可能会有所帮助。

environment: RACK_ENV: development SHOW: 'true' SESSION_SECRET: environment: - RACK_ENV=development - SHOW=true - SESSION_SECRET

注意:如果您的服务指定了构建选项,environment则在构建过程中定义的变量将不会自动可见。

expose

公开端口而不将它们发布到主机 - 它们只能被链接服务访问。只能指定内部端口。

expose: - "3000" - "8000"

扩展

在当前文件或另一个文件中扩展另一个服务,可以选择覆盖配置。

您可以将extends任何服务与其他配置密钥一起使用。该extends值必须是使用必需键service和可选file键定义的字典。

extends: file: common.yml service: webapp

service服务的名称被扩展,例如webdatabase。这file是定义该服务的 Compose 配置文件的位置。

如果省略file Compose 查找当前文件中的服务配置。该file值可以是绝对路径或相对路径。如果您指定相对路径,则 Compose 将其视为相对于当前文件的位置。

你可以扩展一个本身扩展另一个的服务。您可以无限延长。撰写不支持循环引用,并docker-compose在遇到循环时返回错误。

有关更多extends信息,请参阅扩展文档。

external_links

链接到在此之外docker-compose.yml甚至在Compose之外的容器,特别是对于提供共享或公共服务的容器。external_links遵循类似于links指定容器名称和链接别名(CONTAINER:ALIAS)的语义。

external_links: - redis_1 - project_db_1:mysql - project_db_1:postgresql

extra_hosts

添加主机名映射。使用与 docker 客户端--add-host参数相同的值。

extra_hosts: - "somehost:162.242.195.82" - "otherhost:50.31.209.229"

具有 IP 地址和主机名的条目将在/etc/hosts服务的内部容器中创建,例如:

162.242.195.82 somehost 50.31.209.229 otherhost

图像

指定要启动容器的图像。可以是存储库/标记,也可以是部分图像ID。

image: redis image: ubuntu:14.04 image: tutum/influxdb image: example-registry.com:4000/postgresql image: a4bc65fd

如果图像不存在,则组合尝试提取它,除非您还指定了建房,在这种情况下,它使用指定的选项构建它,并使用指定的标记标记它。

*在第1版文件格式,使用build连同image是不允许的。尝试这样做会导致错误。

标签

将元数据添加到容器中。码头标签可以使用数组或字典。

建议您使用反向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"

链接

链接到其他服务中的容器。要么同时指定服务名称和链接别名%28SERVICE:ALIAS%29,或者只是服务名称。

web: links: - db - db:database - redis

链接服务的容器可以在与别名相同的主机名上到达,如果没有指定别名,则可以访问服务名称。

链接还以与服务相同的方式表示服务之间的依赖关系。视情况而定[医]上,所以他们决定了服务启动的顺序。

*如果您同时定义了链接和网络,在它们之间具有链接的服务必须至少共享一个共同的网络才能进行通信。

原木[医]司机

第1版文件格式只有。在版本2和更高版本中,使用测井...

指定日志驱动程序。默认情况是json-file...

log_driver: syslog

原木[医]选择

第1版文件格式只有。在版本2和更高版本中,使用测井...

将日志记录选项指定为键值对。一个例子syslog备选方案:

log_opt: syslog-address: "tcp://192.168.0.42:123"

第1版文件格式只有。在版本2和更高版本中,使用网络[医]模式和网络...

网络模式。使用与码头客户端相同的值。--net参数。大container:...表单可以采用服务名称,而不是容器名称或id。

net: "bridge" net: "host" net: "none" net: "container:[service name or container name/id]"

PID

pid: "host"

将PID模式设置为主机PID模式。这将打开容器与主机操作系统之间的共享PID地址空间。使用此标志启动的容器将能够访问和操作裸金属机器名称空间中的其他容器,反之亦然。

港口

暴露端口。要么指定两个端口%28HOST:CONTAINER%29,或仅选择容器端口%28a随机主机端口%29。

*映射HOST:CONTAINER格式时,当使用低于60的容器端口时,可能会遇到错误的结果,因为YAML将解析格式中的数字。xx:yy按百分之二十八基数60%29计算。因此,我们建议始终显式地将端口映射指定为字符串。

ports: - "3000" - "3000-3005" - "8000:8000" - "9090-9091:8080-8081" - "49100:22" - "127.0.0.1:8001:8001" - "127.0.0.1:5000-5010:5000-5010" - "6060:6060/udp"

保安[医]选择

重写每个容器的默认标记方案。

security_opt: - label:user:USER - label:role:ROLE

停![医]信号

设置另一个停止容器的信号。默认情况下stop使用SIGTERM。使用stop_signal会导致stop而不是发送信号。

stop_signal: SIGUSR1

极限

重写容器的默认uLimits。可以将单个限制指定为整数,也可以将软/硬限制指定为映射。

ulimits: nproc: 65535 nofile: soft: 20000 hard: 40000

体积、体积[医]司机

挂载路径或命名卷,可选择指定主机上的路径%28HOST:CONTAINER%29,或访问模式%28HOST:CONTAINER:ro29%。为第2版文件,则需要使用顶层volumes键.使用时第1版,如果命名卷不存在,Docker引擎将自动创建它。

您可以在主机上挂载一个相对路径,该路径将相对于正在使用的撰写配置文件的目录展开。相对路径应该总是从......

volumes: # Just specify a path and let the Engine create a volume - /var/lib/mysql # Specify an absolute path mapping - /opt/data:/var/lib/mysql # Path on the host, relative to the Compose file - ./cache:/tmp/cache # User-relative path - ~/configs:/etc/configs/:ro # Named volume - datavolume:/var/lib/mysql

如果不使用主机路径,则可以指定volume_driver...

volume_driver: mydriver

有几件事要注意,取决于合成文件版本你用的是:

  • 为第1版文件,命名卷和容器卷都将使用指定的驱动程序。

  • 如果还指定了volume_driver。例如,如果指定./foo:/data./foo部分将直接传递到卷驱动器,而不被展开。

见码头容积和卷插件想了解更多信息。

卷[医]从

从其他服务或容器挂载所有卷,可选地指定只读访问%28。ro%29或读写%28rw29%。如果未指定访问级别,则将使用读-写。

volumes_from: - service_name - service_name:ro

cpu[医]股票,CPU[医]配额,cpuet,域名,主机名,IPC,mac[医]地址,mem[医]限制,记忆交换[医]极限,mem[医]交换,特权,阅读[医]只,重新启动,SHM[医]大小,标准的[医]打开,TTY,用户,工作[医]迪尔

每个值都是一个值,类似于码头运行对口。

cpu_shares: 73 cpu_quota: 50000 cpuset: 0,1 user: postgresql working_dir: /code domainname: foo.com hostname: foo ipc: host mac_address: 02:42:ac:11:65:43 mem_limit: 1000000000 memswap_limit: 2000000000 privileged: true restart: always read_only: true shm_size: 64M stdin_open: true tty: true

撰写文件

  • 用户指南

  • 安装组合

  • 编写文件版本和升级

  • 从Django开始

  • 从Rails开始

  • 从WordPress开始

  • 命令行引用