最全docker之docker-compose.yml详解

配置文件的规则:

根据 官网,一点一点整理的,大约用了2周左右吧。。。毕竟还要上班

一些配置规则

看下面的compose.yml文档前,首先需要了解点东西:

#-----------------关于一些时间的配置:----------------------
格式一般如下,例如: interval、timeout
  2.5s
  10s
  1m30s
  2h32m
  5h34m56s
支持的单位:us, ms, s, m and h
#-----------------关于一些大小的配置:----------------------
格式一般如下,例如: shm_size
  2b
  1024kb
  2048k
  300m
  1gb
支持的单位是b, k, m和g,以及它们的替代符号kb, mb和gb。目前不支持十进制值。
#------------------关于变量-------------------------------
docker compose是支持变量替换的。例如你已经定义了一个变量`POSTGRES_VERSION=9.3`,如果你想使用该变量,
当如下配置:

db:
  image: "postgres:${POSTGRES_VERSION}"

docker-compose运行时,他会将 `db.image`的值解析为 `postgres:9.3`。
如果变量POSTGRES_VERSION未设置,那么compose会用空串代替,他会将 `db.image`的值解析为 `postgres:`。
如果你在compose中使用了`.env`环境变量文件,那么这些变量,会从文件里找。在shell环境中设置的值将覆盖在.env文件中设置的值。
.env文件特性仅在使用`docker compose up`命令时有效,而不适用于`docker stack deploy`。

语法`$VARIABLE`和`${VARIABLE}`都是支持的。
此外,当使用V2.1文件格式时,可以使用典型的shell语法提供内联默认值:
${VARIABLE:-default} 如果VARIABLE为空或者是未设置时,则最后结果为`default`
${VARIABLE-default} 这种写法,与上面不同,只有VARIABLE是未设置时,才返回结果为`default`

类似地,下面的语法允许你指定强制变量:
${VARIABLE:?err} 如果'VARIABLE'未设置或在环境中为空,则退出并返回包含'err'的错误消息。
${VARIABLE?err} 这种写法,与上面不同,只有环境中未设置'VARIABLE'变量,才退出并返回包含'err'的错误消息。

不支持其他扩展的shell样式特性,例如:${VARIABLE/foo/bar}

当您的配置需要实际的美元符号时,您可以使用$$(双美元符号)。这还可以防止Compose插入值,因此$$允许您引用不想由Compose处理的环境变量。

web:
  build: .
  command: "$$VAR_NOT_INTERPOLATED_BY_COMPOSE"
  
如果您忘记使用单个美元符号($),Compose将该值解释为环境变量并警告您:
The VAR_NOT_INTERPOLATED_BY_COMPOSE is not set. Substituting an empty string.
compose.yml详解

关于本文档的阅读:
1、每个配置的解释,都在配置上方。
2、有的配置含有多种语法(不同的写法),不同的语法有的兼容,有的不兼容。
3、关于集群的配置,有的可能不太准确。毕竟很少使用compose来搭建集群。如果哪有错误,还请留言,我会进行更正。
4、注意当前compose的版本,超过该版本的,配置可能会出现版本误差。

#compose的版本。 Compose 文件格式有3个大版本,分别为1.x, 2.x 和 3.x,
#目前主流的为 3.x 其支持 docker 1.13.0 及其以上的版本
#写此文档的时间为2023-10-19,compose文档的最新版本为V3.8。咱们按照V3.8的版本来写此文档。
version: "3.8"

#----------services模块-----------------------
services:
  #服务名称,当前服务名称为wordpress。该项允许自定义。
  wordpress:
    #镜像构建
    build:
      #一个包含Dockerfile的目录的路径,或者一个git仓库的url。当提供的值是相对路径时,这个路径为相对于撰写文件(即当前yml)的位置。这个目录也是发送给Docker守护进程的构建上下文。
      context: ./dir
      #dockerFile的名称。使用改值,必须提供文件路径
      dockerfile: Dockerfile-alternate
      #添加构建参数,这些参数是仅在构建过程中可访问的环境变量。
      #定义了参加。可以在dockerfile里直接使用。
      #--------------在dockerfile里的用法,使用“$参数名"来获取----------------------
      # syntax=docker/dockerfile:1
      #ARG buildno
      #ARG gitcommithash
      #RUN echo "Build number: $buildno"
      #RUN echo "Based on commit: $gitcommithash"
      #-----------------------------------------------------------------------
      args:
        #写法一
        buildno: 1
        gitcommithash: cdc3b19
        #写法二
        - buildno=1
        - gitcommithash=cdc3b19

      #[该语法需 version 3.2+]
      #指定缓存的镜像列表 (等同于 docker container build --cache_from 的作用)
      cache_from:
        - alpine:latest
        - corp/web_app:3.14
      #[该语法需 version 3.3+]
      #设置镜像的元数据 (等同于 docker container build --labels 的作用)
      labels:
        com.example.description: "Accounting webapp"
        com.example.department: "Finance"
        com.example.label-with-empty-value: ""
      #[该语法需 version 3.4+]
      #在构建期间为RUN指令设置连接到的网络容器。none-在构建期间禁用网络;host-host网络;自定义网络-需要创建网络,即在networks项目里创建网络
      network: host
      #[该语法需 version 3.5+]
      #设置构建的容器/dev/shm分区的大小的。允许字符写法:'2gb';允许数字写法(单位byte):10000000
      shm_size: '2gb'
      #[该语法需 version 3.4+]
      #按照Dockerfile中的定义构建指定的stage
      target: prod
    #自定义容器名称,而不是compose给你生成。注意:容器名称必须是唯一
    container_name: custom_container_name
    #覆盖默认命令。跟dockerfile里的 CMD一样的写法
    command: [ "bundle", "exec", "thin", "-p", "3000" ]

    #依赖。服务之间的依赖关系,使用此参数,意味着,当前服务启动必须要等配置的服务启动后才能启动。另外该参数,支持两种写法.长短写法不允许同时存在。
    #----------短写法----------
    #注意:短语法的写法,不是强依赖。redis和mysql启动了,当前服务就会启动。但是这个依赖服务启动的怎么样,跟当前服务的启动没关系。
    #当前这个服务wordpress。必须要等redis以及mysql两个服务启动了,才能在启动。反过来,停止的时候,当前服务先停止,之后redis和mysql才能停止。
    depends_on:
      - redis
      - mysql
    #----------长写法----------
      db:
        #满足条件:这地方真绕。。。官网看的我眼都花了。
        #service_started-等价于上面的短语法。按启动顺序启动,至于启动的怎么样,跟其他服务启不启动,没关系。。。。
        #service_healthy:指定在启动依赖服务之前,期望依赖项处于“正常”状态(由healthcheck指示)
        #service_completed_successfully:指定在启动依赖服务之前,期望依赖项运行到成功完成。
        condition: service_healthy
        # 当db服务重启后,该服务也会重启
        restart: true
      redis:
        condition: service_started

    #[该语法需 version 3.3+]
    #配置托管服务帐户的凭据规范。此选项仅用于使用Windows容器的服务。credential_spec的格式必须为`file://<filename>`或者是`registry://<value-name>`
    credential_spec:
      #当使用的是文件时,文件必须存在于Docker数据目录的CredentialSpecs子目录中。在Windows上默认为C:\ProgramData\Docker\。
      #例如:在C:\ProgramData\Docker\CredentialSpecs\my-credential-spec.json的文件中加载凭据规范。当如下配置
      file: my-credential-spec.json
      #当使用registry:时,将从守护进程主机上的Windows注册表读取凭据规范。具有给定名称的注册表值必须位于:
      #HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Virtualization\Containers\CredentialSpecs
      #在上面的注册表目录下新建名为my-credential-spec的项目,并在里面加载凭据规范,当如下配置:
      registry: my-credential-spec
      #配置gMSA服务的证书规格时,只需要使用config命令指定证书规格。
      #想使用改证书配置,必须有my_credential_spec该配置。 即:使用config前,请使用configs.my_credentials_spec.file配置好该证书
      config: my_credential_spec

    #添加容器
    cap_add:
      - ALL
    #删除容器
    cap_drop:
      - NET_ADMIN
      - SYS_ADMIN
    #为容器指定一个可选的父cgroup。
    cgroup_parent: m-executor-abcd

    #[该语法需 version 3.0+]
    #设置与服务的部署和运行相关的配置
    #以下子选项仅在使用docker stack部署部署到集群时生效,并且被docker-compose up和docker-compose run忽略,除了资源。
    deploy:
      #要么是全局的(每个集群节点恰好有一个容器),要么是复制的(指定数量的容器)。复制默认值。
      mode: replicated
      #为服务指定标签。这些标签只能在服务上设置,而不能在服务的任何容器上设置。
      #如果要在容器上设置,请使用 services.wordpress.labels
      labels:
        com.example.description: "This label will appear on the web service"
      #如果复制了服务(这是默认值),则指定在任何给定时间应该运行的容器的数量。
      replicas: 2
      #[该语法需 version 3.2+]
      #该语法 给 swarm 提供的配置项。详细的,请看swarm的配置介绍。
      #为连接到集群的外部客户端指定服务发现方法
      #vip:Docker为该服务分配一个虚拟IP (VIP),作为客户端在网络上访问该服务的前端。Docker在客户端和服务的可用工作节点之间路由请求,而客户端不知道有多少节点参与了服务,也不知道它们的IP地址或端口。(这是默认设置。)
      #dnsrr:DNS round-robin (DNSRR,dns轮循)服务发现不使用单个虚拟IP。Docker为服务设置DNS条目,这样对服务名称的DNS查询返回一个IP地址列表,客户端直接连接到其中一个。DNSRR在使用自己的负载平衡器或混合Windows和Linux应用程序的情况下非常有用。
      endpoint_mode: vip, dnsrr
      #指定约束和首选项的位置
      placement:
        #[该语法需 version 3.8+]
        #如果该服务是复制的,则限制任何时候可以在节点上运行的副本数量。
        #当请求的任务多于正在运行的节点时,会抛出错误 `no suitable node (max replicas per node limit exceed)` 即 “没有合适的节点”(超过每个节点的最大副本限制)。
        max_replicas_per_node: 1
        #约束/限制:当前服务职能运行在manager节点上
        constraints: [node.role == manager]
      #更新服务配置项。用于配置滚动更新。
      update_config:
        #一次要更新的容器数量。
        parallelism: 2
        #更新一组容器之间的等待时间。
        delay: 10s
        #如果更新失败该怎么做。continue-继续、pause-暂停(默认pause)
        failure_action: continue
        #每次任务更新到监视失败后的持续时间(ns|us|ms|s|m|h)(默认为5秒)注意:设置为0将使用默认的5秒。
        monitor: 5s
        #更新期间可容忍的故障率。
        max_failure_ratio: 0
        #[该语法需 version 3.4+]
        #更新期间的操作顺序。默认:stop-first
        #stop-first:在启动新任务之前停止旧任务
        #start-first:首先启动新任务,并且正在运行的任务短暂重叠
        order: stop-first
      #[该语法需 version 3.7+]
      rollback_config:
        #一次回滚的容器数量。如果设置为0,则所有容器同时回滚。
        parallelism: 0
        #每个容器组回滚之间的等待时间(默认为0秒)。
        delay: 0s
        #如果回滚失败该怎么做。continue-继续、pause-暂停(默认pause)
        failure_action: continue
        #每次任务更新到监视失败后的持续时间(ns|us|ms|s|m|h)(默认为5秒)注意:设置为0将使用默认的5秒。
        monitor: 5s
        #回滚期间允许的故障率(默认为0)。
        max_failure_ratio: 0
        #回滚期间的操作顺序。默认:stop-first
        #stop-first:在启动新任务之前停止旧任务
        #start-first:首先启动新任务,并且正在运行的任务短暂重叠
        order: stop-first
      #配置:当容器退出时重启容器,代替 restart
      restart_policy:
        #条件:none-无, on-failure-失败,any-所有。默认为any
        condition: on-failure
        #尝试重启的等待时间,默认为 0
        delay: 5s
        #在放弃之前尝试重新启动容器次数(默认:从不放弃)。如果重新启动在配置中没有成功 window,则此尝试不计入配置max_attempts 值。例如,如果 max_attempts 值为 2,并且第一次尝试重新启动失败,则可能会尝试重新启动两次以上。
        max_attempts: 3
        #在决定重新启动是否成功之前的等时间,指定为持续时间(默认值:立即决定)。
        window: 120s
      #[该语法与 version 3.0 change ,资源部分取代了3.0之前撰写文件中的旧资源约束选项(cpu_shares、cpu_quota、cpuset、mem_limit、mem_swap_limit、mem_swappiness)]
      #设置资源的约束
      #当前服务(wordpress)被限制使用不超过50M的内存和0.50(单个核心的50%)可用处理时间(CPU),并且有20M的内存和0.25的CPU时间预留(始终可用)。
      #注意:慎用此项。如果当前服务使用的资源超过设定的,会出现内存溢出的问题。一旦出现,服务器内核可能会干到当前容器甚至是docker守护进程。非要使用的话,建议设大一点哈。
      resources:
        limits:
          cpus: '0.50'
          memory: 50M
        reservations:
          cpus: '0.25'
          memory: 20M

    #[该语法需 version 3.3+]
    #使用每个服务的配置,在每个服务的基础上授予对配置的访问权限。支持两种不同的语法,一种短语法,一种长语法。
    #并且可以允许长短语法同时存在。
    configs:
      #短写法----------------------
      #短语法变体只指定配置名。这将授予对配置的容器访问权限,并将其挂载在容器中的/<config_name>处。源名称和目标挂载点都设置为配置名称。
      #当你这样使用这两种配置的时候,这意味,这个资源configs.my_config、configs.my_other_config已经配置好了。
      #如果外部资源不存在,则堆栈部署失败,并出现配置未找到错误
      - my_config
      - my_other_config
      #长写法----------------------
      #长写法,提供的配置的颗粒度更细。
      #下面的示例将容器中的my_config名称设置为redis_config,将模式设置为0440(组可读),并将用户和组设置为103。
        #定义这个配置的名字为my_config
      - source: my_config
        #要挂载到服务的任务容器中的文件的路径和名称。如果未指定,默认为/<source>,如当前不加此项默认为 /my_config/my_config.txt
        target: /redis_config
        #在服务的任务容器中拥有挂载的配置文件的数字UID或GID。如果没有指定,在Linux上都默认为0
        uid: '103'
        gid: '103'
        #在服务的任务容器内挂载的文件的权限,以八进制表示。
        #例如,0444表示世界可读。默认值是0444。配置是不可写的,因为它们被挂载在临时文件系统中,所以如果设置了可写位,它将被忽略。可执行位可以设置。如果您不熟悉UNIX文件权限模式,您可能会发现这个权限计算器很有用。
        #咱们一般都是用linux命令直接给文件授权,这个配置项有点鸡肋哈。
        mode: 0440

    #设备映射列表。该配置项与docker client创建时候--device相关
    devices:
      - "/dev/ttyUSB0:/dev/ttyUSB0"

    #自定义DNS服务器。可以是单个值,也可以是列表。
    dns: 8.8.8.8
    dns:
      - 8.8.8.8
      - 9.9.9.9

    #自定义DNS搜索域。可以是单个值,也可以是列表。
    dns_search: example.com
    dns_search:
      - dc1.example.com
      - dc2.example.com

    #覆盖DockerFile里的ENTRYPOINT项。可以是可执行文件,可以是命令集合。
    #请注意:配置了该项,DockerFile里的ENTRYPOINT将不再生效。。。
    entrypoint: /code/entrypoint.sh
    entrypoint: ["php", "-d", "memory_limit=-1", "vendor/bin/phpunit"]

    #从一个文件里增加环境变量,可以是单个值,可以是列表。
    #注意:1.使用了该配置项,文件里的环境变量会覆盖现有的,即使是null或者是undefined,也会覆盖。
    #     2.如果使用`docker-compose -f FILE`指定了一个模板文件(即:docker-compose的yml文件),那env_file配置的所有相对路径,都是相对于这个文件所在路径的。
    #     3.如果使用的是列表,那么请注意:文件加载是从上往下顺序加载的,最后一个文件的配置项会覆盖之前的配置。
    #     4.compose希望.env文件里面,是KEY=VALUE样式的。#代表注释,注释和空行会被忽略。如果#也是VALUE的内容,请使用引号包裹。
    env_file: .env
    env_file:
      - ./common.env
      - ./apps/web.env
      - /opt/runtime_opts.env
    #emm。。。还是增加环境变量。上面是通过文件增加环境变量。这个是直接配置。两种写法,一种KEY=VALUE,一种递归缩写(yml写法)。
    #yml写法需要特别注意,可以使用字符串,也可以是数字。但是请注意:字符串(true, false, yes, no)最好使用引号包裹,避免compose给解析成boolean类型
    environment:
      #语法1
      RACK_ENV: development
      SHOW: 'true'
      SESSION_SECRET:
      #语法二
      - RACK_ENV=development
      - SHOW=true
      - SESSION_SECRET

    #公开端口而不将它们发布到主机上——它们只能被链接的服务访问。只能指定内部端口。
    #意思是,公开的端口,只能同一network的访问,其他的不允许访问。
    expose:
      - "3000"
      - "8000"
    #链接docker用于链接外部网络。
    #特别是对于提供共享或公共服务的容器。在指定容器名称和链接别名(container: alias)时,external_links遵循与遗留选项链接类似的语义。
    #在开发中,好多项目都是自己一个compose,一个服务器可能会存在对个compose。每个compose里的容器,就是通过external_links来通信的
    #但是要想链接外部创建的容器,就必须和当前服务的容器连接到至少一个相同的网络。否则,不生效。
    #当时用 swarm 部署集群的时候,该配置是不生效的哈。
    external_links:
      - redis_1
      - project_db_1:mysql
      - project_db_1:postgresql

    #给容器添加主机名映射。与docker命令里的参数`--add-host`一致
    extra_hosts:
      - somehost:162.242.195.82
      - otherhost:50.31.209.229

    #给当前容器添加健康检查
    healthcheck:
      #test必须是字符串或列表。如果它是一个列表,第一项必须是NONE、CMD或CMD- shell。如果它是一个字符串,则相当于指定CMD-SHELL,后跟该字符串。
      test: ["CMD", "curl", "-f", "http://localhost"]
      #interval、timeout、start_period都是时间
      #间隔时间
      interval: 1m30s
      #超时时间
      timeout: 10s
      #[该语法需 version 3.4+]
      #持续时间
      start_period: 40s
      #检查次数
      retries: 3
      #要禁用映像设置的任何默认健康检查,可以使用disable: true。这相当于指定test: ["NONE"]。
      disable: true

    #镜像名称及tag版本号,也可以是镜像ID。不写tag默认为latest。如果本地没有该镜像,则自动从docker上下载该镜像。
    #如果你指定了构建,那么构建后的镜像名称及版本号,则为image的值。
    image: wordpress

    #[该语法需 version 3.7+]
    #在容器内运行init,转发信号并获取进程。将此选项设置为true以启用该服务的此特性。
    #默认的init是这个:https://github.com/krallin/tini
    #默认安装在/usr/libexec/docker-init下。如果你要使用自定的init,那么可以修改/etc/docker/daemon.json,增加init-path项
    init: true

    #指定容器的隔离技术。在Linux上,唯一支持的值是default。在Windows上,可接受的值是default、process、hyperv。
    #详细内容:https://docs.docker.com/engine/reference/commandline/run/#isolation
    isolation: default

    #使用Docker标签向容器中添加元数据。您可以使用数组或字典。两种写法。
    #建议您使用反向dns表示法,以防止您的标签与其他软件使用的标签冲突。
    #注意:labels 很多啊。有给服务设置标签:services.wordpress.deploy.labels;给镜像添加源数据services.wordpress.build.labels
    labels:
      #写法一
      com.example.description: "Accounting webapp"
      com.example.department: "Finance"
      com.example.label-with-empty-value: ""
      #写法二
      - "com.example.description=Accounting webapp"
      - "com.example.department=Finance"
      - "com.example.label-with-empty-value"

    #遗留方法,马山就会溢出,不推荐使用。
    #他能实现在容器之间共享环境变量,但是以使用卷等其他更可控的方式和机制也能实现在容器之间共享环境变量。
    #自定义网络的不支持使用。
    #如果同时定义了链路和网络,那么在它们之间有链路的服务必须共享至少一个公共网络才能进行通信。
    #使用swarm,该配置会被忽略。
    links:
      - "db"
      - "db:database"
      - "redis"

    #服务的日志配置。
    logging:
      #驱动程序名称指定了服务容器的日志驱动程序,此项跟docker run ——log-driver选项一样
      #值为:none、json-file、syslog。默认值为json-file。
      driver: syslog
      options:
        #diiver为syslog时的配置
        syslog-address: "tcp://192.168.0.42:123"
        #  #diiver为json-file时的配置。这个地方注意哈,日志文件会使卷变大,要注意内存。
        #容器内日志文件文件最大为200k,超过阀值,就会轮换文件。即日志记录到下一个文件
        max-size: "200k"
        #文件数量最多为10个,超过阀值,就会删除旧的文件,来生成新文件
        max-file: "10"

    #网络模式。等同于 --network 选项。使用swarm时,该选项会被忽略
    #选项值:"bridge"、"host"、"none"、"service:[service name]"、"container:[container name/id]"
    #注意:host不能与links混用
    network_mode: "bridge"

    ## 将容器加入指定网络。两种写法
    # 使用自定义网络,必须使用顶级网络键下的条目,即需要先使用`networks.custom_network_name`配好该网络,才可以在services.wordpress.networks下配置该网络
    networks:
      #------短写法---------------
#      - overlay
#      - custom_network_name
      #------长写法---------------
      # 网络上此服务的别名(替代主机名)。同一网络上的其他容器可以使用服务名称或此别名连接到该服务的容器之一。
      # 由于别名是有网络范围的,所以相同的服务在不同的网络上可以有不同的别名。
      overlay:
        aliases:
          - alias1
          - alias3
      custom_network_name:
        aliases:
          - alias2
      #加入该网路的时候,指定一个静态的ip地址
      #不过想要使用静态ip。必须确定该网络的配置项下有ipam配置。即顶级网络键中有networks.custom_network_name2.ipam配置,
      #并且保证networks.custom_network_name2.ipam.config[*].subnet下的子网配置覆盖你写的静态地址。
      custom_network_name2:
        ipv4_address: 172.16.238.10
        #ipv6不能swarm mode下起效。
        #如果你下个使用ipv6,需要满足一下条件
        # 1、确认当前docker的版本支持ipv6。根据官网文件,ipv6只能在 V2.x上运行。只能在linux上运行。
        #   如果你不确定是否支持,那就需要验证,官方给与的验证方案:https://docs.docker.com/config/daemon/ipv6/
        #   个人建议还是验证一下,人家文档也不知道是啥时候写的,万一是之前写,现在支持了,文档没改呢。
        # 2、要满足以上要求(顶级网路键下有该子网的配置),还要保证ipv6处于启用状态。
        #   即 /etc/docker/daemon.json下,存在该配置:{"ipv6": true, "fixed-cidr-v6": "2001:db8:1::/64"}
        # 3、还要保证系统配置项ipv6没有禁用,即:services.wordpress.sysctls[*]下存在改配置net.ipv6.conf.all.disable_ipv6=0
        #要不咱们不用ipv6了吧,我看着文档都觉得蛋疼。。。。
        ipv6_address: 2001:3984:3989::10

    #官网翻译:设置PID模式为主机PID模式。这将打开容器和主机操作系统之间共享PID地址空间。使用此标志启动的容器可以访问和操作裸机名称空间中的其他容器,反之亦然。
    #说那么多,就是host摸下,容器和宿主机器共用宿主机的network服务,所有的线程啥的都在一个网络空间内。所有使用host模式的容器,是可以相互访问的。
    #还不懂的话,就去看之前的博客,高级篇中关于host的篇章,了解了原理就明白了
    pid: "host"

    #端口映射。两种写法
    #注意:他与`network_mode:host`不兼容哈
    #其次 docker-compose run的会忽略端口,除非你使用了`--service-ports`
    #最后,HOST:CONTAINER 方式端口号不能小于60。
    #-----短语法-----------
    ports:
      #指定容器端口,宿主机随机映射
      - "3000"
      #在 3000-3005 范围中随机指定容器端口,宿主机随机映射
      - "3000-3005"
      # 宿主机端口:容器端口
      - "8000:8000"
      # 范围端口映射
      - "9090-9091:8080-8081"
      # 端口<60,不行哈。
      - "49100:22"
      #宿主机ip:宿主机端口:容器端口
      - "127.0.0.1:8001:8001"
      #宿主机ip:范围内随机宿主机端口:范围内随机容器端口
      - "127.0.0.1:5000-5010:5000-5010"
      # 宿主机端口随机:容器端口指定为5000
      - "127.0.0.1::5000"
      # 宿主机端口:容器端口,并指定协议
      - "6060:6060/udp"
      #宿主机端口范围内随机:容器端口1240
      - "12400-12500:1240"
    #-------长语法------------
    #[该语法需 version 3.2+]
    ports:
        #容器端口
      - target: 80
        #对外暴漏端口,可以理解为宿主机端口
        published: 8080
        #协议
        protocol: tcp
        #值:host-用于在每个节点上发布主机端口,ingress-集群模式下端口用于加载负载均衡
        mode: host

    #命名配置文件列表,可以是数组,也可以是集合
    #Profiles为要在其下启用的服务定义了一个命名配置文件列表。当不设置时,该服务将始终启用。对于构成核心应用程序的服务,您应该省略配置文件,以便始终启动它们。
    #有效的配置文件名称遵循regex格式[a-zA-Z0-9][a-zA-Z0-9_.-]+。
    profiles: [ "frontend", "debug" ]
    profiles:
      - frontend
      - debug

    #重启策略,默认-no
    #no:任何情况下都不会重启容器;
    #always:容器总是重新启动;
    #on-failure:退出代码出现on-failure的错误,将重新启动容器;
    #unless-stopped:除非容器被停职(手动或者其他),否则总是重新启动容器。
    restart: always

    #使用每个服务的秘密配置在每个服务的基础上授予对秘密的访问权限。有两种语法,两种写法可以混用
    secrets:
        #-------短语法------
        #指定已经配置好的密钥名称,compose会自动去顶级配置项中查找,是否存在该秘钥secrets.my_secret
      - my_secret
      - my_other_secret
        #-------长语法------
        #密钥名称
      - source: my_secret
        #文件名称,/run/secrets中挂载的文件的名称
        target: redis_secret
        #在服务的任务容器/run/secrets/中拥有文件的数字UID或GID。如果未指定,则两者默认为0。
        uid: '103'
        gid: '103'
        #文件权限,以八进制表示。该文件是不可写的,如果设置了可写位,它也被忽略。但是可执行位可以设置。
        mode: 0440
    #安全选项
    #覆盖每个容器的默认标签方案。
    #在使用swarm stack deploy集群部署时,该配置会被忽略
    security_opt:
      - label:user:USER
      - label:role:ROLE
    #指定在发送SIGKILL之前,如果容器没有处理SIGTERM(或使用stop_signal指定的任何停止信号),则尝试停止容器时需要等待多长时间。指定为持续时间。
    #默认情况下,stop会等待10秒让容器退出,然后再发送SIGKILL。
    stop_grace_period: 1s
#    stop_grace_period: 1m30s
    #设置替代信号以停止容器。默认情况下,停止使用SIGTERM。使用stop_signal设置一个替代信号将导致stop发送该信号。
    stop_signal: SIGUSR1

    #设置容器的内核参数/系统配置。两种写法不可混用。设置sysctls 等价于 `docker run --sysctl`
    #集群部署的时候,需要`docker Engine version>=19.03`
    #注意:1、network Namepspace中sysctls的配置以 net.* 开始的,如果使用了`--network=host`,则不允许使用sysctls的这些配置
    #     2、IPC Namespace 仅支持以下:
    #      `kernel.msgmax`, `kernel.msgmnb`, `kernel.msgmni`, `kernel.sem`,
    #      `kernel.shmall`, `kernel.shmmax`, `kernel.shmmni`, `kernel.shm_rmid_forced`,
    #      在这些Namespace中,如果使用`--ipc=host`,则不允许使用这些以`fs.mqueue.*`开头的配置
    sysctls:
      #语法一
      net.core.somaxconn: 1024
      net.ipv4.tcp_syncookies: 0
      #语法二
      #启用ipv6,使用ipv6需要配置该项
      - net.ipv6.conf.all.disable_ipv6=0
      - net.core.somaxconn=1024
      - net.ipv4.tcp_syncookies=0

    #[该语法需 version 3.6+]
    #在容器内挂载临时文件系统,可以是一个值,也可以是多个值
    tmpfs: /run
    tmpfs:
      - /run
      - /tmp
      #当使用(V3-3.5)Compose文件以swarm模式部署堆栈时,此选项将被忽略。
      - type: tmpfs
        target: /app
        tmpfs:
          #Size参数指定tmpfs挂载的大小(以字节为单位)。默认为无限制。
          size: 1000

    #指定容器的 ulimits 限制值。容器默认无限制。
    #指定最大进程数为 65535,指定文件句柄数为 20000(软限制,应用可以随时修改,不能超过硬限制) 和 40000(系统硬限制,只能 root 用户提高)
    ulimits:
      nproc: 65535
      nofile:
        soft: 20000
        hard: 40000

    #如果Docker守护进程配置了用户命名空间,则禁用该服务的用户命名空间。
    #即:禁用此服务的用户命名空间(如果有的话)
    #集群部署的时候会被忽略
    userns_mode: "host"


    #挂载主机路径或命名卷,指定为服务的子选项。
    #你可以单独定义volume信息,也可以多个服务公用一个volume,但是如果是公用一个,你需要在顶级配置volumes里设置这个volume
    volumes:
      #------------短写法--------------------
      #自定义卷.[SOURCE:]TARGET[:MODE]格式,其中SOURCE可以是主机路径或卷名称。TARGET是挂载卷的容器路径。标准模式是ro(只读)和rw(读写)(默认)
      #以`.`或者是`..`开头的都是相对路径,该路径相对于正在使用的Compose配置文件的目录展开
      #制定一个容器路径,然后docker自己创建这个卷。
      - /var/lib/mysql
      #绝对路径 宿主机路径:容器路径
      - /opt/data:/var/lib/mysql
      #相对路径,相当于compose.yml文件所在的路径展开
      - ./cache:/tmp/cache
      #用户相对路径,如果以root启动,那么 `~`等价于`/home/root`
      - ~/configs:/etc/configs/:ro
      # 当前服务的卷使用了 名为 db-data 的volume
      - db-data:/var/lib/mysql/data
      #------------长写法--------------------
      #当前服务的卷使用了 名为 mydata 的volume
      #type值:volume, bind, tmpfs or npipe
      #在创建bind、tmpfs时,使用长语法需要事先创建引用的文件夹。如果文件夹不存在,需使用短语法动态创建该文件夹。
      #当使用服务、集群和docker-stack时。请记住,支持服务的任务(容器)可以部署在集群中的任何节点上,并且每次更新服务时,这可能是一个不同的节点。
      #卷设置
      - type: volume
        #挂载的源、绑定挂载在主机上的路径,或者在顶级卷键中定义的卷的名称。不适用于tmpfs挂载
        source: mydata
        #挂载卷的容器中的路径
        target: /data
        #将卷设置为只读的标志
        read_only: true
        #配置其他卷选项
        volume:
          #在创建卷时禁用从容器复制数据的标志
          nocopy: true
      # bind设置
      - type: bind
        bind:
          #用于绑定的传播模式
          propagation: private
        #宿主机路径
        source: ./static
        #容器路径
        target: /opt/app/static
      # 配置其他TMPFS选项
      - type: tmpfs
        tmpfs:
          #TMPFS挂载的大小,以字节为单位
          size: 2555
        #宿主机路径
        source: ./static
        #容器路径
        target: /opt/app/static

#------这些值只能接受单个参数,和docker run 的对应参数一样------------
    #用户名或UID(格式为: <name\|uid>[:<group\|gid>])
    #使用该配置 等价与 `-u=postgresql`、`--user=postgresql`
    user: postgresql
    #容器内的工作目录。在容器中运行二进制文件的默认工作目录是根目录(/)。可以使用Dockerfile WORKDIR命令设置不同的工作目录。
    #使用该配置 等价于  `-w=/code`,`--workdir=/code`
    working_dir: /code
    #定义服务容器的自定义域名
    domainname: foo.com
    #定义容器主机名
    #使用该配置 等价于  `-h=foo`,`--hostname=foo`
    hostname: foo
    #设置容器的IPC模式
    #“”,空串-使用守护进程的默认值。
    #none:拥有私有IPC命名空间,没有挂载/dev/shm。
    #private:拥有私有IPC命名空间。
    #shareable:拥有私有IPC名称空间,可以与其他容器共享
    #`container:<name-or-ID>` :加入另一个(“可共享的”)容器的IPC名称空间。
    #host:使用系统的IPC命名空间
    #使用该配置 等价于  `--ipc=host`
    ipc: host
    #指定容器的mac地址。注意:手动指定的mac,docker不会检查mac是否唯一哈
    #使用该配置 等价于  `--mac_address= 02:42:ac:11:65:43`
    mac_address: 02:42:ac:11:65:43
    #是否存在特权,默认是无特权的,即默认情况下,容器不允许访问任何设备
    #使用该配置 等价于  `--privileged=true`
    privileged: true
    #将容器的根文件系统挂载为只读
    read_only: true
    #指定构建的容器/dev/shm分区的大小的
    shm_size: 64M
    #配置一个服务容器以使用分配的stdin运行。
    stdin_open: true
    #是否为当前容器分配一个客户端
    #使用该配置 等价于  `-t=true`,`--tty=true`
    tty: true
#---------------------------------

#----------volumes模块-----------------------
#[该语法chang version 3]。顶级volumes取代了v2版本中的volumes_from
#如果您使用docker stack deploy以swarm模式启动应用程序(而不是docker compose up),则会创建不存在的外部卷。
#在集群模式下,卷是由服务定义后自动创建的。由于服务任务在新节点上调度,因此在本地节点上创建卷。
volumes:
  #名为 db-data 的卷
  db-data:
    #[该语法i需 version 3.4+]
    #自定义卷的名称。。
    name: db-data
    #指定该卷应使用哪个卷驱动程序。默认为Docker引擎配置使用的驱动程序,大多数情况下是本地驱动程序。如果驱动程序不可用,当docker-compose up尝试创建卷时,引擎返回一个错误。
    driver: foobar
    #指定一个选项列表作为键值对传递给此卷的驱动程序。这些选项依赖于驱动程序,且是可选的。
    driver_opts:
      type: "nfs"
      o: "addr=10.40.0.199,nolock,soft,rw"
      device: ":/docker/example"
  #名为 mydata 的卷
  mydata:
    #true:此卷是在撰写之外创建的。Docker-compose up不会尝试创建它,如果它不存在则会引发错误。即:当前卷已经存在了,比如在当期服务器的另一个compose中创建了
    #注意:对于3.3及以下版本的格式,external不能与其他卷配置键(driver, driver_opts, labels)结合使用。此限制在3.4及以上版本中不再存在。
    external: true
      #[该语法instead version 3.4]
      #这个地方,有混乱啊,官方文档在external模块说是 这个语法external.name在 3.4版本弃用。到了下面name介绍的时候又说,这个语法Add于3.4版本。。。
      #所以到底弃用没弃用。我也不清楚....满头雾水.jpg....黑人问号.jpg...
      #说弃用的地方:https://docs.docker.com/compose/compose-file/compose-file-v3/#external
      #说新增的地方:https://docs.docker.com/compose/compose-file/compose-file-v3/#name-1
      name: actual-name-of-volume
  #使用Docker标签向容器中添加元数据。您可以使用数组或字典。
  #建议您使用反向dns表示法,以防止您的标签与其他软件使用的标签冲突。
  #这个地方。官方这样写的,不知道为啥,我这idea检查飘红。。。暂时禁了
  labels:
    #写法一,不知道为啥,使用写法一,idea提示飘红
    com.example.description: "Database volume"
    com.example.department: "IT/Ops"
    com.example.label-with-empty-value: ""
    #写法二
    - "com.example.description=Database volume"
    - "com.example.department=IT/Ops"
    - "com.example.label-with-empty-value"

#----------networks模块-----------------------
#网络配置。如果使用该网络,请在其服务下在增加networks的配置,即services.{service name}.networks
networks:
  #网络overlay
  overlay:
  #自定义网络custom_network_name
  custom_network_name:
  #自定义网络custom_network_name2
  custom_network_name2:
    ipam:
      #网卡
      driver: default
      config:
        #子网配置。官网上加引号了,但是在idea的检查中飘红,建议不要加引号
        - subnet: 172.16.238.0/24
        - subnet: 2001:3984:3989::/64

#----------configs模块-----------------------
#定义配置项。要想给服务授权访问权限,请使用services.wordpress.configs
configs:
  #my_config的值被设置为文件/my_config.txt的内容
  my_config:
    file: ./my_config.txt
    #自定义配置的名称。。
    name: my_config
    #`driver`和`driver_opts`:自定义秘密驱动程序的名称,以及特定于驱动程序的选项作为键/值对传递。在3.8版中引入的文件格式,仅在使用docker stack时支持。
    driver: foobar
    driver_opts:
      type: "nfs"
      o: "addr=10.40.0.199,nolock,soft,rw"
      device: ":/docker/example"
    #要使用的模板驱动程序的名称,它控制是否以及如何将秘密有效负载作为模板计算。如果没有设置驱动程序,则不使用模板。
    #目前支持的唯一驱动程序是golang,它使用golang。在3.8版中引入的文件格式,仅在使用docker stack时支持。
    #因为当前就一个值,可以不用配置
    template_driver: golang
  #my_other_config被定义为外部资源
  my_other_config:
    external: true
  #配置托管服务帐户的凭据规范。如果想给服务授予访问凭证
  my_credentials_spec:
    #配置gMSA服务的证书规格时,只需要使用config命令指定证书规格
    #等价于 services.wordpress.credential_spec.config
    file: ./my-credential-spec.json|

#----------secrets模块-----------------------
#配置访问密钥
#密钥存放在/run/secrets/<secret_name>下
secrets:
  #密钥my_secret 为文件/run/secrets/my_secret/my_secret.txt的内容
  my_secret:
    file: ./my_secret.txt
  #密钥my_other_secret 设为外部资源。
  #外部资源要么在docker上已经定义过,比如另一个docker-compose已经定义过改资源
  #要么通过 docker secret create 创建。
  #如果外部资源不存在,则机会报错!!!`secret not found`
  my_other_secret:
    external: true
    #[该语法需 version 3.4-]
    #修改外部secrets的名称
    name: redis_secret
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杀戮苍生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值