专业的编程技术博客社区

网站首页 > 博客文章 正文

Docker Compose配置文件.yml学习笔记

baijin 2024-09-05 11:34:46 博客文章 6 ℃ 0 评论

什么是Docker Compose


Compose文件是一个YAML文件,用于定义和运行容器Docker应用程序的工具。通过Compose,您可以配置应用程序需要的所有服务。


Compose使用的三个步骤


使用 Dockerfile 定义应用程序的环境。

使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。

最后,执行 docker-compose up 命令来启动并运行整个应用程序。


Compose的优点:


在单个主机上建立多个隔离环境,Compose使用项目名称将环境彼此隔离。可以在多个不同的上下文中使用此项目名称。默认项目名称是项目目录的基本名称。您可以使用-p命令行选项或 COMPOSE_PROJECT_NAME环境变量设置自定义项目名称。默认项目目录是Compose文件的基本目录。可以使用--project-directory命令行选项自定义项目目录 创建容器时保留卷数据 仅重新创建已更改的容器,当您重新启动未更改的服务时,Compose会使用现有容器。 变量在环境之间组合重复使用


多个配置文件


我们可以为同一个项目配置多个Compose文件,使用多个Compose文件使您能针对不同的环境或不同的工作流程自定义Compose应用程序。


默认情况下,Compose读取两个文件,docker-compose.yml和一个可选的docker-compose.override.yml文件。按照惯例,docker-compose.yml包含基本配置,docker-compose.override.yml就是包含现有服务或全新服务的配置覆盖。


如果两个文件中都定义了服务,Compose会使用override进行合并配置。


要使用多个覆盖文件或具有不同名称的覆盖文件,可以使用该-f选项来指定文件列表。


Compose按照在命令行中指定的顺序合并文件。


当使用多个配置文件时,必须确保文件中的所有路径都相对于基本Compose文件(指定的第一个Compose文件-f)


docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d



Compose配置


version: "3.9"
services:
  webapp:
    build:
      context: ./dir
      dockerfile: Dockerfile-alternate
      args:
        buildno: 1
    command: "echo Helloworld!"
    container_name: myWebApp
    depends_on:
        - nginx
        - mysql
    ports:
        - 8080:8080
    env_file:
        - ./common.env
        - ./apps/web.env
  nginx:
    image: nginx
    healthcheck:
        test:  ["CMD", "curl", "-f", "http://localhost/"]
        interval: 60s
        timeout: 2s
        start_period: 30s
    networks:
        - some-network
        - other-network
  mysql:
    image: mysql
    env_file:
      - ./mysql.env
    environment:
        JAVA_OPTS: -Xms128g -Xmx1024g
        MYSQL_ROOT_PASSWORD: 123

networks:
    some-network:
        driver: overlay
    other-network:
        external: true



一、version


版本信息,定义关乎docker的兼容性,Compose文件格式有3个版本,分别为1,2.x和3.x


二、services


1、build:Dockerfile的路径,用于构建容器并使用,格式String


  • context 上下文路径,可以是文件路径,也可以是到链接到 git 仓库的 url。当是相对路径时,它被解释为相对于 Compose 文件的位置。
  • dockerfile 指定构建镜像的 Dockerfile 文件名
  • args 构建参数,只能在构建过程中访问的环境变量
  • cache_from 缓存解析镜像列表
  • labels 设置构建镜像的元数据
  • network 设置网络容器连接,none 表示在构建期间禁用网络
  • shm_size 设置/dev/shm此构建容器的分区大小
  • target 多阶段构建,可以指定构建哪一层


2、ports:端口映射,格式“宿主机端口:容器内端口”


  • 简短语法,共有三种写法:


  1. 指定两个端口 ( HOST:CONTAINER)
  2. 仅指定容器端口(为主机端口选择了一个临时主机端口)。
  3. 指定要绑定到两个端口的主机 IP 地址(默认为 0.0.0.0,表示所有接口):( IPADDR:HOSTPORT:CONTAINERPORT)。如果 HOSTPORT 为空(例如127.0.0.1::80),则会选择一个临时端口来绑定到主机上。


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"
  - "127.0.0.1::5000"
  - "6060:6060/udp"
  - "12400-12500:1240"



  • 长语法


  1. target: 容器内的端口
  2. published: 公开的端口
  3. protocol:端口协议(tcp或udp)
  4. mode:host用于在每个节点上发布主机端口,或ingress用于负载平衡的群模式端口。


ports:
  - target: 80
    published: 8080
    protocol: tcp
    mode: host



3、command:指定一个容器的启动命令。格式:command: 'cmd'


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



4、container_name:容器名称


5、depends_on:指定当前容器在哪些容器之后启动


6、image:指定的镜像


7、env_file:指定一个文件(文件的内容会成为容器内部的环境变量)


  • 从?件中获取环境变量,可以为单独的?件路径或列表。
  • 如果通过 docker-compose -f FILE ?式来指定 Compose 模板?件,则 env_file 中变量的路径会基于模板?件路径。
  • 如果有变量名称与 environment 指令冲突,则按照惯例,以后者为准


编写mysql.env文件:


# vim mysql.env

# MYSQL_ROOT_PASSWORD=123



8、environment:设置环境变量。可以使用数组或字典两种格式。只给定明层的变量会自动获取运行Compose主机上对应变量的值,可以用来防止泄露不必要的数据


9、healthcheck:通过命令检查容器是否健康运行(健康检查)


test:健康检查的命令。必须是字符串或列表。如果是列表,则第一项必须是NONE,CMD或CMD-SHELL。如果是字符串,则相当于指定CMD-SHELL后跟该字符串。例如: ["CMD", "curl", "-f", "http://localhost/actuator/health"]


interval:健康检查间隔,默认为30秒,单位(h/m/s)


timeout:健康检查命令运行超时时间,如果超过这个时间,本次健康检查被视为失败,单位(h/m/s)


retries:当连续失败指定的次数后,则将容器状态视为unhealthy


disable:如果需要禁用镜像的所有检查项目,可以使用disable:true,相当于test:["NONE"]


start_period:应用启动期间的健康检测不计入统计次数,但仍会发生检测


10、network:配置容器连接的网络


11、sysctls:配置容器内核参数。下面两种写法都可以,并不是必须的,有些服务受容器内操作系统内核参数的限制,可能无法启动,必须通过修改内核参数才能启动


sysctls :
  net.core.somaxconn: 1024
  net.ipv4.tcp_syncookies: 0
 
sysctls :
  - net.core.somaxconn=1024
  - net.ipv4.tcp_syncookies=0



12、ulimits:指定容器的ulimits限制值。


例如,指定最?进程数为 65535,指定?件句柄数为 20000(软限制,应?可以随时修改,不能超过硬限制) 和40000(系统硬限制,只能 root ?户提?)。


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



13、volumes:数据卷缩挂载路径设置,该指令中路径支持相对路径


数据卷所挂载路径设置。可以设置为宿主机路径( HOST:CONTAINER )或者数据卷名称( VOLUME:CONTAINER ),并且可以设置访问模式 ( HOST:CONTAINER:ro )。 如果路径为数据卷名称,必须在文件中配置数据卷


14、deploy: 指定与服务的部署和运行有关的配置。只在 swarm 模式下才会有用。


  • endpoint_mode 访问集群服务的方式。


  1. vip :Docker 集群服务一个对外的虚拟 ip。所有的请求都会通过这个虚拟 ip 到达集群服务内部的机器。
  2. dnsrr :DNS 轮询(DNSRR)。所有的请求会自动轮询获取到集群 ip 列表中的一个 ip 地址。


  • labels 在服务上设置标签。可以用容器上的 labels(跟 deploy 同级的配置) 覆盖 deploy 下的 labels。
  • mode 指定服务提供的模式


  1. global:全局服务,服务将部署至集群的每个节点。
  2. replicated:复制服务,复制指定服务到集群的机器上。


  • placement 指定约束和首选项的位置


version: "3.9"
services:
  db:
    image: postgres
    deploy:
      placement:
        constraints:
          - "node.role==manager"
          - "engine.labels.operatingsystem==ubuntu 18.04"
        preferences:
          - spread: node.labels.zone



15、restart: no是默认的重启策略,在任何情况下都不会重启容器。当always指定时,容器总是重新启动。on-failure如果退出代码指示失败错误,则该策略会重新启动容器。unless-stopped总是重新启动容器,除非容器停止(手动或其他方式)。


restart: "no"
restart: always
restart: on-failure
restart: unless-stopped



16、configs:为每个服务赋予相应的configs访问权限。


  • 简短语法,指定配置名称即可。以下示例授予redis服务访问my_config和my_other_configconfigs 的权限。


version: "3.9"
services:
  redis:
    image: redis:latest
    deploy:
      replicas: 1
    configs:
      - my_config
      - my_other_config
configs:
  my_config:
    file: ./my_config.txt
  my_other_config:
    external: true



  • 长语法 source:配置名称 target:要挂载文件的路径和名称 uid和gid:容器的数字 UID 或 GID mode:挂载在服务的任务容器中的文件的权限,以八进制表示。例如,0444 代表可读。 以下示例在容器内设置configs名称为my_config ,路径为redis_config,将模式设置为0440(组可读)并将用户和组设置为103。该redis服务无权访问my_other_config配置。


version: "3.9"
services:
  redis:
    image: redis:latest
    deploy:
      replicas: 1
    configs:
      - source: my_config
        target: /redis_config
        uid: '103'
        gid: '103'
        mode: 0440
configs:
  my_config:
    file: ./my_config.txt
  my_other_config:
    external: true



一级configs详细配置:


  • file: 使用指定路径中的文件内容创建配置。
  • external: 如果设置为 true,则指定此配置已经创建。Docker 不会尝试创建它,如果它不存在, 会报错config not found。
  • name: Docker 中配置对象的名称。此字段可用于引用包含特殊字符的配置。
  • driver和driver_opts:自定义驱动程序的名称,以及作为键/值对传递的特定于驱动程序的选项。
  • template_driver:要使用的模板驱动程序的名称,它控制是否以及如何将配置负载作为模板。如果未设置驱动程序,则不使用模板。当前支持的唯一驱动程序是golang,它使用golang。


在下面例子中,my_first_config是通过confif_data文件内容创建的(就像 <stack_name>_my_first_config)部署堆栈时一样,并且my_second_config已经创建过。


configs:
  my_first_config:
    file: ./config_data
  my_second_config:
    external: true 



当 Docker 中的配置名称与服务中存在的名称不同时,可以使用name进行配置。


configs:
  my_first_config:
    file: ./config_data
  my_second_config:
    external:
      name: redis_config



二、networks


默认情况下,Compose为您的应用程序设置单个网络。services 服务的每个容器都加入默认网络,并且可以被该网络上的其他容器访问。


应用程序网络的名称基于“项目名称”,也就是其所在目录的名称。您可以使用 --project-name 命令行选项 或 COMPOSE_PROJECT_NAME 环境变量覆盖项目名称。


例如,假设您的应用程序是在一个名为myapp目录下,docker-compose.yml如下:


version: "3.9"
services:
  web:
    build: .
    ports:
      - "8000:8000"
  db:
    image: postgres
    ports:
      - "8001:5432"



运行docker-compose up,会发生以下情况:


  1. 创建了一个名为 myapp_default 的网络。
  2. 把web加入网络。
  3. 把db加入网络。


当容器之间通讯时 , 是通过 CONTAINER_PORT 来连接的。


我们可以通过设置一级配置network自定义网络,创建更复杂的网络选项,也可以用来连接已经存在的网络(不是通过compose创建的)


每个service 配置下也可以指定networks配置,来指定一级配置的网络。


version: "3"
services:
  proxy:
    build: ./proxy
    networks:
      - frontend
  app:
    build: ./app
    networks:
      - frontend
      - backend
  db:
    image: postgres
    networks:
      - backend

networks:
  frontend:
    driver: custom-driver-1
  backend:
    # Use a custom driver which takes special options
    driver: custom-driver-2
    driver_opts:
      foo: "1"
      bar: "2"



一级配置networks 创建了自定义的网络 。这里配置了两个frontend和backend ,且自定义了网络类型。


每一个services下,proxy , app , db都定义了networks配置。


  1. proxy 只加入到 frontend网络。
  2. db 只加入到backend网络。
  3. app同时加入到 frontend和backend 。
  4. db和proxy不能通讯,因为不在一个网络中。
  5. app和两个都能通讯,因为app在两个网络中都有配置。
  6. db和proxy要通讯,只能通过app这个应用来连接。


同一网络上的其他容器可以使用服务名称或别名来连接到其他服务的容器


services:
  some-service:
    networks:
      some-network:
        aliases:
          - alias1
          - alias3
      other-network:
        aliases:
          - alias2



加入网络时,还可以指定容器的静态 IP 地址。


version: "3.9"

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"



一级networks还有如下这些配置:


driver: 指定该网络应使用哪个驱动程序。


默认使用bridge单个主机上的网络


overlay代表跨多个节点的网络群。


host or none 使用主机的网络堆栈,或者不使用网络。相当于docker run --net=host或docker run --net=none。仅在使用docker stack命令时使用。如果您使用该docker-compose命令,请改用 network_mode。


driver_opts 将选项列表指定为键值对以传递给此网络的驱动程序


driver_opts:
  foo: "bar"
  baz: 1



attachable 仅在driver设置为 overlay时可用。如果设置为true,那么除了服务之外,独立容器也可以连接到此网络。


networks:
  mynet1:
    driver: overlay
    attachable: true



  • enable_ipv6 在此网络上启用 IPv6 网络。
  • ipam 自定义 IPAM (IP地址管理)配置。


ipam:
  driver: default
  config:
    - subnet: 172.28.0.0/16



  • internal 默认情况下,Docker 会将桥接网络连接到它提供外部连接。如果要创建外部隔离的覆盖网络,可以将此选项设置为true。
  • labels 添加元数据
  • external如果设置为true,则指定此网络是在 Compose 之外创建的。docker-compose up不会尝试创建它,如果它不存在,则会引发错误。在下面的例子中,proxy是通往外界的门户。


version: "3.9"

services:
  proxy:
    build: ./proxy
    networks:
      - outside
      - default
  app:
    build: ./app
    networks:
      - default

networks:
  outside:
    external: true



name为此网络设置自定义名称


version: "3.9"
networks:
  network1:
    name: my-app-net






?

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表