dockeri-compose yml常用配置指令
Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。 docker compose文件是一个yaml格式的文件,所以注意行首的缩进很严格,docker compose文件的格式很不同版本,版本不同,语法和格式有所不同 默认docker-compose命令会调用当前目录下的docker-compose.yml的文件,因此一般执行docker-compose命令前先进入docker-compose.yml文件所在目录 Compose 使用的三个步骤: 1.使用 Dockerfile 定义应用程序的环境。 2.使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。 3.执行 docker-compose up 命令来启动并运行整个应用程序。 https://zhuanlan.zhihu.com/p/387840381 https://blog.csdn.net/qq_37768368/article/details/120583141 ======================================================================================================= docker-compose.yml完整选项样式 version: "3.7" services: #部署的项目名称,容器名称如果没有定,此项会变成容器名并添加 _1. nginx_config_web: #镜像名称地址 image: docker.com/nginx:app1 #指定容器名称,由于容器名称是唯一的,如果指定自定义名称,则无法scale container_name: my-nginx-container #容器主机名 hostname: nginx-server #执行命令,覆盖默认命令 command: ["bundle", "exec", "thin", "-p", "3000"] #重启策略,默认no,always,no-failure,unless-stoped ,在 swarm 使用 restart_policy 代替 restart) restart: always #添加环境变量。您可以使用数组或字典、任何布尔值,布尔值需要用引号引起来,以确保 YML 解析器不会将其转换为 True 或 False。 environment: - TZ=Asia/Shanghai - SHOW: 'true' #暴露容器端口,与-p相同,但不能低于60,映射到宿主机。 ports: - 80:80 - 443:443 #暴露端口,但不映射到宿主机,只被连接的服务访问。与 Dockerfile 中的 EXPOSE 指令一样,用于指定暴露的端口,仅可以指定内部端口为参数:,实际上 docker-compose.yml 的端口映射还得 ports 这样的标签 expose: - "3000" - "8000” #设置容器DNS,可以是单个值或列表。 dns: 8.8.8.8 dns: - 8.8.8.8 - 9.9.9.9 #自定义 DNS 搜索域。可以是单个值或列表。 dns_search:dc1.example.com dns_search: - dc1.example.com - dc2.example.com #挂载宿主机路径或命令卷 volumes: - ./conf.d:/etc/nginx/conf.d - ./logs:/var/log/nginx - ./ssl:/ssl_certs #从其它容器或者服务挂载数据卷,可选的参数是:ro或 :rw,前者表示容器只读,后者表示容器对数据卷是可读可写的(默认情况为可读可写的)。 volumes_from: - service_name - service_name:ro - container:container_name - container:container_name:rw #设置依赖关系。 depends_on: - db - redis #服务的日志记录配置。 logging: driver: json-file options: max-size: "200k" max-file: "10" #用于检测 docker 服务是否健康运行。 healthcheck: disable: true test: ["CMD", "curl", "-f", "http://localhost"] # interval: 1m30s timeout: 10s retries: 3 start_period: 40s #添加或删除容器拥有的宿主机的内核功能,ALL # 开启或关闭全部权限 cap_add: - SYS_PTRACE cap_drop: - NET_ADMIN - SYS_PTRACE #sysctls设置容器中的内核参数,可以使用数组或字典格式。 sysctls: - net.core.somaxconn: 1024 - net.ipv4.tcp_syncookies: 0 #为容器指定父 cgroup 组,意味着将继承该组的资源限制。 cgroup_parent: m-executor-abcd #在 Dockerfile 中有一个指令叫做 ENTRYPOINT 指令,用于指定接入点。在 docker-compose.yml 中可以定义接入点,覆盖 Dockerfile 中的定义:单个值:(entrypoint: /code/entrypoint.sh) entrypoint: - php - -d - zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so #从文件添加环境变量。可以是单个值(env_file: .env)或列表的多个值。 env_file: - ./tomcat/config/env #指定设备映射列表。 devices: - "/dev/ttyUSB0:/dev/ttyUSB0" #链接到 docker-compose.yml 外部的容器,甚至 并非 Compose 项目文件管理的容器。参数格式跟 links 类似 #在使用Docker过程中,会有许多单独使用 docker run 启动的容器的情况,为了使 Compose 能够连接这些不在docker-compose.yml 配置文件中定义的容器,那么就需要一个特殊的标签,就是 external_links,它可以让Compose 项目里面的容器连接到那些项目配置外部的容器(前提是外部容器中必须至少有一个容器是连接到与项目内的服务的同一个网络里面)。 external_links: - redis_1 - project_db_1:mysql - project_db_1:postgresql 链接到其它服务的中的容器,可以指定服务名称也可以指定链接别名(SERVICE:ALIAS),与 Docker 客户端的 --link 有一样效果,会连接到其它服务中的容器,使用的别名将会自动在服务容器中的 /etc/hosts 里创建 links: - db:database - redis 添加主机名映射。类似 docker客户端中的 --add-host。以上会在此服务的内部容器中 /etc/hosts 创建一个具有 ip 地址和主机名的映射关系: extra_hosts: - “somehost:162.242.195.82” #网络模式,用法类似于 Docke 客户端的 --net 选项,格式为:service:[service name] #可以指定使用服务或者容器的网络 network_mode: “bridge” network_mode: “host” network_mode: “none” network_mode: “service:[service name]” network_mode: “container:[container name/id]” #存储敏感数据,例如密码: secrets - my_user_scerets #调用密码文件 #加入指定网络,下面定义的网络 networks: - front-tier - back-tier #定义的网络,与 services字段同级 如:nginx mysql 。 networks: front-tier: driver: bridge back-tier: driver: bridge #定义密码 ,与 services下的字段项目同级 secrets: my_secret: file: ./my_secret.txt ========================================================================================================== docker-compose.yml 配选项说明 一、build 服务除了可以基于指定的镜像,还可以基于一份 Dockerfile,在使用 up 启动之时执行构建任务,这个构建标签就是 build,它可以指定 Dockerfile 所在文件夹的路径。Compose 将会利用它自动构建这个镜像,然后使用这个镜像启动服务容器 例如 webapp 服务,指定为从上下文路径 ./dir/Dockerfile 所构建的镜像: version: "3.7" services: webapp: build: ./dir #可以使用绝对路径 或者,作为具有在上下文指定的路径的对象,以及可选的 Dockerfile 和 args: version: "3.7" services: webapp: build: context: ./dir dockerfile: Dockerfile-alternate args: buildno: 1 labels: - "com.example.description=Accounting webapp" - "com.example.department=Finance" - "com.example.label-with-empty-value" target: prod context:如果 context 中有指定的路径,并且可以选定 Dockerfile 和 args。那么 arg 这个标签,就像 Dockerfile 中的 ARG 指令,它可以在构建过程中指定环境变量, 但是在构建成功后取消,在 docker-compose.yml 文件中也支持这样的写法:。 dockerfile:指定构建镜像的 Dockerfile 文件名。 args:添加构建参数,这是只能在构建过程中访问的环境变量。 labels:设置构建镜像的标签。 target:多层构建,可以指定构建哪一层。 cache_from:缓存解析镜像列表 labels: 设置构建镜像的元数据 network: 设置网络容器连接,none 表示在构建期间禁用网络 shm_size: 设置/dev/shm此构建容器的分区大小 二、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 之前停止。 注意:web 服务不会等待 redis db 完全启动 之后才启动。 version: "3.7" services: web: build: . depends_on: - db - redis redis: image: redis db: image: postgres 三、deploy指定与服务的部署和运行有关的配置。只在 swarm 模式下才会有用。 deploy # v3 版本以上, 指定与部署和运行服务相关的配置, deploy 部分是 docker stack 使用的, docker stack 依赖 docker swarm endpoint_mode # v3.3 版本中新增的功能, 指定服务暴露的方式 vip # Docker 为该服务分配了一个虚拟 IP(VIP), 作为客户端的访问服务的地址 dnsrr # DNS轮询, Docker 为该服务设置 DNS 条目, 使得服务名称的 DNS 查询返回一个 IP 地址列表, 客户端直接访问其中的一个地址 labels # 指定服务的标签,这些标签仅在服务上设置 mode # 指定 deploy 的模式 global # 每个集群节点都只有一个容器 replicated # 用户可以指定集群中容器的数量(默认) placement # 指定约束和首选项的位置 replicas # deploy 的 mode 为 replicated 时, 指定容器副本的数量 resources # 资源限制 limits # 设置容器的资源限制 cpus: "0.5" # 设置该容器最多只能使用 50% 的 CPU memory: 50M # 设置该容器最多只能使用 50M 的内存空间 reservations # 设置为容器预留的系统资源(随时可用) cpus: "0.2" # 为该容器保留 20% 的 CPU memory: 20M # 为该容器保留 20M 的内存空间 restart_policy # 定义容器重启策略, 用于代替 restart 参数 condition # 定义容器重启策略(接受三个参数) none # 不尝试重启 on-failure # 只有当容器内部应用程序出现问题才会重启 any # 无论如何都会尝试重启(默认) delay # 尝试重启的间隔时间(默认为 0s) max_attempts # 尝试重启次数(默认一直尝试重启) window # 检查重启是否成功之前的等待时间(即如果容器启动了, 隔多少秒之后去检测容器是否正常, 默认 0s) update_config # 用于配置滚动更新配置 parallelism # 一次性更新的容器数量 delay # 更新一组容器之间的间隔时间 failure_action # 定义更新失败的策略 continue # 继续更新 rollback # 回滚更新 pause # 暂停更新(默认) monitor # 每次更新后的持续时间以监视更新是否失败(单位: ns|us|ms|s|m|h) (默认为0) max_failure_ratio # 回滚期间容忍的失败率(默认值为0) order # v3.4 版本中新增的参数, 回滚期间的操作顺序 stop-first #旧任务在启动新任务之前停止(默认) start-first #首先启动新任务, 并且正在运行的任务暂时重叠 rollback_config # v3.7 版本中新增的参数, 用于定义在 update_config 更新失败的回滚策略 parallelism # 一次回滚的容器数, 如果设置为0, 则所有容器同时回滚 delay # 每个组回滚之间的时间间隔(默认为0) failure_action # 定义回滚失败的策略 continue # 继续回滚 pause # 暂停回滚 monitor # 每次回滚任务后的持续时间以监视失败(单位: ns|us|ms|s|m|h) (默认为0) max_failure_ratio # 回滚期间容忍的失败率(默认值0) order # 回滚期间的操作顺序 stop-first # 旧任务在启动新任务之前停止(默认) start-first # 首先启动新任务, 并且正在运行的任务暂时重叠 可以选参数: endpoint_mode:访问集群服务的方式。 endpoint_mode: vip Docker 集群服务一个对外的虚拟 ip。所有的请求都会通过这个虚拟 ip 到达集群服务内部的机器。 endpoint_mode: dnsrr DNS 轮询(DNSRR)。所有的请求会自动轮询获取到集群 ip 列表中的一个 ip 地址。 labels:在服务上设置标签。可以用容器上的 labels(跟 deploy 同级的配置) 覆盖 deploy 下的 labels。 mode:指定服务提供的模式。 replicated:复制服务,复制指定服务到集群的机器上。 global: 全局服务,服务将部署至集群的每个节点。 replicas:mode 为 replicated 时,需要使用此参数配置具体运行的节点数量。 resources:配置服务器资源使用的限制,例如上例子,配置 redis 集群运行需要的 cpu 的百分比 和 内存的占用。避免占用资源过高出现异常。 restart_policy:配置如何在退出容器时重新启动容器。 condition:可选 none,on-failure 或者 any(默认值:any)。 delay:设置多久之后重启(默认值:0)。 max_attempts:尝试重新启动容器的次数,超出次数,则不再尝试(默认值:一直重试)。 window:设置容器重启超时时间(默认值:0)。 rollback_config:配置在更新失败的情况下应如何回滚服务。 parallelism:一次要回滚的容器数。如果设置为0,则所有容器将同时回滚。 delay:每个容器组回滚之间等待的时间(默认为0s)。 failure_action:如果回滚失败,该怎么办。其中一个 continue 或者 pause(默认pause)。 monitor:每个容器更新后,持续观察是否失败了的时间 (ns|us|ms|s|m|h)(默认为0s)。 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)(默认为0s)。 max_failure_ratio:在更新过程中可以容忍的故障率。 order:回滚期间的操作顺序。其中一个 stop-first(串行回滚),或者 start-first(并行回滚)(默认stop-first)。 注:仅支持 V3.4 及更高版本。 四、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 五、restart 定义容器重启策略(在使用 swarm 部署时将忽略该选项, 在 swarm 使用 restart_policy 代替 restart) no: 是默认的重启策略,在任何情况下都不会重启容器。 always: 容器总是重新启动。 on-failure: 在容器非正常退出时(退出状态非0),才会重启容器。 unless-stopped:在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器 注:swarm 集群模式,请改用 restart_policy。 六、ports暴露端口。 1.简短语法共有三种写法: 指定两个端口 ( 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" 2.长语法 target: 容器内的端口 published: 公开的端口 protocol:端口协议(tcp或udp) mode:host用于在每个节点上发布主机端口,或ingress用于负载平衡的群模式端口。 ports: - target: 80 published: 8080 protocol: tcp mode: host 七、healthcheck用于检测 docker 服务是否健康运行。 healthcheck: test: ["CMD", "curl", "-f", "http://localhost"] # 设置检测程序 interval: 1m30s # 设置检测间隔 timeout: 10s # 设置检测超时时间 retries: 3 # 设置重试次数 start_period: 40s # 启动后,多少秒开始启动检测程序 八、logging服务的日志记录配置。 driver:指定服务容器的日志记录驱动程序,默认值为json-file。有以下三个选项 "json-file" "syslog" "none" 1.仅在 json-file 驱动程序下,可以使用以下参数,限制日志得数量和大小。当达到文件限制上限,会自动删除旧得文件。 logging: driver: json-file options: max-size: "200k" # 单个文件大小为200k max-file: "10" # 最多10个文件 2.syslog 驱动程序下,可以使用 syslog-address 指定日志接收地址。 logging: driver: syslog options: syslog-address: "tcp://192.168.0.42:123" 九、networks配置容器连接的网络,引用顶级 networks 下的条目 。 networks # 定义 networks 信息 driver # 指定网络模式, 大多数情况下, 它 bridge 于单个主机和 overlay Swarm 上 bridge # Docker 默认使用 bridge 连接单个主机上的网络 overlay # overlay 驱动程序创建一个跨多个节点命名的网络群 host # 共享主机网络名称空间(等同于 docker run --net=host) none # 等同于 docker run --net=none driver_opts # v3.2以上版本, 传递给驱动程序的参数, 这些参数取决于驱动程序 attachable # driver 为 overlay 时使用, 如果设置为 true 则除了服务之外,独立容器也可以附加到该网络; 如果独立容器连接到该网络,则它可以与其他 Docker 守护进程连接到的该网络的服务和独立容器进行通信 ipam # 自定义 IPAM 配置. 这是一个具有多个属性的对象, 每个属性都是可选的 driver # IPAM 驱动程序, bridge 或者 default config # 配置项 subnet # CIDR格式的子网,表示该网络的网段 external # 外部网络, 如果设置为 true 则 docker-compose up 不会尝试创建它, 如果它不存在则引发错误 name # v3.5 以上版本, 为此网络设置名称 aliases :同一网络上的其他容器可以使用服务名称或此别名来连接到对应容器的服务。 默认情况下,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,会发生以下情况: 创建了一个名为 myapp_default 的网络。 把web加入网络。 把db加入网络。 上面例子还有一个注意点就是端口号,注意区分HOST_PORT和CONTAINER_PORT,以上面的db为例: 我们可以通过设置一级配置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: # 使用具有特殊选项的自定义驱动程序 driver: custom-driver-2 driver_opts: foo: "1" bar: "2" 一级配置networks 创建了自定义的网络 。这里配置了两个frontend和backend ,且自定义了网络类型。 每一个services下,proxy , app , db都定义了networks配置。 proxy 只加入到 frontend网络。 db 只加入到backend网络。 app同时加入到 frontend和backend 。 db和proxy不能通讯,因为不在一个网络中。 app和两个都能通讯,因为app在两个网络中都有配置。 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 #IP地址 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代表跨多个节点的网络群 driver: 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 十、secrets 存储敏感数据,例如密码: 1.SHORT 语法 version: "3.1" services: mysql: image: mysql environment: MYSQL_ROOT_PASSWORD_FILE: /run/secrets/my_secret secrets: - my_secret #调用secrets中的my_secret secrets: #跟mysql项目同级 my_secret: file: ./my_secret.txt 2.LONG 语法可以添加其他选项 source:secret 名称 target:在服务任务容器中需要装载在 /run/secrets/ 中的文件名称,如果 source 未定义,那么默认为此值 uid&gid:在服务的任务容器中拥有该文件的 UID 或 GID 。如果未指定,两者都默认为 0。 mode:以八进制表示法将文件装载到服务的任务容器中 /run/secrets/ 的权限。例如,0444 代表可读。 version: “3.1” 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 一级secrets详细配置: file:使用指定路径中的文件内容创建机密。 external:如果设置为 true,则指定此机密已创建。Docker 不会尝试创建它,如果它不存在, 会报错secret not found。 name:Docker 中秘密对象的名称。此字段可用于引用包含特殊字符的机密。 template_driver:要使用的模板驱动程序的名称,它控制是否以及如何将机密负载评估为模板。如果未设置驱动程序,则不使用模板。当前支持的唯一驱动程序是golang,它使用golang。 在本示例中,my_first_secret在<stack_name>_my_first_secret 部署堆栈时创建 ,并且my_second_secret已存在于 Docker 中。 secrets: my_first_secret: file: ./secret_data my_second_secret: external: true 十一、security_opt修改容器默认的 schema 标签。 security-opt: - label:user:USER # 设置容器的用户标签 - label:role:ROLE # 设置容器的角色标签 - label:type:TYPE # 设置容器的安全策略标签 - label:level:LEVEL # 设置容器的安全等级标签 十二、stop_grace_period指定在容器无法处理 SIGTERM (或者任何 stop_signal 的信号),等待多久后发送 SIGKILL 信号关闭容器。默认的等待时间是 10 秒。 stop_grace_period: 1s # 等待 1 秒 stop_grace_period: 1m30s # 等待 1 分 30 秒 十三、stop_signal 设置停止容器的替代信号。默认情况下使用 SIGTERM 。 stop_signal: SIGUSR1 十四、tmpfs 在容器内安装一个临时文件系统。可以是单个值或列表的多个值。 tmpfs: /run tmpfs: - /run - /tmp 十五、ulimits覆盖容器默认的 ulimit。 ulimits: nproc: 65535 nofile: soft: 20000 hard: 40000 十六、volumes将主机的数据卷或着文件挂载到容器里。 SHORT 语法格式示例 version: "3.7" services: db: image: postgres:latest volumes: - /var/lib/mysql # 映射容器内的 /var/lib/mysql 到宿主机的一个随机目录中 - /opt/data:/var/lib/mysql # 映射容器内的 /var/lib/mysql 到宿主机的 /opt/data - ./cache:/tmp/cache # 映射容器内的 /var/lib/mysql 到宿主机 compose 文件所在的位置 - ~/configs:/etc/configs/:ro # 映射容器宿主机的目录到容器中去, 权限只读 - datavolume:/var/lib/mysql # datavolume 为 volumes 顶级键定义的目录, 在此处直接调用 LONG 语法格式示例:(v3.2 新增的语法格式) version: "3.2" services: web: image: nginx:alpine ports: - "80:80" volumes: - type: volume # mount 的类型, 必须是 bind、volume 或 tmpfs source: mydata # 宿主机目录 target: /data # 容器目录 volume: # 配置额外的选项, 其 key 必须和 type 的值相同 nocopy: true # volume 额外的选项, 在创建卷时禁用从容器复制数据 - type: bind # volume 模式只指定容器路径即可, 宿主机路径随机生成; bind 需要指定容器和数据机的映射路径 source: ./static target: /opt/app/static read_only: true # 设置文件系统为只读文件系统 volumes: mydata: # 定义在 volume, 可在所有服务中调用 十七、configs使用服务 configs 配置为每个服务赋予相应的访问权限,支持两种不同的语法。 Note: 配置必须存在或在 configs 此堆栈文件的顶层中定义,否则堆栈部署失效 1.SHORT 语法 SHORT 语法只能指定配置名称,这允许容器访问配置并将其安装在 /<config_name> 容器内,源名称和目标装入点都设为配置名称。 以上实例使用 SHORT 语法将 redis 服务访问授予 my_config 和 my_other_config ,并被 my_other_config 定义为外部资源,这意味着它已经在 Docker 中定义。可以通过 docker config create 命令或通过另一个堆栈部署。如果外部部署配置都不存在,则堆栈部署会失败并出现 config not found 错误。 Note: config 定义仅在 3.3 版本或在更高版本的撰写文件格式中受支持,YAML 的布尔值(true, false, yes, no, on, off)必须要使用引号引起来(单引号、双引号均可),否则会当成字符串解析。 #以下示例授予redis服务访问my_config和my_other_configconfigs 的权限。 version: “3.3” 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 2.LONG 语法 LONG 语法提供了创建服务配置的更加详细的信息 source:Docker 中存在的配置的名称 target:要在服务的任务中装载的文件的路径或名称。如果未指定则默认为 / uid 和 gid:在服务的任务容器中拥有安装的配置文件的数字 UID 或 GID。如果未指定,则默认为在Linux上。Windows不支持。 mode:在服务的任务容器中安装的文件的权限,以八进制表示法。例如,0444 代表文件可读的。默认是 0444。如果配置文件无法写入,是因为它们安装在临时文件系统中,所以如果设置了可写位,它将被忽略。可执行位可以设置。如果您不熟悉 UNIX 文件权限模式,Unix Permissions Calculator 下面示例在容器中将 my_config 名称设置为 redis_config,将模式设置为 0440(group-readable)并将用户和组设置为 103。该 `redis 服务无法访问 my_other_config 配置。 version: “3.3” 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 可以同时授予多个配置的服务相应的访问权限,也可以混合使用 LONG 和 SHORT 语法。定义配置并不意味着授予服务访问权限 一级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 十八、pid将 PID 模式设置为主机 PID 模式。这会在容器和主机操作系统之间共享 PID 地址空间。使用此标志启动的容器可以访问和操作裸机命名空间中的其他容器,反之亦然。 pid: "host"