Compose 文件

Compose 文件(版本3)


Compose 文件是一个定义服务网络YAML 文件。

后缀名采用 .yml 和 .yaml 都可以。

service 定义包含了应用于为服务启动的每个容器的配置,像是传递给 docker run的命令行参数。同样, network 和 volume 定义类似于 docker network createdocker volume create。配置选项是在构建时期应用的。在 Dockerfile 中指定的选项(如 CMD, EXPOSE,VOLUME,ENV等)同样会被利用,因此不必在 docker-compose 文件中再次指定这些选项。
整体采用 <key>:<option>:<value>的形式。

1. services

build

build 既可以是一个包含构建context路径的字符串,也可以是指明context和 可选的 Dockerfile 和 参数。例如:

build: ./dir

build:
context: ./dir
dockerfile: Dockerfile-alternate
args:
    buildno: 1

如果指定了 image 和 build,Compose 会用在 image 中指定的镜像名和标签来命名构建的镜像。

这个选项在 swarm 模型中是不奏效的,因为 docker stack只接受之前构建过的镜像。

CONTEXT

Context 是一个包含 Dockerfile目录的路径或一个 git 仓库的 URL。当 context 值是一个相对路径时,相对的是 Compose 文件的位置。这个目录同样也是传递给 Docker 后台的构建 context。Compose 将构建和标记这个生成的镜像,并在之后利用它。

DOCKERFILE

指定 dockerfile 选项后,Compose 会用这个指定的 dockerfile 来构建。

ARGS

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

YAML 文件中的布尔值(true,false,yes,no,on,off)必须用引号引起了,以便解析器会将它们解释为字符串。


command

重写默认的命令
有以下两种格式:

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

container_name

指定容器的名称,而不是采用默认生成的名称。因为容器名称必须是独一无二的,所以如果指定了容器名,就不能在服务上扩展超过一个容器。


Deploy

此选项只在用 docker stack deploy 部署到 Swarm 上才起作用, docker-compose up 或 docker-compose run 时会失效。

MODE

可以选择 global 和 replicated。默认采用 replicated。

REPLICAS

如果服务的 mode 是 replicated,指明容器的数量。

PLACEMENT

指明布局约束。

version: '3'
services:
  db:
    image: postgres
    deploy:
      placement:
        constraints:
          - node.role == manager
          - engine.labels.operatingsystem == ubuntu 14.04

RESOURCES

配置资源约束

version: '3'
services:
  redis:
    image: redis:alpine
    deploy:
      resources:
        limits:
          cpus: '0.001'
          memory: 50M
        reservations:
          cpus: '0.0001'
          memory: 20M

RESTART_POLICY

配置当容器退出的时候怎么重启它们。

  • condition:none, on-failure 或者 any中的一个(默认为 any)
  • delay:重启尝试操作之间需要等待多长时间(默认为0)
  • max_attempts:最多尝试重启容器多少次(默认为无限次)
  • window:决定重启是否成功需要等待多少时间(默认为立刻决定)

depends_on

表明服务之间的依赖关系
这将有两个作用:

  • docker-compose up将会按照依赖顺序启动服务。例如,db 和 redis 将会在 web 之前启动。
  • docker-compose up <SERVICE>将会自动包含 SERVICE 的依赖。例如,执行 docker-compose up web将会创建和启动 db 和 redis。
version: '3'
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres

env_file

从一个文件中添加环境变量
这个值可以是单一值,也可以是一个列表。
如果通过 docker-compose -f FILE指定了 Compose 文件,那么在 env_file中的文件的路径则相对与 Compose 文件的路径。
environment键中指定的环境变量将会覆盖在 env_file中指定的环境变量。

  • 环境变量文件格式
    环境变量文件的内容应采用 VARIABLE=VALUE的格式。用 # 注释内容。如果 VALUE 中包含引号,引号也会被包含到 VALUE 中传给 Compose

如果服务的键中指定了 build 选项,在环境变量文件中定义的变量在构建期间是不可见的,需使用 args 子参数来定义相关环境变量。
在确定多次出现的变量的值的分配时,列表中的文件顺序很重要。在多个文件中都出现的变量,其值为最后一次出现的文件中的值。


environment

添加环境变量
可以使用列表或字典。任何一个布尔值都必须用引号包围起来以确保不会被 YML 解析器转换为 True,False等。

如果服务的键中指定了 build 选项,在 environment中定义的变量在构建期间是不可见的,需使用 args 子参数来定义相关环境变量。


expose

将指定的端口暴露给连接的容器,而不是对应的主机。

expose:
 - "3000"
 - "8000"

external_links

连接当前 YML 文件外启动的容器,甚至 Compose 外启动的容器,特别是提供共享或公共服务的容器。
语法格式:<container name>:<link alias>

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

image

指定容器开始的镜像。
这个镜像可以是 repository/tag 的形式,或者是镜像 ID 的一部分。如果镜像不存在,Compose 会自动拉取,除非在 build 选项中已经采用特定的镜像构建了这个镜像。


links

连接另一个服务中的容器。可以指定服务名和连接别名(:),也可以直接使用服务名。

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

Links 同样也表明了服务之间的依赖关系,因此它们决定了服务启动的顺序。

如果定义了 links 和 networks,为了服务之间的交流,它们必须共享至少一个共同网络。


networks

要加入的具体网络。具体的入口点在顶级的 networks 键中定义。

services:
  some-service:
    networks:
     - some-network
     - other-network

networks:
  some-network:
  other-network:

ALIASES

在这个网络上这个服务的别名(可替代的主机名)。在同一网络上的其他容器既可以使用服务名也可以使用这个别名来连接服务中的某个容器。
因为 aliases是网络范围的,所以一个服务在不同的网络上可以有不同的别名。

version: '2'

services:
  web:
    build: ./web
    networks:
      - new

  worker:
    build: ./worker
    networks:
      - legacy

  db:
    image: mysql
    networks:
      new:
        aliases:
          - database
      legacy:
        aliases:
          - mysql

networks:
  new:
  legacy:

在上述例子中,db 服务在 new 网络中可以以主机名 db 和 database 被访问,在 legacy 网络中可以以主机名 db 和 mysql 被访问。

IPV4_ADDRESS, IPV6_ADDRESS

当服务的容器加入网络中的时候,分配一个静态的 IP 地址。
在顶级 networks 相关配置中必须有一个包含了覆盖每个静态 IP 地址的子网配置的 ipam 块。如果使用了 IPv6地址,在顶级 networks 中必须设置 enable_ipv6: true


ports

暴露端口。

短语法

指定主机和容器的端口(<host port>:<container port>)或者直接指定容器的端口(此时主机的端口被随机选择)。

最好总是将端口映射指定为字符串,因为 YAML 会将容器端口号小于60的映射解析为六十进制。

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"

长语法

长语法提供了额外的配置。

  • target:容器内的端口
  • published:公共暴露接口
  • protocol:端口协议(UDP 或 TCP)
  • mode:可以选择 host(在每个结点上发布主机端口)或 ingress(用于 swarm 模式的结点)

volumes

挂载主机路径或命名的卷。
命名的卷应该在顶级 volumes 键中定义。

短语法

可以选择是否指定访问模式,即:<host path>:<container path><host path>:<container path>:<mode>
主机路径若为相对路径,则是相对于正在使用的 Compose 配置文件的相对路径。

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

长语法

长语法提供了额外的配置。

  • type:挂载类型(volume 或 bind)
  • source:挂载源(在主机上用于绑定挂载的路径或者在顶级 volumes 键中定义的 volume 名)
  • target:卷在容器中被挂载的路径
  • read_only:设置卷是否为只读
  • bind:配置另外的绑定选项
  • volume:配置另外的卷选项
    • nocopy:设置当创建卷的时候禁止从一个容器复制数据
volumes:
  - type: volume
    source: mydata
    target: /data
    volume:
      nocopy: true
  - type: bind
    source: ./static
    target: /opt/app/static

服务,Swarm和栈文件中的卷

在没有指定源的卷的情况下,Docker会为每个容器创建一个匿名的卷。当对应的容器被删除的时候,匿名的卷不会被保留。


restart

  • no:即在任何情况下都不会重启一个容器
  • always:容器总是重启
  • on-failure:因为错误退出时重启

2. volumes

driver

指定当前卷使用的驱动。大部分情况默认是 local。如果驱动不可用,Docker Engine 在 docker-compose up创建卷时会返回一个错误。


external

如果为 true,指明这个卷在 Compose 外被创建,docker-compose up将不会尝试去创建它,并且在卷不存在的时候报错。


3. networks

driver

指明哪个驱动用于这个网络。
默认的驱动取决于所配置的 Docker Engine。在大多数情况下,在单一主机上是 bridge,在 Swarm 上是 overlay。


enable_ipv6

配置是否使用 IPv6。


ipam

指定自定义 IPAM 配置。有以下几个可选的属性:

  • driver:自定义 IPAM 驱动,而不是默认驱动
  • config:一系列配置块。
    • subnet
    • gateway

4. configs

顶级 configs 声明定义或引用了服务中的 configs。这个配置的来源可以是 file 或 external。

  • file:配置由指定路径的文件内容创建
  • external:如果设置为 true,说明这个配置已经被创建了。Docker 不会尝试去创建它。
发布了16 篇原创文章 · 获赞 0 · 访问量 856

猜你喜欢

转载自blog.csdn.net/weixin_43864314/article/details/89504432