Benjamin

静以修身,俭以养德,非澹薄无以明志,非宁静无以致远。
随笔 - 398, 文章 - 0, 评论 - 196, 引用 - 0
数据加载中……

docker之Compose.yml配置说明

1、build:指定dockerfile的上下文路径,或详细配置的对象。示例如下:
     version: "3.9"
     services:
       webapp:
         build:
            context: ./dir
            dockerfile: Dockerfile-alternate
            args:
              buildno: 1
    context 上下文路径,可以是文件路径,也可以是到链接到 git 仓库的 url。当是相对路径时,它被解释为相对于 Compose 文件的位置。
    dockerfile 指定构建镜像的 Dockerfile 文件名
    args 构建参数,在构建过程中访问的环境变量
    cache_from 缓存解析镜像列表
    labels 设置构建镜像的元数据
    network 设置网络容器连接,none 表示在构建期间禁用网络
    shm_size 设置/dev/shm此构建容器的分区大小
    target 多阶段构建,可以指定构建哪一层
2、network:自定义网络。一般的Compose为您的应用程序设置单个网络。services 服务的每个容器都加入默认网络,并且可以被该网络上的其他容器访问。
              应用程序网络的名称基于“项目名称”,也就是其所在目录的名称。可以使用 --project-name 命令行选项 或 COMPOSE_PROJECT_NAME 环境变量覆盖项目名称。
    例如:version: "3.9"
    services:
      web:
        build: .   #当前目录
        ports:
         - "8000:8000"
      db:
        image: postgres
        ports:
          - "8001:5432" #8001宿主机端口 5432(postgres默认端口)即是容器端口
                               执行docker-compose up即创建项目名称(项目路径)_default网络并将web和db加入网络
     每个Sevices配置下也可以指定network配置,来指定一级配置的网络。如下所示:
     version: "3"
     services:
       proxy:
         build: ./proxy
       networks:
         - frontend
     app:
       build: ./app
      networks:
        - frontend
        - backend
    db:
      image: postgres
    networks:
      - backend
  networks:
    frontend:
    # Use a custom driver
    driver: custom-driver-1
  backend:
    # Use a custom driver which takes special options
    driver: custom-driver-2
    driver_opts:
      foo: "1"
      bar: "2"
  这里配置了两个frontend和backend ,且自定义了网络类型。
  每一个services下,proxy , app , db都定义了networks配置。
   proxy 只加入到 frontend网络。
   db 只加入到backend网络。
   app同时加入到 frontend和backend 。
   db和proxy不能通讯,因为不在一个网络中。
   app和两个都能通讯,因为app在两个网络中都有配置。
   db和proxy要通讯,只能通过app这个应用来连接。

   同一网络上的其他容器可以使用服务名称或别名来连接到其他服务的容器。例如
   services:
     s ome-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
 
    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
 3、cap_add, cap_drop添加或删除容器功能。例如
     cap_add:
         - ALL
    cap_drop:
       - NET_ADMIN
       - SYS_ADMIN
 4、cgroup_parent为容器指定一个可选的父 cgroup。
 5、command:覆盖容器启动后默认执行的命令
 6、configs:赋予服务相应的configs访问权限
                  一般指定配置名称即可,以下示例授予redis服务访问my_config和my_other_configconfigs 的权限。
     以下示例授予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
       详细用法示例:
       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
   当 Docker 中的配置名称与服务中存在的名称不同时,可以使用name进行配置
   configs:
      my_first_config:
          file: ./config_data
       my_second_config:
          external:
               name: redis_config
    7、container_name:自定义容器名称,必须是唯一
    8、credential_spec:仅Windows 容器的服务有用。为托管服务帐户配置凭据规范。
          配置列表格式为file://<filename>或registry://<value-name>
    9、depends_on:表示服务之间的依赖关系
          docker-compose up按依赖顺序启动服务。在下面的例子中,db和redis在 web之前启动。
         docker-compose up SERVICE自动包含SERVICE的依赖项。在下面的示例中,docker-compose up web还创建并启动db和redis。
         docker-compose stop按依赖顺序停止服务。在以下示例中,web在db和redis之前停止。示例如下:
      version: "3.9"
      services:
        web:
          build: .
        depends_on:
           - db
           - redis
        redis:
          image: redis
        db:
          image: postgres
 10、deploy:部署和运行有关的配置,只在 swarm(集群管理工具)模式下才会有用。
       endpoint_modeL:访问集群服务的方式.
       vip是Docker 集群服务一个对外的虚拟 ip,求都会通过这个虚拟 ip 到达集群服务内部的机器。
       dnsrr :dns轮询。所有的请求会自动轮询获取到集群 ip 列表中的一个 ip 地址。
      labels 在服务上设置标签  容器上的 labels(跟 deploy 同级的配置) 覆盖 deploy 下的 labels。 
      mode 指定服务提供的模式
      global:全局服务,服务将部署至集群的每个节点
      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
     可以通过定义约束表达式来限制可以安排任务的节点集。约束表达式可以使用匹配(==) 或排除(!=) 规则。多个约束查找可以使用 AND 匹配。
     约束可以匹配节点或 Docker 引擎标签,如下所示:
        节点属性                           匹配                                    例子
        node.id                          节点ID                          node.id==2ivku8v2gvtg4
        node.hostname                 节点主机名                          node.hostname!=node-2
        node.role                  节点角色 ( manager/ worker)  node.role==manager
        node.platform.os       节点操作系统                          node.platform.os==windows
        node.platform.arch       节点架构                          node.platform.arch==x86_64
        node.labels             用户定义的节点标签                  node.labels.security==high
        engine.labels          Docker 引擎的标签                  engine.labels.operatingsystem==ubuntu-14.04
   max_replicas_per_node 如果服务是replicated(默认值),则限制任何时间在节点上运行的副本数
   replicas 如果服务是replicated(默认值),指定在任何给定时间应运行的容器数量。
   resources 配置资源约束。在下面示例中,redis服务被限制为使用不超过 50M 的内存和0.50(单核的 50%)可用处理时间 (CPU),并保留20M内存和0.25CPU 时间(始终可用)。
   version: "3.9"
   services:
        redis:
          image: redis:alpine
          deploy:
             resources:
                limits:
                   cpus: '0.50'
                   memory: 50M
                 reservations:
                      cpus: '0.25'
                      memory: 20M
       restart_policy 配置是否以及如何在退出时重新启动容器。替换restart
       condition: none, on-failure 或 any (默认: any) 之一
       delay:重新启动尝试之间等待的时间(默认值:5s)。
       max_attempts:在放弃之前尝试重新启动容器的次数(默认值:永不放弃),。如果在配置的窗口(window)内重新启动未成功,则此尝试不计入配置max_attempts值
       window:决定重启是否成功之前等待多长时间(默认值:立即重启)。
       rollback_config 在更新失败的情况下应如何回滚服务
        parallelism:一次回滚的容器数量。如果设置为 0,则所有容器同时回滚。
        delay:每个容器组回滚之间等待的时间(默认为 0 秒)。
        failure_action: 如果回滚失败怎么办。continue或者pause(默认pause)
        monitor:每次任务更新后监控失败的持续时间(ns|us|ms|s|m|h)(默认 5s)注意:设置为 0 将使用默认 5s。
        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)(默认 5s)注意:设置为 0 将使用默认 5s。
        max_failure_ratio:更新期间可容忍的故障率。
        order:更新期间的操作顺序。stop-first(旧任务在开始新任务之前停止),或start-first(新任务首先启动,并且正在运行的任务短暂重叠)(默认stop-first)
  11、devices。设备映射列表。使用与--devicedocker 客户端创建选项格式相同
        devices:
              - "/dev/ttyUSB0:/dev/ttyUSB0"
  12、dns:自定义 DNS 服务器。可以是单个值或列表
  13、dns_earch:自定义 DNS 搜索域。可以是单个值或列表
  14、entrypoint:用于运行程序
        entrypoint: /code/entrypoint.sh
         entrypoint: ["php", "-d", "memory_limit=-1", "vendor/bin/phpunit"]
  15、env_file:从文件添加环境变量。可以是单个值或列表。
      Compose 文件docker-compose -f FILE,则其中的路径 env_file相对于该文件所在的目录。
      environment 声明的环境变量会覆盖这些值——即使这些值是空的或未定义的。
  16、environment:添加环境变量。您可以使用数组或字典。任何布尔值(true、false、yes、no)都需要用引号括起来。
       environment和Dockerfile 中的ENV指令一样把变量保存在容器、镜像中。
  17、expose:暴露端口。实际上docker-compose.yml的端口映射还得ports这样的标签。
  18、external_links链接到 docker-compose.yml 外部的容器,甚至 并非 Compose 项目文件管理的容器
        external_links:
              - redis_1
              - project_db_1:mysql
              - project_db_1:postgresql
  19、extra_hosts:添加主机名映射,使用与 docker 客户端--add-host类似会往/etc/hosts文件中添加一些记录
        extra_hosts:
           - "somehost:162.242.195.82"
            - "otherhost:50.31.209.229"
  20、healthcheck:检查容器是否“健康”。如果需要禁用镜像的所有检查项目,可以使用disable:true,相当于test:["NONE"]
     healthcheck:
       test: ["CMD", "curl", "-f", "http://localhost"]
       interval: 1m30s    #间隔
       timeout: 10s
       retries: 3
       start_period: 40s   #开始时间
     test必须是字符串或列表。如果是列表,则第一项必须是NONE,CMD或CMD-SHELL。如果是字符串,则相当于指定CMD-SHELL后跟该字符串。
         # Hit the local web app
          test: ["CMD", "curl", "-f", "http://localhost"]
          test: ["CMD-SHELL", "curl -f http://localhost || exit 1"]
          test: curl -f https://localhost || exit 1
  21、image:从指定的镜像中启动容器,可以是存储仓库、标签以及镜像 ID
  22、init:转发信号和取得进程,将此选项设置true为服务启用此功能
  23、isolation:容器隔离技术.在 Linux 上,唯一支持的值是default。
                       在 Windows 上,可接受的值为default、process和hyperv。
  24、labels:元数据添加到容器,可以使用数组或字典
        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: ""
  25、links:链接到另一个服务中的容器。指定服务名称和链接别名 ("SERVICE:ALIAS"),或仅指定服务名称。
        在以下示例中,web可以访问db,并且设置别名为database:
           version: "3.9"
           services:
                 web:
                      build: .
                  links:
                  - "db:database"
                   db:
                      image: postgres
  26、logging:日志记录配置.示例如下
           version: "3.9"
            services:
                 some-service:
                      image: some-service
                logging:
                     driver: "json-file"
               options:
                      max-size: "200k"
                      max-file: "10"
          network_mode
  27、network_mode:网络模式,可以使用特殊形式service:[service name]。
           network_mode: "bridge"
           network_mode: "host"
           network_mode: "none"
           network_mode: "service:[service name]"
           network_mode: "container:[container name/id]"
  28、pid:将 PID 模式设置为主机 PID 模式。这会在容器和主机操作系统之间共享 PID 地址空间。
       使用此标志启动的容器可以访问和操作裸机命名空间中的其他容器.
          pid: "host"
  29、port:暴露端口
        一般写法:指定两个端口 ( HOST:CONTAINER)
                    仅指定容器端口(为主机端口选择了一个临时主机端口)。
                    指定要绑定到两个端口的主机 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"
    详细写法:
          target: 容器内的端口
          published: 公开的端口
          protocol:端口协议(tcp或udp)
          mode:host用于在每个节点上发布主机端口,或ingress用于负载平衡的群模式端口。
       ports:
           - target: 80
            published: 8080
            protocol: tcp
            mode: host
 30、profiles:用于定义和控制哪些服务在特定场景下运行,通过为每个服务指定一个或多个 profile 标签,可以实现条件化启动服务。
                        默认启动所有。要激活特定的 profile,可以在命令行中使用 `--profile` 参数。
         profiles: ["frontend", "debug"]
         profiles:
          - frontend
          - debug
 31、restart:重启策略
      restart: "no"   #默认,任何情况下都不会重启
      restart: always   #一直重启不停
      restart: on-failure        #如果退出代码指示失败错误,则该策略会重新启动容器
      restart: unless-stopped    #总是重新启动容器,除非容器停止(手动或其他方式)
 32、secrets:授予访问权限
       一般用法仅指定机密名称,示例如下
          version: "3.9"
          services:
              redis:
                   image: redis:latest
             deploy:
                  replicas: 1
             secrets:
                  -  my_secret
                  - my_other_secret
         secrets:
              my_secret:
                   file: ./my_secret.txt
              my_other_secret:
                  external: true    #外部机密,表示已经在docker中定义,无论如何都不会重新建立。如果外部机密不存在,部署失败并显示secret not found
   
    详细用法:source:定义机密标识符。
    arget:要挂载在/run/secrets/服务的任务容器中的文件的名称,默认是 source。
    uid和gid:/run/secrets/在服务的任务容器中拥有文件的数字 UID 或 GID 。
    mode:要挂载在/run/secrets/ 服务的任务容器中的文件的权限,以八进制表示法。例如,0444 代表可读。
    file:使用指定路径中的文件内容创建机密。
    template_driver:要使用的模板驱动程序的名称。当前支持的唯一驱动程序是golang,它使用golang。示例
    
   version: "3.9"
   services:
        redis:
           image: redis:latest
        deploy:
          replicas: 1
       secrets:
           - source: my_secret
           target: redis_secret
            uid: '103'
           gid: '103'
           mode: 0440 #组可读
     secrets:
        my_secret:
             file: ./my_secret.txt     #使用指定路径中的文件内容创建机密
        my_other_secret:
             external: true   
     上述例子表示my_first_secret在<stack_name>_my_first_secret 部署堆栈时创建 ,并且my_second_secret已存在于 Docker 中。
  33、security_opt:管理全部服务的标签,比如设置全部服务的 user 标签值为USER
       security_opt:
        - label:user:USER
        - label:role:ROLE 
  34、stop_grace_period:尝试停止容器时等待多长时间,默认10秒
  35、stop_signal:设置信号来停止容器。默认情况下stop使用 SIGTERM
  36、sysctls:内核参数。可以是数组或字典
     sysctls:
        net.core.somaxconn: 1024
        net.ipv4.tcp_syncookies: 0
  37、tmpfs:容器挂载临时文件。可以是单个值或列表
        tmpfs: /run
        tmpfs:
           - /run
           - /tmp
  38、ulimits:设置当前进程以及其子进程的资源使用量,覆盖默认试着
        ulimits:
           nproc: 65535   #最大进程数
           nofile:
             soft: 20000   #软件资源限制
             hard: 40000  
  39、userns_mode:如果 Docker 守护程序配置了用户命名空间,则禁用此服务的用户命名空间。
        userns_mode: "host" #服务停用用户命名空间功能,让服务以宿主机的用户命名空间运行,类似 docker run 命令中使用 --userns=host 参数的效果
        使用 docker stack deploy 在 Swarm(集群) 模式下部署堆栈时,userns_mode 配置项会被忽略,其仅对基于常规 docker-compose 启动的服务生效
  40、volumes:指定卷(Volumes)的挂载位置。卷用于在容器和宿主机之间共享数据,或者在不同的容器之间共享数据。
         web 服务使用命名卷 (mydata),以及为单个服务定义的绑定安装(dbservice下的第一个路径volumes)。db服务还使用名为dbdata(dbservice下的第二个路径             volumes)的命名卷,使用了旧字符串格式定义它以安装命名卷。命名卷必须列在顶级volumes键下。
     version: "3.9"
     services:
        web:
          image: nginx:alpine
           volumes:
              - type: volume  #安装类型,volume(默认值:持久化存储卷)
                                     #tmpfs(数据会存储内存里。适合存储临时的非持久化且需较快读写速度的数据,容器停止后对应数据便会消失。能搭配 size 等选项设定容量限制)
                                    #npipe(仅适用于 Windows 系统,用于挂载命名管道(Named Pipe))
                                    #bind(代表绑定挂载,把宿主机指定路径直接挂载到容器内。宿主机路径可用绝对或相对路径表示,常适合开发中需快速访问宿主机文件场景)
              source: mydata  #安装源、主机上用于绑定安装的路径或在顶级volumes 中定义的卷的名称 。不适用于 tmpfs 挂载
              target: /data   #安装卷的容器中的路径
              volume:
                nocopy: true  #创建卷时禁用从容器复制数据的标志
              - type: bind
                 source: ./static
                 target: /opt/app/static
        db:
          image: postgres:latest
          volumes:
               - "/var/run/postgres/postgres.sock:/var/run/postgres/postgres.sock" #绑定挂载:指定宿主机路径和容器内路径。格式[SOURCE:]TARGET[:MODE]格式
               - "dbdata:/var/lib/postgresql/data"                                   #具名挂载:指定卷名和容器内路径。卷名需要在顶级volumes键下声明。
               - /path/in/container                                                  #匿名挂载:只指定容器内路径,不指定宿主机路径或卷名。Docker Compose会创建一个匿名卷。
   volumes:
     mydata:
     dbdata: # 声明具名卷
   一级(最上面Volmes)配置参数:driver 指定该卷应使用哪个卷驱动程序 
                              driver_opts 将选项列表指定为键值对以传递给此卷的驱动程序
                              labels 添加元数据
                              name 为此卷设置自定义名称
                              o选项用于向卷驱动传递以逗号分隔的多个挂载选项列表。其具体取值取决于卷驱动类型(type)
                                使用 local 驱动作绑定挂载:用 o: bind 表明用绑定模式挂载,类似执行 mount -o bind 命令,常与 type: none 组合
                                当驱动为 nfs 时,o 可设服务器地址、读写权限等
                                挂载 CIFS 卷:挂载 CIFS 协议的网络共享目录时,借 o 设定用户名、密码及目录、文件权限等
                                当 driver 为 tmpfs 时,能借 o 配置类似大小、uid 等,像 o: "size=100m,uid=1000" 限制卷大小 100MB,并设所有者用户 ID 为 1000。
         volumes:
              example:
                   driver_opts:
                     type: "nfs"
                     o: "addr=10.40.0.199,nolock,soft,rw"  
                     device: ":/docker/example
 41、变量置换:用 $VARIABLE 或者 ${VARIABLE} 来置换变量,避免硬编码敏感信息或重复配置,非常适合多环境部署场景
       ${VARIABLE:-default}VARIABLE在环境中未设置或为空时设置为default。
       ${VARIABLE-default}仅当VARIABLE在环境中未设置时才设置为default。
       ${VARIABLE:?err}退出并显示一条错误消息,其中包含环境中的errif VARIABLE未设置或为空。
       ${VARIABLE?err}退出并显示一条错误消息,其中包含errif VARIABLE在环境中未设置。
       如果想使用一个不被compose处理的变量,可用使用 $$;如有特殊字符,要用引号引起来使用环境变量
       services:
          app:
           image: ${IMAGE_NAME:default-app:latest}  # 变量不存在时使用默认值
           ports:
                - "${APP_PORT}:80"
       使用 .env 文件 
        # .env 文件
        IMAGE_NAME=my-app:1.0
        APP_PORT=8080
        compose.yml文件
        services:
        app:
          image: ${IMAGE_NAME}
          ports:
            - "${APP_PORT}:80"  #若 APP_PORT 未定义,使用 80
    --env-file 选项指定额外的环境变量文件
        docker-compose --env-file ./config/prod.env up
        在环境变量中使用变量,注意env 文件中支持变量嵌套(需注意 Shell 兼容性),env文件示例如下
        BASE_DIR=/app
        DATA_DIR=${BASE_DIR}/data  # 引用 BASE_DIR 的值        
    默认情况下,未定义的变量会被替换为空字符串。若希望未定义变量报错,可启用严格模式

posted on 2025-08-09 23:01 Benjamin 阅读(36) 评论(0)  编辑 收藏 引用 所属分类: 杂谈