docker-compose編排參數詳解


一、前言

Compose是一個用於定義和運行多容器Docker應用程序的工具。使用Compose,您可以使用YAML文件來配置應用程序的服務。然后,使用單個命令,您可以從配置中創建並啟動所有服務。

Compose可以.yml 或 .yaml 作為文件擴展名。

Compose適用於所有環境:生產,登台,開發,測試以及CI工作流程。

關於 docker compose 技術可以查看官方文檔 Docker Compose

 

以下的內容是確立在已經下載好 Docker 以及 Docker Compose,可參看 Docker Compose 的官方安裝教程 Install Docker Compose

二、Docker Compose 配置文件的構建參數說明

2.1 build

服務除了可以基於指定的鏡像,還可以基於一份 Dockerfile,在使用 up 啟動之時執行構建任務,這個構建標簽就是 build,它可以指定 Dockerfile 所在文件夾的路徑。Compose 將會利用它自動構建這個鏡像,然后使用這個鏡像啟動服務容器。

build 可以指定為包含構建上下文路徑的字符串:

version:"3.7"

services:

  webapp:

    build:./dir

或者,作為具有在上下文中指定的路徑的對象以及可選的Dockerfile和args:

version:"3.7"

services:

  webapp:

    build:

      context:./dir

      dockerfile:Dockerfile-alternate

      args:

        buildno:1

如果您指定image以及build,則使用以下指定的webapp和可選項對構建的圖像進行命名:

這會在./dir目錄下生成一個名為webapp和標記的圖像tag。

build:./dir

image:webapp:tag

注意:當用(Version 3) Compose 文件在群集模式下部署堆棧時,該選項被忽略。因為 docker stack 命令只接受預先構建的鏡像。

2.2 context

context 選項可以是 Dockerfile 的文件路徑,也可以是到鏈接到 git 倉庫的 url。

當提供的值是相對路徑時,它被解析為相對於撰寫文件的路徑,此目錄也是發送到 Docker 守護進程的 context。

build:

  context:./dir

2.3 dockerfile

使用此 dockerfile 文件來構建,必須指定構建路徑。

build:

  context:.

  dockerfile:Dockerfile-alternate

2.4 args

添加構建參數,這些參數是僅在構建過程中可訪問的環境變量。

首先,在Dockerfile中指定參數:

ARG buildno

ARG gitcommithash

 

RUN echo "Build number: $buildno"

RUN echo "Based on commit: $gitcommithash"

然后在build鍵下指定參數,可以傳遞映射或列表:

build:

  context:.

  args:

    buildno:1

    gitcommithash:cdc3b19

build:

  context:.

  args:

    -buildno=1

    -gitcommithash=cdc3b19

注意:在Dockerfile中,如果ARG在FROM指令之前指定, ARG則在構建說明中不可用FROM。如果您需要在兩個位置都可以使用參數,請在FROM指令下指定它。

您可以在指定構建參數時省略該值,在這種情況下,它在構建時的值是運行Compose的環境中的值。

args:

  -buildno

  -gitcommithash

注意:YAML布爾值(true,false,yes,no,on,off)必須用引號括起來,這樣分析器會將它們解釋為字符串。

2.5 cache_from

編寫緩存解析鏡像列表,此選項是v3.2中的新選項。

build:

  context:.

  cache_from:

    -alpine:latest

    -corp/web_app:3.14

2.6 labels

使用 Docker標簽 將元數據添加到生成的鏡像中,可以使用數組或字典。

建議使用反向 DNS 標記來防止簽名與其他軟件所使用的簽名沖突,此選項是v3.3中的新選項。

build:

  context:.

  labels:

    com.example.description:"Accountingwebapp"

    com.example.department:"Finance"

    com.example.label-with-empty-value:""

build:

  context:.

  labels:

    -"com.example.description=Accountingwebapp"

    -"com.example.department=Finance"

    -"com.example.label-with-empty-value"

2.7 shm_size

設置容器 /dev/shm 分區的大小,值為表示字節的整數值或表示字符的字符串

build:

  context:.

  shm_size:'2gb'

build:

  context:.

  shm_size:10000000

2.8 target

根據對應的 Dockerfile 構建指定 Stage

build:

  context:.

  target:prod

2.9 cap_add,cap_drop

添加或刪除容器功能,可查看 man 7 capabilities

cap_add:

  -ALL

 

cap_drop:

  -NET_ADMIN

  -SYS_ADMIN

注意:當用(Version 3) Compose 文件在群集模式下部署堆棧時,該選項被忽略。因為 docker stack 命令只接受預先構建的鏡像

2.10 cgroup_parent

可以為容器選擇一個可選的父 cgroup_parent

cgroup_parent:m-executor-abcd

注意:當 使用(Version 3)Compose 文件在群集模式下部署堆棧時,忽略此選項

2.11. command

覆蓋容器啟動后默認執行的命令

command:bundle exec thin -p 3000

該命令也可以是一個列表,方式類似於dockerfile:

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

2.12. configs

使用服務 configs 配置為每個服務賦予相應的訪問權限,支持兩種不同的語法

Note: 配置必須存在或在 configs 此堆棧文件的頂層中定義,否則堆棧部署失效

2.12.1 SHORT 語法

SHORT 語法只能指定配置名稱,這允許容器訪問配置並將其安裝在 /<config_name> 容器內,源名稱和目標裝入點都設為配置名稱。

version:"3.7"

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

以上實例使用 SHORT 語法將 redis 服務訪問授予 my_config 和 my_other_config ,並被 my_other_config 定義為外部資源,這意味着它已經在 Docker 中定義。可以通過 docker config create 命令或通過另一個堆棧部署。如果外部部署配置都不存在,則堆棧部署會失敗並出現 config not found 錯誤。

注意: config 定義僅在 3.3 版本或在更高版本的撰寫文件格式中受支持,YAML 的布爾值(true, false, yes, no, on, off)必須要使用引號引起來(單引號、雙引號均可),否則會當成字符串解析。

2.12.2 LONG 語法

LONG 語法提供了創建服務配置的更加詳細的信息。

source:Docker 中存在的配置的名稱

target:要在服務的任務中裝載的文件的路徑或名稱。如果未指定則默認為 /<source> 

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.7"

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 語法。定義配置並不意味着授予服務訪問權限。

2.13 container_name

為自定義的容器指定一個名稱,而不是使用默認的名稱

container_name:my-web-container

由於Docker容器名稱必須是唯一的,因此如果指定了自定義名稱,則無法將服務擴展到1個容器之外。試圖這樣做會導致錯誤。

注意: 使用(版本3)Compose文件在群集模式下部署堆棧時,將忽略此選項 。

2.14 credential_spec

注意:此選項已在v3.3中添加。在Compose版本3.8中支持使用具有撰寫文件的組托管服務帳戶(GMSA)配置。

配置托管服務帳戶的憑據規范。此選項僅用於使用Windows容器的服務。

使用 file時: 應該注意引用的文件必須存在於CredentialSpecs,docker 數據目錄的子目錄中。在 Windows 上,該目錄默認為 C:\ProgramData\Docker\。以下示例從名為C:\ProgramData\Docker\CredentialSpecs\my-credential-spec.json 的文件加載憑證規范 :

credential_spec:

  file:my-credential-spec.json

使用 registry: 將從守護進程主機上的 Windows 注冊表中讀取憑據規范。其注冊表值必須位於:

HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Virtualization\Containers\CredentialSpecs

下面的示例通過 my-credential-spec 注冊表中指定的值加載憑證規范:

credential_spec:

  registry:my-credential-spec

示例GMSA配置

為服務配置GMSA憑據規范時,只需指定憑據規范config,如以下示例所示:

version: "3.8"
services:
  myservice:
    image: myimage:latest
    credential_spec:
      config: my_credential_spec
 
configs:
  my_credentials_spec:
    file: ./my-credential-spec.json|

2.15 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.7"

services:

  web:

    build:.

    depends_on:

      -db

      -redis

  redis:

    image:redis

  db:

    image:postgres

使用時需要注意以下幾點depends_on:

depends_on不會在啟動web之前等待db和redis“就緒”

版本3不再支持condition形式depends_on。

使用版本3 Compose文件在swarm模式下部署堆棧depends_on時,將忽略該選項 。

2.16 deploy

指定與部署和運行服務相關的配置。

version:"3.7"

services:

  redis:

    image:redis:alpine

    deploy:

      replicas:6

      update_config:

        parallelism:2

        delay:10s

      restart_policy:

        condition:on-failure

有幾個子選項可供選擇:

2.16.1 endpoint_mode

endpoint_mode:指定連接到群組外部客戶端服務發現方法

endpoint_mode:vip :Docker 為該服務分配了一個虛擬 IP(VIP),作為客戶端的  “前端“ 部位用於訪問網絡上的服務。

endpoint_mode: dnsrr : DNS輪詢(DNSRR)服務發現不使用單個虛擬 IP。Docker為服務設置 DNS 條目,使得服務名稱的 DNS 查詢返回一個 IP 地址列表,並且客戶端直接連接到其中的一個。如果想使用自己的負載平衡器,或者混合 Windows 和 Linux 應用程序,則 DNS 輪詢調度(round-robin)功能就非常實用。

version:"3.7"

 

services:

  wordpress:

    image:wordpress

    ports:

      -"8080:80"

    networks:

      -overlay

    deploy:

      mode:replicated

      replicas:2

      endpoint_mode:vip

 

  mysql:

    image:mysql

    volumes:

       -db-data:/var/lib/mysql/data

    networks:

       -overlay

    deploy:

      mode:replicated

      replicas:2

      endpoint_mode:dnsrr

 

volumes:

  db-data:

 

networks:

  overlay:

2.16.2 labels

指定服務的標簽,這些標簽僅在服務上設置

version:"3.7"

services:

  web:

    image:web

    deploy:

      labels:

        com.example.description:"Thislabelwillappearonthewebservice"

通過將 deploy 外面的 labels 標簽來設置容器上的 labels

version:"3.7"

services:

  web:

    image:web

    labels:

      com.example.description:"Thislabelwillappearonallcontainersforthewebservice"

2.16.3 mode

global:每個集節點只有一個容器

replicated:指定容器數量(默認)

version:"3.7"

services:

  worker:

    image:dockersamples/examplevotingapp_worker

    deploy:

      mode:global

2.16.4 placement

指定 constraints 和 preferences 

version:"3.7"

services:

  db:

    image:postgres

    deploy:

      placement:

        constraints:

          -node.role == manager

          -engine.labels.operatingsystem == ubuntu 14.04

        preferences:

          -spread:node.labels.zone

2.16.5 replicas

如果服務是 replicated(默認),需要指定運行的容器數量

version:"3.7"

services:

  worker:

    image:dockersamples/examplevotingapp_worker

    networks:

      -frontend

      -backend

    deploy:

      mode:replicated

      replicas:6

2.16.6  resources

配置資源限制

version:"3.7"

services:

  redis:

    image:redis:alpine

    deploy:

      resources:

        limits:

          cpus:'0.50'

          memory:50M

        reservations:

          cpus:'0.25'

          memory:20M

此例子中,redis 服務限制使用不超過 50M 的內存和 0.50(50%)可用處理時間(CPU),並且保留 20M 了內存和 0.25 CPU時間。

2.16.7 restart_policy

配置容器的重新啟動,代替 restart

condition:值可以為 none 、on-failure 以及 any(默認)

delay:嘗試重啟的等待時間,默認為 0

max_attempts:在放棄之前嘗試重新啟動容器次數(默認:從不放棄)。如果重新啟動在配置中沒有成功 window,則此嘗試不計入配置max_attempts 值。例如,如果 max_attempts 值為 2,並且第一次嘗試重新啟動失敗,則可能會嘗試重新啟動兩次以上。

windows:在決定重新啟動是否成功之前的等時間,指定為持續時間(默認值:立即決定)。

version:"3.7"

services:

  redis:

    image:redis:alpine

    deploy:

      restart_policy:

        condition:on-failure

        delay:5s

        max_attempts:3

        window:120s

2.16.8 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)。

2.16.9 update_config

配置更新服務,用於無縫更新應用(rolling update)

parallelism:一次性更新的容器數量

delay:更新一組容器之間的等待時間。

failure_action:如果更新失敗,可以執行的的是 continue、rollback 或 pause (默認)

monitor:每次任務更新后監視失敗的時間(ns|us|ms|s|m|h)(默認為0)

max_failure_ratio:在更新期間能接受的失敗率

order:更新次序設置,top-first(舊的任務在開始新任務之前停止)、start-first(新的任務首先啟動,並且正在運行的任務短暫重疊)(默認 stop-first)

version:"3.7"

services:

  vote:

    image:dockersamples/examplevotingapp_vote:before

    depends_on:

      -redis

    deploy:

      replicas:2

      update_config:

        parallelism:2

        delay:10s

        order:stop-first

不支持 Docker stack desploy 的幾個子選項 

build、cgroup_parent、container_name、devices、tmpfs、external_links、inks、network_mode、restart、security_opt、stop_signal、sysctls、userns_mode

2.17 devices

設置映射列表,與 Docker 客戶端的 --device 參數類似

devices:

  -"/dev/ttyUSB0:/dev/ttyUSB0"

2.18 dns

自定義 DNS 服務器,與 --dns 具有一樣的用途,可以是單個值或列表

dns:8.8.8.8

dns:

  -8.8.8.8

  -9.9.9.9

2.19 dns_search

自定義 DNS 搜索域,可以是單個值或列表

dns_search:example.com

dns_search:

  -dc1.example.com

  -dc2.example.com

2.20 entrypoint

在 Dockerfile 中有一個指令叫做 ENTRYPOINT 指令,用於指定接入點。在 docker-compose.yml 中可以定義接入點,覆蓋 Dockerfile 中的定義

entrypoint:/code/entrypoint.sh

入口點也可以是一個列表,方式類似於 dckerfile:

entrypoint:

    -php

    --d

    -zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so

    --d

    -memory_limit=-1

    -vendor/bin/phpunit

2.21 env_file

從文件中添加環境變量。可以是單個值或是列表 

如果已經用 docker-compose -f FILE 指定了 Compose 文件,那么 env_file 路徑值為相對於該文件所在的目錄

但 environment 環境中的設置的變量會會覆蓋這些值,無論這些值未定義還是為 None

env_file:.env

env_file:

  -./common.env

  -./apps/web.env

  -/opt/secrets.env

環境配置文件 env_file 中的聲明每行都是以 VAR=VAL 格式,其中以 # 開頭的被解析為注釋而被忽略,注意環境變量配置列表的順序,例如下面例子

services:

  some-service:

    env_file:

      -a.env

      -b.env

a.env 文件

# a.env

VAR=1

b.env文件

# b.env

VAR=hello

對於在文件a.env 中指定的相同變量但在文件 b.env 中分配了不同的值,如果 b.env 像下面列在 a.env 之后,則剛在 a.env 設置的值被 b.env 相同變量的值覆蓋,此時 $VAR 值為 hello。此外,這里所說的環境變量是對宿主機的 Compose 而言的,如果在配置文件中有 build 操作,這些變量並不會進入構建過程中,如果要在構建中使用變量還是首選 arg 標簽。

2.22 environment

添加環境變量,可以使用數組或字典。與上面的 env_file 選項完全不同,反而和 arg 有幾分類似,這個標簽的作用是設置鏡像變量,它可以保存變量到鏡像里面,也就是說啟動的容器也會包含這些變量設置,這是與 arg 最大的不同。 

一般 arg 標簽的變量僅用在構建過程中。而 environment 和 Dockerfile 中的 ENV 指令一樣會把變量一直保存在鏡像、容器中,類似 docker run -e 的效果。

environment:

  RACK_ENV:development

  SHOW:'true'

  SESSION_SECRET:

environment:

  -RACK_ENV=development

  -SHOW=true

  -SESSION_SECRET

2.23 expose

暴露端口,但不映射到宿主機,只被連接的服務訪問。這個標簽與 Dockerfile 中的 EXPOSE 指令一樣,用於指定暴露的端口,但是只是作為一種參考,實際上 docker-compose.yml 的端口映射還得 ports 這樣的標簽

expose:

 -"3000"

 -"8000"

2.24 external_links

鏈接到 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

2.25 extra_hosts

添加主機名的標簽,就是往 /etc/hosts 文件中添加一些記錄,與 Docker 客戶端中的 --add-host 類似。

extra_hosts:

 -"somehost:162.242.195.82"

 -"otherhost:50.31.209.229"

在/etc/hosts此服務的內部容器中創建具有ip地址和主機名的條目,例如:

162.242.195.82  somehost

50.31.209.229   otherhost

2.26 healthcheck

用於檢查測試服務使用的容器是否正常­

healthcheck:

  test:["CMD","curl","-f","http://localhost"]

  interval:1m30s

  timeout:10s

  retries:3

  start_period:40s

interval,timeout 以及 start_period 都定為持續時間

test 必須是字符串或列表,如果它是一個列表,第一項必須是 NONE,CMD 或 CMD-SHELL ;如果它是一個字符串,則相當於指定CMD-SHELL 后跟該字符串。

# Hit the local web app

test:["CMD","curl","-f","http://localhost"]

如上所述,但包裹在內/bin/sh。以下兩種形式都是等同的。

test:["CMD-SHELL","curl-fhttp://localhost||exit1"]

test:curl -f https://localhost || exit 1

果需要禁用鏡像的所有檢查項目,可以使用 disable:true,相當於 test:["NONE"]

healthcheck:

  disable:true

2.27 image

從指定的鏡像中啟動容器,可以是存儲倉庫、標簽以及鏡像 ID。

如果鏡像不存在,Compose 會自動拉去鏡像。

image: redis

image: ubuntu:14.04

image: tutum/influxdb

image: example-registry.com:4000/postgresql

image: a4bc65fd

2.28 init

在容器內運行init,轉發信號並重新獲得進程。將此選項設置true是為服務啟用此功能。

version:"3.7"

services:

  web:

    image:alpine:latest

    init:true

2.29  isolation

指定容器的隔離技術。在Linux上,唯一支持的值是default。在Windows中,可接受的值是default,process和 hyperv。

2.30 links

鏈接到其它服務的中的容器,可以指定服務名稱也可以指定鏈接別名(SERVICE:ALIAS),與 Docker 客戶端的 --link 有一樣效果,會連接到其它服務中的容器。

web:

  links:

   -db

   -db:database

   -redis

2.31 logging

配置日志服務

logging:

  driver:syslog

  options:

    syslog-address:"tcp://192.168.0.42:123"

該 driver值是指定服務器的日志記錄驅動程序,默認值為 json-file,與 --log-diver 選項一樣 

driver: "json-file"

driver: "syslog"

driver: "none"

注意:只有驅動程序 json-file 和 journald 驅動程序可以直接從 docker-compose up 和 docker-compose logs 獲取日志。使用任何其他方式不會顯示任何日志。

對於可選值,可以使用 options 指定日志記錄中的日志記錄選項

driver:"syslog"

options:

  syslog-address:"tcp://192.168.0.42:123"

默認驅動程序 json-file  具有限制存儲日志量的選項,所以,使用鍵值對來獲得最大存儲大小以及最小存儲數量

driver: "json-file"

options:

  max-size:"200k"

  max-file:"10"

上面實例將存儲日志文件,直到它們達到max-size:200kB,存儲的單個日志文件的數量由該 max-file 值指定。隨着日志增長超出最大限制,舊日志文件將被刪除以存儲新日志

docker-compose.yml 限制日志存儲的示例

version:"3.7"

services:

  some-service:

    image:some-service

    logging:

      driver:"json-file"

      options:

        max-size:"200k"

        max-file:"10"

2.32 network_mode

網絡模式,用法類似於 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]"

2.33 networks

加入指定網絡

services:

  some-service:

    networks:

     -some-network

     -other-network

2.34 aliases

同一網絡上的其他容器可以使用服務器名稱或別名來連接到其他服務的容器,相同的服務可以在不同的網絡有不同的別名。

services:

  some-service:

    networks:

      some-network:

        aliases:

         -alias1

         -alias3

      other-network:

        aliases:

         -alias2

下面實例中,提供 web 、worker以及db 服務,伴隨着兩個網絡 new 和 legacy 。

version:"3.7"

 

services:

  web:

    image:"nginx:alpine"

    networks:

      -new

 

  worker:

    image:"my-worker-image:latest"

    networks:

      -legacy

 

  db:

    image:mysql

    networks:

      new:

        aliases:

          -database

      legacy:

        aliases:

          -mysql

 

networks:

  new:

  legacy:

2.35 ipv4_address、ipv6_address

為服務的容器指定一個靜態 IP 地址

version:"3.7"

 

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"

2.36 pid

將 PID 模式設置為主機 PID 模式,可以打開容器與主機操作系統之間的共享 PID 地址空間。使用此標志啟動的容器可以訪問和操作宿主機的其他容器,反之亦然

pid: "host"

2.37 ports

映射端口

2.37.1 SHORT 語法

可以使用 HOST:CONTAINER 的方式指定端口,也可以指定容器端口(選擇臨時主機端口),宿主機會隨機映射端口

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"

 -"6060:6060/udp"

注意:當使用 HOST:CONTAINER 格式來映射端口時,如果使用的容器端口小於60可能會得到錯誤得結果,因為YAML 將會解析 xx:yy 這種數字格式為 60 進制,所以建議采用字符串格式。

2.37.2 LONG 語法

LONG 語法支持 SHORT 語法不支持的附加字段

target:容器內的端口

published:公開的端口

protocol:  端口協議(tcp 或 udp)

mode:通過host 用在每個節點還是哪個發布的主機端口或使用 ingress 用於集群模式端口進行平衡負載

ports:

  -target:80

    published:8080

    protocol:tcp

    mode:host

2.38 restart

默認值為 no ,即在任何情況下都不會重新啟動容器;當值為 always 時,容器總是重新啟動;當值為 on-failure 時,當出現 on-failure 報錯容器退出時,容器重新啟動。

restart: "no"

restart: always

restart: on-failure

restart: unless-stopped

2.40 secrets

通過 secrets為每個服務授予相應的訪問權限

2.40.1 SHORT 語法

version:"3.7"

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

2.40.2 LONG 語法

LONG 語法可以添加其他選項

source:secret 名稱

target:在服務任務容器中需要裝載在 /run/secrets/ 中的文件名稱,如果 source 未定義,那么默認為此值

uid&gid:在服務的任務容器中擁有該文件的 UID 或 GID 。如果未指定,兩者都默認為 0。

mode:以八進制表示法將文件裝載到服務的任務容器中 /run/secrets/ 的權限。例如,0444 代表可讀。

version:"3.7"

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

2.41 security_opt

為每個容器覆蓋默認的標簽。簡單說來就是管理全部服務的標簽,比如設置全部服務的 user 標簽值為 USER

security_opt:

  -label:user:USER

  -label:role:ROLE

2.42 stop_grace_period

在發送 SIGKILL 之前指定 stop_signal ,如果試圖停止容器(如果它沒有處理 SIGTERM(或指定的任何停止信號)),則需要等待的時間 

stop_grace_period: 1s

stop_grace_period: 1m30s

2.43 stop_signal

設置另一個信號來停止容器。在默認情況下使用的 SIGTERM 來停止容器。設置另一個信號可以使用 stop_signal 標簽:

stop_signal:SIGUSR1

2.44 sysctls

在容器中設置的內核參數,可以為數組或字典

sysctls:

  net.core.somaxconn: 1024

  net.ipv4.tcp_syncookies: 0

sysctls:

  - net.core.somaxconn=1024

  - net.ipv4.tcp_syncookies=0

注意:使用(版本3)Compose文件在群集模式下部署堆棧時,將忽略此選項

2.45 tmpfs

掛載臨時文件目錄到容器內部,與 run 的參數一樣效果,可以是單個值或列表

tmpfs: /run

tmpfs:

  - /run

  - /tmp

在容器內安裝臨時文件系統。Size參數指定tmpfs mount的大小(以字節為單位)。默認無限制。

- type: tmpfs

     target: /app

     tmpfs:

       size: 1000

注意:使用(版本3-3.5)Compose文件在群集模式下部署堆棧時,將忽略此選項  。

2.46 ulimits

覆蓋容器的默認限制,可以單一地將限制值設為一個整數,也可以將soft/hard 限制指定為映射

ulimits:

  nproc: 65535

  nofile:

    soft: 20000

    hard: 40000

2.47 userns_mode

如果Docker守護程序配置了用戶名稱空間,則禁用此服務的用戶名稱空間。

userns_mode: "host"

注意: 使用(版本3)Compose文件在群集模式下部署堆棧時,將忽略此選項 。

2.48  volumes

掛載一個目錄或者一個已存在的數據卷容器,可以直接使用 HOST:CONTAINER 這樣的格式,或者使用 HOST:CONTAINER:ro 這樣的格式,后者對於容器來說,數據卷是只讀的,這樣可以有效保護宿主機的文件系統

version: "3.7"

services:

  web:

    image: nginx:alpine

    volumes:

      - type: volume

        source: mydata

        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"

      - "dbdata:/var/lib/postgresql/data"

 

volumes:

  mydata:

  dbdata:

此示例顯示服務使用的命名卷(mydataweb以及為單個服務(db服務 下的第一個路徑volumes)定義的綁定安裝。該db服務還使用名為dbdatadb服務中的第二個路徑volumes)的命名卷,但使用舊字符串格式定義它以安裝命名卷。必須在頂級volumes鍵下列出命名卷

2.48.1 SHORT語法

可以選擇在主機(HOST:CONTAINER)或訪問模式(HOST:CONTAINER:ro)上指定路徑。

可以在主機上掛載相對路徑,該路徑相對於正在使用的 Compose 配置文件的目錄進行擴展。相對路徑應始終以 . 或 .. 開頭

volumes:

  # Just specify a path and let the Engine create a volume

  - /var/lib/mysql

 

  # Specify an absolute path mapping

  - /opt/data:/var/lib/mysql

 

  # Path on the host, relative to the Compose file

  - ./cache:/tmp/cache

 

  # User-relative path

  - ~/configs:/etc/configs/:ro

 

  # Named volume

  - datavolume:/var/lib/mysql

2.48.2 LONG語法

LONG 語法有些附加字段

type:安裝類型,可以為 volume、bind 或 tmpfs

source:安裝源,主機上用於綁定安裝的路徑或定義在頂級 volumes密鑰中卷的名稱 ,不適用於 tmpfs 類型安裝。

target:卷安裝在容器中的路徑

read_only:標志將卷設置為只讀

bind:配置額外的綁定選項

propagation:用於綁定的傳播模式

volume:配置其他卷選項

nocopy:創建卷時禁止從容器復制數據的標志

tmpfs:配置額外的 tmpfs 選項

size:tmpfs 的大小,以字節為單位

consistent:完全一致。容器運行時和主機始終保持相同的安裝視圖。這是默認值。

cached:主機的mount視圖是權威的。在主機上進行的更新在容器中可見之前可能會有延遲。

delegated:容器運行時的mount視圖是權威的。在容器中進行的更新在主機上可見之前可能會有延遲。

version: "3.7"

services:

  web:

    image: nginx:alpine

    ports:

      - "80:80"

    volumes:

      - type: volume

        source: mydata

        target: /data

        volume:

          nocopy: true

      - type: bind

        source: ./static

        target: /opt/app/static

 

networks:

  webnet:

 

volumes:

  mydata:

2.49 driver

指定應為此卷使用哪個卷驅動程序。默認為Docker Engine配置使用的任何驅動程序,在大多數情況下是local。如果驅動程序不可用,則在docker-compose up嘗試創建卷時Engine會返回錯誤 。

driver: foobar

2.50 driver_opts

將選項列表指定為鍵值對,以傳遞給此卷的驅動程序。

volumes:

  example:

    driver_opts:

      type: "nfs"

      o: "addr=10.40.0.199,nolock,soft,rw"

      device: ":/docker/example"

2.51 external

如果設置為true,則指定已在Compose之外創建此卷。docker-compose up不會嘗試創建它,如果它不存在則引發錯誤。

在下面的示例中,[projectname]_dataCompose 不是嘗試創建一個被調用的卷,而是 查找簡單調用的現有卷data並將其掛載到db服務的容器中。

version: "3.7"

services:

  db:

    image: postgres

    volumes:

      - data:/var/lib/postgresql/data

volumes:

  data:

    external: true

還可以在Compose文件中與用於引用它的名稱分別指定卷的名稱:

volumes:

  data:

    external:

      name: actual-name-of-volume

2.52 name

為此卷設置自定義名稱。name字段可用於引用包含特殊字符的卷。該名稱按原樣使用,不會使用堆棧名稱作為范圍。

version: "3.7"

volumes:

  data:

    name: my-app-data

它也可以與external參數一起使用: 

version: "3.7"

volumes:

  data:

    external: true

    name: my-app-data


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM