当前位置 博文首页 > RtxTitanV的博客:Docker Compose配置文件详解(V3)

    RtxTitanV的博客:Docker Compose配置文件详解(V3)

    作者:[db:作者] 时间:2021-07-07 10:14

    Docker Compose配置文件是Docker Compose的核心,用于定义服务、网络和数据卷。格式为YAML,默认路径为./docker-compose.yml,可以使用.yml.yaml扩展名,目前Compose配置文件格式的最新版本为V3。Compose配置文件中涉及的配置项也比较多,但大部分配置项的含义跟docker run命令相关选项是类似的。

    本文主要参考官方文档对目前最新的V3版Compose配置文件进行一个总结。都是一些概念性的内容,不涉及具体操作。

    一、Compose配置文件版本

    这里主要对Compose配置文件的版本的相关要点进行一个简单的总结。至于每个版本具体的变化和升级信息可以参考官方的Compose配置文件版本与升级指南。

    1.Compose配置文件格式的版本概述

    当前有三种版本的Compose配置文件格式:

    • Version 1:
      • 旧版格式,通过省略YAML的根配置项version来指定。
      • 未声明版本的Compose配置文件都被视为V1版,所有的服务都作为根选项在Compose配置文件中声明。
      • 支持V1的Compose最高到1.6.x,再高版本的Compose不推荐使用V1版Compose配置文件。
      • 不支持数据卷、网络和构建参数配置。
      • V1的Compose不会利用网络优势,每个容器都位于默认的bridge网络上,并且可以从其他容器的IP地址访问,需要使用links来启用容器之间的发现。
    • Version 2.x:
      • 通过YAML的根配置项version来指定,具体配置如version: '2'version: '2.1'等。
      • 必须在Compose配置文件根选项指定版本号,并且主版本数字为2,且所有服务必须在services配置项下声明。
      • 1.6.0+版本的Compose都支持V2,Docker Engine的版本需要1.10.0+版本。
      • 支持数据卷和网络的配置。
      • 默认情况下,每个容器都加入了应用范围的默认网络,并且可以在与服务名称相同的主机名下发现。很大程度上links不是必要的。
      • V2中加入了环境变量替换。
    • Version 3.x:
      • 最新版本,也是推荐使用版本,推出该版的目的是为了在Compose和Docker Engine的swarm模式之间形成交叉兼容。
      • 通过YAML的根配置项version来指定,具体配置如version: '3'version: '3.1'等。
      • V3删除了多个配置项,但也新增了更多配置项。

    关于Compose配置文件版本的常见注意事项:

    • 在声明V2和V3版本时需注意:
      • 在指定Compose配置文件要使用的版本时,需同时指定主版本数字和次版本数字。如果未给定次版本数字,则默认使用0而不是最新版本,因此将不支持再更高版本中才加入的新功能。比如version: '3',使用的是3.0版本而不是目前最新的3.8版本。
    • 在使用多Compose配置文件时需注意:
      • 使用多个Compose配置文件扩展服务时,每个文件必须为相同的版本。

    2.Compose配置文件格式版本与Docker的兼容性关系

    Compose配置文件格式具有多种版本。其中Compose配置文件格式版本与Docker的兼容性关系如下表所示:

    Compose配置文件格式版本Docker Engine版本
    3.819.03.0+
    3.718.06.0+
    3.618.02.0+
    3.517.12.0+
    3.417.09.0+
    3.317.06.0+
    3.217.04.0+
    3.11.13.1+
    3.01.13.0+
    2.417.12.0+
    2.317.06.0+
    2.21.13.0+
    2.11.12.0+
    2.01.10.0+
    1.01.9.1.+

    如果使用的较旧版本的Docker,可以参考官方的Compose版本发布列表。其中的每组发行说明都详细说明了支持的Docker Engine版本和兼容的Compose配置文件格式版本。

    3.兼容模式

    在1.20.0版本,Compose在docker-compose命令中引入了一个新的选项--compatibility,目的在于帮助开发人员更轻松地过渡到V3版。启用该选项后,docker-compose命令会读取每个服务定义的deploy部分,并尝试将其转换为等效的V2配置项。目前,以下deploy下的配置项已被转换:

    • resources下的limitsreservations下的memory
    • replicas
    • restart_policy下的 conditionmax_attempts

    所有的其他配置项都将被忽略,如果这些被忽略的配置项存在则会发出一个警告。可以使用带--compatibilityConfig命令查看将用于deploy的配置。

    注意请勿在生成环境使用兼容模式!
    建议不要在生产环境中使用--compatibility选项。由于使用非Swarm模式属性生成的配置仅是近似值,因此可能会产生意外的结果。

    二、Compose配置文件结构

    Docker Compose配置文件是一个用于定义服务、网络和数据卷的YAML文件。其中服务定义了该服务启动的每个容器的配置,就像将命令行参数传递给docker run一样,网络和数据卷的定义类似于docker network createdocker volume create。跟docker run一样,如果在Dockerfile中通过诸如CMDEXPOSEVOLUMEENV这些指令指定了相关选项,那么在默认情况下,不需要在docker-compose.yml中再次指定它们。下面是从官网引过来的一个Compose配置文件的示例,可以先大致了解一下它的结构:

    version: "3.8"
    services:
    
      redis:
        image: redis:alpine
        ports:
          - "6379"
        networks:
          - frontend
        deploy:
          replicas: 2
          update_config:
            parallelism: 2
            delay: 10s
          restart_policy:
            condition: on-failure
    
      db:
        image: postgres:9.4
        volumes:
          - db-data:/var/lib/postgresql/data
        networks:
          - backend
        deploy:
          placement:
            constraints:
              - "node.role==manager"
    
      vote:
        image: dockersamples/examplevotingapp_vote:before
        ports:
          - "5000:80"
        networks:
          - frontend
        depends_on:
          - redis
        deploy:
          replicas: 2
          update_config:
            parallelism: 2
          restart_policy:
            condition: on-failure
    
      result:
        image: dockersamples/examplevotingapp_result:before
        ports:
          - "5001:80"
        networks:
          - backend
        depends_on:
          - db
        deploy:
          replicas: 1
          update_config:
            parallelism: 2
            delay: 10s
          restart_policy:
            condition: on-failure
    
      worker:
        image: dockersamples/examplevotingapp_worker
        networks:
          - frontend
          - backend
        deploy:
          mode: replicated
          replicas: 1
          labels: [APP=VOTING]
          restart_policy:
            condition: on-failure
            delay: 10s
            max_attempts: 3
            window: 120s
          placement:
            constraints:
              - "node.role==manager"
    
      visualizer:
        image: dockersamples/visualizer:stable
        ports:
          - "8080:8080"
        stop_grace_period: 1m30s
        volumes:
          - "/var/run/docker.sock:/var/run/docker.sock"
        deploy:
          placement:
            constraints:
              - "node.role==manager"
    
    networks:
      frontend:
      backend:
    
    volumes:
      db-data:
    

    顶层的versionservicesnetworksvolumes将Compose配置文件分为四个部分,其中version指定Compose配置文件的版本,services定义服务,networks定义网络,volumes定义数据卷。

    三、服务配置

    服务定义了该服务启动的每个容器的配置,就像将命令行参数传递给docker run一样。比如以下配置:

    services:
      redis:
        image: redis:alpine
    

    services下的redis是用户自定义的服务名称,redis下的image只是众多服务配置项中的其中一个,意思是指定镜像名称或id。下面就对服务的相关配置项进行一个总结。

    1.build

    在构建时应用的配置项。一般直接指定Dockerfile所在文件夹路径,可以是绝对路径,或者相对于Compose配置文件的路径。可以指定为包含构建上下文(context)路径的字符串。例如:

    version: "3.8"
    services:
      webapp:
        build: ./dir
    

    也可以使用context指定上下文路径,使用dockerfile基于上下文路径指定Dockerfile文件,使用args指定构建参数。例如:

    version: "3.8"
    services:
      webapp:
        build:
          context: ./dir
          dockerfile: Dockerfile-alternate
          args:
            buildno: 1
    

    如果同时指定了buildimage。例如:

    build: ./dir
    image: webapp:tag
    

    Compose会在./dir目录下构建一个名为webapp,标签为tag的镜像。

    使用docker stack deploy时的注意事项:在swarm mode下部署堆栈时,build配置项被忽略。因为docker stack命令不会在部署之前构建镜像。

    (1)context

    指定包含Dockerfile的目录路径或git仓库url。该目录是发送给Docker守护进程(Daemon)的构建上下文(context)。当配置的值是相对路径时,它将被解释为相对于Compose配置文件的路径。例如:

    build:
      context: ./dir
    

    指定上下文为Compose配置文件目录下的dir目录。

    (2)dockerfile

    指定Dockerfile文件。Compose会使用指定的Dockerfile文件构建镜像,但必须要指定构建上下文路径。例如:

    build:
      context: .
      dockerfile: Dockerfile-alternate
    

    Compose会使用Compose配置文件所在目录下名为Dockerfile-alternate的Dockerfile文件构建镜像。

    (3)args

    添加构建参数,这些只能在构建过程中访问的环境变量。首先在Dockerfile文件中指定参数:

    ARG buildno
    ARG gitcommithash
    
    RUN echo "Build number: $buildno"
    RUN echo "Based on commit: $gitcommithash"
    

    然后build中指定参数,以下两种写法都可以:

    build:
      context: .
      args:
        buildno: 1
        gitcommithash: cdc3b19
    
    build:
      context: .
      args:
        - buildno=1
        - gitcommithash=cdc3b19
    

    这时构建过程中使用的参数的值为args指定的值。在指定构建参数时也可以不指定值,在这种情况下,构建过程中使用的参数的值为运行Compose的环境中的值。例如:

    args:
      - buildno
      - gitcommithash
    

    使用布尔值时的注意事项:YMAL中布尔类型的值("true""false""yes""no""on""off")必须用引号引起来,以便解析器将它们解释为字符串。

    (4)cache_from

    在3.2版的配置文件格式中加入

    指定缓存解析镜像列表。例如:

    build:
      context: .
      cache_from:
        - alpine:latest
        - corp/web_app:3.14
    

    (5)labels

    在3.3版的配置文件格式中加入

    将元数据以标签的形式添加到生成的镜像中。可以使用数组或字典两种格式。推荐使用反向DNS写法以避免和其他应用的标签冲突。例如:

    build:
      context: .
      labels:
        com.example.description: "Accounting webapp"
        com.example.department: "Finance"
        com.example.label-with-empty-value: ""
    
    build:
      context: .
      labels:
        - "com.example.description=Accounting webapp"
        - "com.example.department=Finance"
        - "com.example.label-with-empty-value"
    

    (6)network

    在3.4版的配置文件格式中加入

    设置容器网络连接以获取构建过程中的RUN指令。例如:

    build:
      context: .
      network: custom_network_1
    

    设置为none可以在构建期间禁用网络连接。例如:

    build:
      context: .
      network: none
    

    (7)shm_size

    在3.5版的配置文件格式中加入

    指定容器的/dev/shm分区大小。指定的值为表示字节数的整数值或表示字节值的字符串。例如:

    build:
      context: .
      shm_size: 10000000
    
    build:
      context: .
      shm_size: '2gb'
    

    (8)target

    在3.4版的配置文件格式中加入

    指定在Dockerfile中定义的构建阶段,即镜像只构建到指定阶段就停止构建。例如:

    build:
      context: .
      target: prod
    

    指定构建阶段为prod,即镜像只构建到prod阶段,prod阶段之后的内容不会被构建。

    2.cap_add、cap_drop

    添加或删除容器内核能力(capability)。完整的capability列表可查看man 7 capabilities。例如,让容器拥有所有内核能力:

    cap_add:
      - ALL
    

    例如,删除NET_ADMINSYS_ADMIN能力:

    cap_drop:
      - NET_ADMIN
      - SYS_ADMIN
    

    使用docker stack deploy时的注意事项:在swarm mode下部署堆栈时,cap_addcap_drop配置项将被忽略。

    3.cgroup_parent

    为容器指定一个可选的父控制组。例如:

    cgroup_parent: m-executor-abcd
    

    使用docker stack deploy时的注意事项:在swarm mode下部署堆栈时,cgroup_parent配置项将被忽略。

    4.command

    覆盖容器启动后默认执行的命令。可以写成字符串形式。例如:

    command: bundle exec thin -p 3000
    

    也可以写成JSON数组形式。例如:

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

    5.configs

    在3.3版的配置文件格式中加入

    为每个服务授予对配置(configs)的访问权限。支持short和long两种格式的语法。更多configs信息,参考configs。

    注意:该配置(config)必须已存在或者在堆栈文件顶层configs配置项中定义,否则堆栈部署将失败。

    short语法仅指定config名称来授予容器访问config的权限并将其挂载到容器的/<config_name>上。source名称和目标挂载点都设置为config名称。例如以下示例,授予了redis服务对configs的my_configmy_other_config的访问权限,其中my_config的值设置到文件./my_config.txt的内容中,my_other_config定义为外部资源,这意味着它已经在Docker中通过运行docker config create命令或其他堆栈部署进行定义,如果外部config不存在,堆栈部署将会失败并显示config not found错误:

    version: "3.8"
    services:
      redis:
        image: redis:latest
        deploy:
          replicas: 1
        configs:
          - my_config
          - my_other_config
    configs:
    
    下一篇:没有了