• 附005.Docker Compose文件详解


    一 Docker Compose文件简介

    compose文件使用yml格式,主要分为了四个区域:
    • version:用于指定当前docker-compose.yml语法遵循哪个版本
    • services:服务,在它下面可以定义应用需要的一些服务,每个服务都有自己的名字、使用的镜像、挂载的数据卷、所属的网络、依赖哪些其他服务等等。
    • networks:应用的网络,在它下面可以定义应用的名字、使用的网络类型等。
    • volumes:数据卷,在它下面可以定义数据卷,然后挂载到不同的服务下去使用。

    二 Docker Compose文件详解

    2.1 version字段

    用于指定当前compose文件语法遵循哪个版本,Compose文件版本支持特定的Docker版本列表如下:
    Compose文件格式
    Docker Engine版本
    3.7
    18.06.0+
    3.6
    18.02.0+
    3.5
    17.12.0+
    3.4
    17.09.0+
    3.3
    17.06.0+
    3.2
    17.04.0+
    3.1
    1.13.1+
    3.0
    1.13.0+
    2.4
    17.12.0+
    2.3
    17.06.0+
    2.2
    1.13.0+
    2.1
    1.12.0+
    2.0
    1.10.0+
    1.0
    1.9.1.+
    示例:version: "3"

    2.2 services区域

    所有服务的定义都是定义在services区域中,services常用的配置项如下:
    image:指定要启动容器的映像。可以是一个repository/tag或镜像ID来表明。
    示例:
    image: redis image: ubuntu:14.04 image: tutum/influxdb image: example-registry.com:4000/postgresql image: a4bc65fd
    提示:image可以是本地也可以是远程的,如果本地不存在,compose会尝试pull下来,肉使用了build手动构建镜像,则使用指定的选项构建它,并使用指定的标签标记它。
     
    build:该参数指定Dockerfile文件的路径,compose会通过Dockerfile构建并生成镜像,然后使用该镜像
    示例:
      1 version: '3'
      2 services:
      3   webapp:
      4     build: ./dir
      5     image: webapp:tag
     
    提示:如果在构建镜像的时候你指定相关名字和tag,则生成指定的镜像和tag。
     
    command:重写默认的命令,即指定启动容器的命令。
    示例:
    command: bundle exec thin -p 3000 或
    command: ["bundle", "exec", "thin", "-p", "3000"]
     
    links:链接到其他服务中的容器,可以指定服务名称和这个链接的别名,或者只指定服务名称。
    示例:
      1 web:
      2   links:
      3    - db
      4    - db:database
      5    - redis
    此时,在容器内部,会在/etc/hosts文件中用别名创建几个条目,如下:
      1 172.17.2.100 db
      2 172.17.2.100 database
      3 172.17.2.100 redis
     
    external_links:链接到compose外部启动的容器,特别是对于提供共享和公共服务的容器。在指定容器名称和别名时,external_links遵循着和links相同的语义用法。
    示例:
      1 external_links:
      2  - redis_1
      3  - project_db_1:mysql
      4  - project_db_1:postgresql
     
    ports:暴露端口,指定宿主机到容器的端口映射,或者只指定容器的端口,则表示映射到主机上的随机端口。
    提示:注意:以HOST:CONTAINER格式映射端口时,使用低于60的容器端口时可能会遇到错误的结果,因为YAML会将格式xx:yy中的数字解析为base-60值。因此,我们建议始终将端口映射明确指定为字符串。
    示例:
      1 ports:
      2  - "3000"
      3  - "3000-3005"
      4  - "8000:8000"
      5  - "9090-9091:8080-8081"
      6  - "49100:22"
      7  - "127.0.0.1:8001:8001"
      8  - "127.0.0.1:5000-5010:5000-5010"
      9  - "6060:6060/udp"
    示例2:
      1 ports:
      2   - target: 80
      3     published: 8080
      4     protocol: tcp
      5     mode: host
    解释:长格式语法允许配置无法以简短形式表示的其他字段。
    • target:容器内的端口
    • published:公开暴露的港口
    • protocol:端口协议(tcp或udp)
    • mode:host用于在每个节点上发布主机端口,或者ingress用于负载平衡的群集模式端口。
     
    expose:暴露端口,但不需要建立与宿主机的映射,只是会向链接的服务提供,只能指定内部端口。
    示例:
      1 expose:
      2  - "3000"
      3  - "8000"
     
    environment:加入环境变量,可以使用数组或者字典,只有一个key的环境变量可以在运行compose的机器上找到对应的值。
    提示:任何布尔值; true,false,yes no,需要用引号括起来,以确保YML解析器不会将它们转换为True或False。
    示例:
      1 environment:
      2   RACK_ENV: development
      3   SHOW: 'true'
      4   SESSION_SECRET:
      5 environment:
      6   - RACK_ENV=development
      7   - SHOW=true
      8   - SESSION_SECRET
     
    env_file:从一个文件中引入环境变量,该文件可以是一个单独的值或者一个列表,如果同时定义了environment,则environment中的环境变量会重写这些值。
    示例:
      1 env_file: .env
      2 
      3 env_file:
      4   - ./common.env
      5   - ./apps/web.env
      6   - /opt/secrets.env
    提示:列表中文件的顺序对于确定分配给多次显示的变量的值非常重要。列表中的文件从上到下进行处理。对于在文件中指定的相同变量a.env并在文件中 分配不同的值b.env,如果b.env列在下面(后),则来自b.envstand 的值。
    如:给出以下声明docker_compose.yml:
      1 services:
      2   some-service:
      3     env_file:
      4       - a.env
      5       - b.env
    以下文件:
    # a.env VAR=1
    # b.env VAR=hello
    则$VAR是hello。
     
    depends_on:指定与部署和运行服务相关的配置。
    示例:
      1 version: '3'
      2 services:
      3   web:
      4     build: .
      5     depends_on:
      6       - db
      7       - redis
      8   redis:
      9     image: redis
     10   db:
     11     image: postgres
    服务依赖关系之间的Express依赖关系会导致以下行为:
    • docker-compose up:以依赖顺序启动服务,在以上示例中,db和redis之在web之前启动。
    • docker-compose up SERVICE:自动包含SERVICE依赖项。在以上示例中,docker-compose up web还创建并启动db和redis。
     
    deploy:指定与部署和运行服务相关的配置。
    示例:
      1 version: '3'
      2 services:
      3   redis:
      4     image: redis:alpine
      5     deploy:
      6       labels:
      7  com.example.description: "This label will appear on all containers for the web service"
      8       resources:
      9         limits:
     10           cpus: '0.50'
     11           memory: 50M
     12         reservations:
     13           cpus: '0.25'
     14           memory: 20M
     15       replicas: 6
     16       update_config:
     17         parallelism: 2
     18         delay: 10s
     19       update_config:
     20         parallelism: 2
     21         delay: 10s
     22         order: stop-first
     23       restart_policy:
     24         condition: on-failure
     25         delay: 5s
     26         max_attempts: 3
     27         window: 120s
     
    子选项说明:
    labels:指定服务的标签。这些标签仅在服务上设置,而不是在服务的任何容器上设置。
    mode:global:每个集群节点只有一个容器,默认为replicated。
    resources:资源限制,如上所示:redis服务被限制为使用不超过50M的内存和0.50(50%)的CPU时间,并且保留20M了内存和0.25CPU时间(始终可用)。
    replicas:指定replicated后,或默认情况下课使用replicas指定副本数,
    restart_policy:配置是否以及如何在容器退出时重新启动容器,包括:
    • condition:其中之一none,on-failure或any(默认:) any。
    • delay:重新启动尝试之间等待的时间,指定为持续时间(默认值:0)。
    • max_attempts:在放弃之前尝试重新启动容器的次数(默认值:永不放弃)。如果在配置中未成功重新启动 window,则此尝试不会计入配置的max_attempts值。例如,如果max_attempts设置为“2”,并且第一次尝试时重新启动失败,则可能会尝试重新启动两次以上。
    • window:在决定重启是否成功之前等待多长时间,指定为持续时间(默认值:立即决定)。
    rollback_config:配置在更新失败的情况下应如何回滚服务。
    • parallelism:一次回滚的容器数。如果设置为0,则所有容器同时回滚。
    • delay:每个容器组的回滚之间等待的时间(默认为0)。
    • failure_action:如果回滚失败该怎么办。一个continue或pause(默认pause)
    • monitor:每次更新任务后的持续时间以监视失败(ns|us|ms|s|m|h)(默认为0)。
    • max_failure_ratio:回滚期间容忍的失败率(默认值为0)。
    • order:回滚期间的操作顺序。其中之一stop-first(旧任务在启动新任务之前停止),或者start-first(首先启动新任务,并且正在运行的任务暂时重叠)(默认stop-first)。
    update_config:配置服务应如何更新,用于配置滚动更新。
    • parallelism:一次更新的容器数。
    • delay:更新一组容器之间的等待时间。
    • failure_action:更新失败时的行为。其中一个continue,rollback或者pause (默认:pause)。
    • monitor:每次更新任务后的持续时间以监视失败(ns|us|ms|s|m|h)(默认为0)。
    • max_failure_ratio:更新期间容忍的故障率。
    • order:更新期间的操作顺序。其中一个stop-first(旧任务在启动新任务之前停止),或者start-first(首先启动新任务,并且正在运行的任务暂时重叠)(默认stop-first)注意:仅支持v3.4及更高版本。
    注意:order仅支持v3.4及更高版本的撰写文件格式。
     
    healthcheck:配置运行的检查以确定此服务的容器是否“健康”。
    示例:
      1 healthcheck:
      2   test: ["CMD", "curl", "-f", "http://localhost"]
      3   interval: 1m30s
      4   timeout: 10s
      5   retries: 3
      6   start_period: 40s
    提示:healthcheck可参考:https://docs.docker.com/engine/reference/builder/#healthcheck
     
    network_mode:网络类型,可指定容器运行的网络类型
    示例:
      1 network_mode: "bridge"
      2 network_mode: "host"
      3 network_mode: "none"
      4 network_mode: "service:[service name]"
      5 network_mode: "container:[container name/id]"
     
    dns:自定义dns服务
      1 dns: 8.8.8.8
      2 dns:
      3   - 8.8.8.8
      4   - 9.9.9.9

    2.3 networks区域

    网络决定了服务之间以及服务和外界之间如何去通信,在执行docker-compose up的时候,docker会默认创建一个默认网络,创建的服务也会默认的使用这个默认网络。服务和服务之间,可以使用服务的名字进行通信,也可以自己创建网络,并将服务加入到这个网络之中,这样服务之间可以相互通信,而外界不能够与这个网络中的服务通信,可以保持隔离性。
    提示:注意:您的应用程序网络的名称基于“项目名称”,该名称基于其所在目录的名称。您可以使用--project-name参数或COMPOSE_PROJECT_NAME环境变量覆盖项目名称,如当前的目录为myapp,期docker-compose.yml如下:
      1 version: "3"
      2 services:
      3   web:
      4     build: .
      5     ports:
      6       - "8000:8000"
      7   db:
      8     image: postgres
      9     ports:
     10       - "8001:5432"
    运行时docker-compose up,则:
    1. 创建了一个名为myapp_default的网络。
    2. 使用web配置创建容器,在web下加入myapp_default网络。
    3. 使用db配置创建容器,在db下加入myapp_default网络。
    示例:
      1 version: '2'
      2 
      3 services:
      4   app:
      5     image: busybox
      6     command: ifconfig
      7     networks:
      8       app_net:
      9         ipv4_address: 172.16.238.10
     10 
     11 networks:
     12   app_net:
     13     driver: bridge
     14     enable_ipv6: true
     15     ipam:
     16       driver: default
     17       config:
     18       - subnet: 172.16.238.0/24
     19         gateway: 172.168.238.254

    2.4 volumes区域

    可以在Compose file文件上声明卷,同时也可以在本区域创建volumes_from,以便在多个服务中重用卷。
    示例:
      1 version: "3"
      2 services:
      3   db:
      4     image: db
      5     volumes:
      6       - data-volume:/var/lib/db
      7   backup:
      8     image: backup-service
      9     volumes:
     10       - data-volume:/var/lib/backup/data
     11 volumes:
     12   data-volume:
    提示:volumes可参考:https://docs.docker.com/compose/compose-file/#specifying-byte-values
  • 相关阅读:
    开源牛人 zcbenz
    分享一个快速的Json(反)序列化开源项目 Jil
    影响当今世界发展的重要技术难题
    余额表的处理方法
    使用TypeScript开发程序
    docker 和 nginx 配合的一个坑
    Excel 的一些使用记录
    mysql 用户授权相关
    容器数量增加导致 fs.inotify.max_user_instances 超过限制
    在 EF Core 中如何输出 linq 转换后的 sql 语句
  • 原文地址:https://www.cnblogs.com/itzgr/p/10041249.html
Copyright © 2020-2023  润新知