docker-compose編排參數詳解

1、前言

Compose是一個用於定義和運行多容器Docker應用程序的工具。使用Compose,您可使用YAML文件來配置應用程序的服務。而後,使用單個命令,您能夠從配置中建立並啓動全部服務。php

Compose能夠.yml .yaml 做爲文件擴展名。html

Compose適用於全部環境:生產,登臺,開發,測試以及CI工做流程。前端

關於 docker compose 技術能夠查看官方文檔 Docker Composenode

 

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

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

2.1 build

服務除了能夠基於指定的鏡像,還能夠基於一份 Dockerfile,在使用 up 啓動之時執行構建任務,這個構建標籤就是 build,它能夠指定 Dockerfile 所在文件夾的路徑。Compose 將會利用它自動構建這個鏡像,而後使用這個鏡像啓動服務容器。linux

build 能夠指定爲包含構建上下文路徑的字符串:nginx

version:"3.7"git

services:web

  webapp:redis

    build:./dir

或者,做爲具備在上下文中指定的路徑的對象以及可選的Dockerfileargs

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中,若是ARGFROM指令以前指定, ARG則在構建說明中不可用FROM。若是您須要在兩個位置均可以使用參數,請在FROM指令下指定它。

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

args:

  -buildno

  -gitcommithash

注意:YAML布爾值(truefalseyesnoonoff)必須用引號括起來,這樣分析器會將它們解釋爲字符串。

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_addcap_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 3Compose 文件在羣集模式下部署堆棧時,忽略此選項

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 語法提供了建立服務配置的更加詳細的信息。

sourceDocker 中存在的配置的名稱

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

uid gid:在服務的任務容器中擁有安裝的配置文件的數字 UID GID。若是未指定,則默認爲在Linux上。Windows不支持。

mode:在服務的任務容器中安裝的文件的權限,以八進制表示法。例如,0444 表明文件可讀的。默認是 0444。若是配置文件沒法寫入,是由於它們安裝在臨時文件系統中,因此若是設置了可寫位,它將被忽略。可執行位能夠設置。若是您不熟悉 UNIX 文件權限模式,Unix Permissions Calculator

 

下面示例在容器中將 my_config 名稱設置爲 redis_config,將模式設置爲 0440group-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個容器以外。試圖這樣作會致使錯誤。

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

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以依賴順序啓動服務。在如下示例中,dbredis在以前啓動web
  • docker-compose up SERVICE自動包含SERVICE依賴項。在如下示例中,docker-compose up web還建立並啓動dbredis
  • docker-compose stop按依賴順序中止服務。在如下示例中,webdb和以前中止redis

 

version:"3.7"

services:

  web:

    build:.

    depends_on:

      -db

      -redis

  redis:

    image:redis

  db:

    image:postgres

使用時須要注意如下幾點depends_on

depends_on不會在啓動web以前等待dbredis「就緒」

版本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)服務發現不使用單個虛擬 IPDocker爲服務設置 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.5050%)可用處理時間(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:若是回滾失敗該怎麼辦。一個continuepause(默認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:若是更新失敗,能夠執行的的是 continuerollback 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 的幾個子選項 

buildcgroup_parentcontainer_namedevicestmpfsexternal_linksinksnetwork_moderestartsecurity_optstop_signalsysctlsuserns_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

intervaltimeout 以及 start_period 都定爲持續時間

test 必須是字符串或列表,若是它是一個列表,第一項必須是 NONECMD  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中,可接受的值是defaultprocess hyperv

2.30 links

連接到其它服務的中的容器,能夠指定服務名稱也能夠指定連接別名(SERVICEALIAS),與 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_addressipv6_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 語法能夠添加其餘選項

sourcesecret 名稱

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

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

2.45 tmpfs

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

tmpfs: /run

tmpfs:

  - /run

  - /tmp

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

- type: tmpfs

     target: /app

     tmpfs:

       size: 1000

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

2.46 ulimits

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

ulimits:

  nproc: 65535

  nofile:

    soft: 20000

    hard: 40000

2.47 userns_mode

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

userns_mode: "host"

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

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:安裝類型,能夠爲 volumebind tmpfs

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

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

read_only:標誌將卷設置爲只讀

bind:配置額外的綁定選項

propagation:用於綁定的傳播模式

volume配置其餘卷選項

nocopy:建立卷時禁止從容器複製數據的標誌

tmpfs:配置額外的 tmpfs 選項

sizetmpfs 的大小,以字節爲單位

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

相關文章
相關標籤/搜索