Docker配置文件docker-compose.yml使用指南
Docker Compose配置文件是Docker Compose的核心,用于定義服務(wù)、網(wǎng)絡(luò)和數(shù)據(jù)卷。格式為YAML,默認(rèn)路徑為./docker-compose.yml,可以使用.yml或.yaml擴(kuò)展名,目前Compose配置文件格式的最新版本為V3。Compose配置文件中涉及的配置項(xiàng)也比較多,但大部分配置項(xiàng)的含義跟docker run命令相關(guān)選項(xiàng)是類(lèi)似的。
本文主要參考官方文檔對(duì)目前最新的V3版Compose配置文件進(jìn)行一個(gè)總結(jié)。都是一些概念性的內(nèi)容,不涉及具體操作。
一、Compose配置文件版本
這里主要對(duì)Compose配置文件的版本的相關(guān)要點(diǎn)進(jìn)行一個(gè)簡(jiǎn)單的總結(jié)。至于每個(gè)版本具體的變化和升級(jí)信息可以參考官方的Compose配置文件版本與升級(jí)指南。
1. Compose配置文件格式的版本概述
當(dāng)前有三種版本的Compose配置文件格式:
Version 1
舊版格式,通過(guò)省略YAML的根配置項(xiàng)version來(lái)指定。
未聲明版本的Compose配置文件都被視為V1版,所有的服務(wù)都作為根選項(xiàng)在Compose配置文件中聲明。
支持V1的Compose最高到1.6.x,再高版本的Compose不推薦使用V1版Compose配置文件。
不支持?jǐn)?shù)據(jù)卷、網(wǎng)絡(luò)和構(gòu)建參數(shù)配置。
V1的Compose不會(huì)利用網(wǎng)絡(luò)優(yōu)勢(shì),每個(gè)容器都位于默認(rèn)的bridge網(wǎng)絡(luò)上,并且可以從其他容器的IP地址訪(fǎng)問(wèn),需要使用links來(lái)啟用容器之間的發(fā)現(xiàn)。
Version 2.x
通過(guò)YAML的根配置項(xiàng)version來(lái)指定,具體配置如version: '2'或version: '2.1'等。
必須在Compose配置文件根選項(xiàng)指定版本號(hào),并且主版本數(shù)字為2,且所有服務(wù)必須在services配置項(xiàng)下聲明。
1.6.0+版本的Compose都支持V2,Docker Engine的版本需要1.10.0+版本。
支持?jǐn)?shù)據(jù)卷和網(wǎng)絡(luò)的配置。
默認(rèn)情況下,每個(gè)容器都加入了應(yīng)用范圍的默認(rèn)網(wǎng)絡(luò),并且可以在與服務(wù)名稱(chēng)相同的主機(jī)名下發(fā)現(xiàn)。很大程度上links不是必要的。
V2中加入了環(huán)境變量替換。
Version 3.x
最新版本,也是推薦使用版本,推出該版的目的是為了在Compose和Docker Engine的swarm模式之間形成交叉兼容。
通過(guò)YAML的根配置項(xiàng)version來(lái)指定,具體配置如version: '3'或version: '3.1'等。
V3刪除了多個(gè)配置項(xiàng),但也新增了更多配置項(xiàng)。
關(guān)于Compose配置文件版本的常見(jiàn)注意事項(xiàng):
在聲明V2和V3版本時(shí)需注意:
在指定Compose配置文件要使用的版本時(shí),需同時(shí)指定主版本數(shù)字和次版本數(shù)字。如果未給定次版本數(shù)字,則默認(rèn)使用0而不是最新版本,因此將不支持再更高版本中才加入的新功能。比如version: '3',使用的是3.0版本而不是目前最新的3.8版本。
在使用多Compose配置文件時(shí)需注意:
使用多個(gè)Compose配置文件擴(kuò)展服務(wù)時(shí),每個(gè)文件必須為相同的版本。
2. Compose配置文件格式版本與Docker的兼容性關(guān)系
Compose配置文件格式具有多種版本。其中Compose配置文件格式版本與Docker的兼容性關(guān)系如下表所示:
Compose配置文件格式版本 Docker Engine 版本
3.8 19.03.0+ 3.7 18.06.0+ 3.6 18.02.0+ 3.5 17.12.0+ 3.4 17.09.0+ 3.3 17.06.0+ 3.2 17.04.0+ 3.1 1.13.1+ 3.0 1.13.0+ 2.4 17.12.0+ 2.3 17.06.0+ 2.2 1.13.0+ 2.1 1.12.0+ 2.0 1.10.0+ 1.0 1.9.1.+
如果使用的較舊版本的Docker,可以參考官方的Compose版本發(fā)布列表。其中的每組發(fā)行說(shuō)明都詳細(xì)說(shuō)明了支持的Docker Engine版本和兼容的Compose配置文件格式版本。
3. 兼容模式
在1.20.0版本,Compose在docker-compose命令中引入了一個(gè)新的選項(xiàng)--compatibility,目的在于幫助開(kāi)發(fā)人員更輕松地過(guò)渡到V3版。啟用該選項(xiàng)后,docker-compose命令會(huì)讀取每個(gè)服務(wù)定義的deploy部分,并嘗試將其轉(zhuǎn)換為等效的V2配置項(xiàng)。目前,以下deploy下的配置項(xiàng)已被轉(zhuǎn)換:
resources下的limits和reservations下的memory
replicas
restart_policy下的 condition 和max_attempts
所有的其他配置項(xiàng)都將被忽略,如果這些被忽略的配置項(xiàng)存在則會(huì)發(fā)出一個(gè)警告??梢允褂脦?-compatibility的Config命令查看將用于deploy的配置。
注意請(qǐng)勿在生成環(huán)境使用兼容模式!
建議不要在生產(chǎn)環(huán)境中使用--compatibility選項(xiàng)。由于使用非Swarm模式屬性生成的配置僅是近似值,因此可能會(huì)產(chǎn)生意外的結(jié)果。
二、Compose配置文件結(jié)構(gòu)
Docker Compose配置文件是一個(gè)用于定義服務(wù)、網(wǎng)絡(luò)和數(shù)據(jù)卷的YAML文件。其中服務(wù)定義了該服務(wù)啟動(dòng)的每個(gè)容器的配置,就像將命令行參數(shù)傳遞給docker run一樣,網(wǎng)絡(luò)和數(shù)據(jù)卷的定義類(lèi)似于docker network create和docker volume create。跟docker run一樣,如果在Dockerfile中通過(guò)諸如CMD、EXPOSE、VOLUME和ENV這些指令指定了相關(guān)選項(xiàng),那么在默認(rèn)情況下,不需要在docker-compose.yml中再次指定它們。下面是從官網(wǎng)引過(guò)來(lái)的一個(gè)Compose配置文件的示例,可以先大致了解一下它的結(jié)構(gòu):
version: "3.8" services: redis: image: redis:alpine ports: - "6379" networks: - frontend deploy: replicas: 2 update_config: parallelism: 2 delay: 10s restart_policy: condition: on-failure db: image: postgres:9.4 volumes: - db-data:/var/lib/postgresql/data networks: - backend deploy: placement: constraints: - "node.role==manager" vote: image: dockersamples/examplevotingapp_vote:before ports: - "5000:80" networks: - frontend depends_on: - redis deploy: replicas: 2 update_config: parallelism: 2 restart_policy: condition: on-failure result: image: dockersamples/examplevotingapp_result:before ports: - "5001:80" networks: - backend depends_on: - db deploy: replicas: 1 update_config: parallelism: 2 delay: 10s restart_policy: condition: on-failure worker: image: dockersamples/examplevotingapp_worker networks: - frontend - backend deploy: mode: replicated replicas: 1 labels: [APP=VOTING] restart_policy: condition: on-failure delay: 10s max_attempts: 3 window: 120s placement: constraints: - "node.role==manager" visualizer: image: dockersamples/visualizer:stable ports: - "8080:8080" stop_grace_period: 1m30s volumes: - "/var/run/docker.sock:/var/run/docker.sock" deploy: placement: constraints: - "node.role==manager" networks: frontend: backend: volumes: db-data:
頂層的version、services、networks和volumes將Compose配置文件分為四個(gè)部分,其中version指定Compose配置文件的版本,services定義服務(wù),networks定義網(wǎng)絡(luò),volumes定義數(shù)據(jù)卷。
三、服務(wù)配置
服務(wù)定義了該服務(wù)啟動(dòng)的每個(gè)容器的配置,就像將命令行參數(shù)傳遞給docker run一樣。比如以下配置:
services: redis: image: redis:alpine
services下的redis是用戶(hù)自定義的服務(wù)名稱(chēng),redis下的image只是眾多服務(wù)配置項(xiàng)中的其中一個(gè),意思是指定鏡像名稱(chēng)或id。下面就對(duì)服務(wù)的相關(guān)配置項(xiàng)進(jìn)行一個(gè)總結(jié)。
1. build
在構(gòu)建時(shí)應(yīng)用的配置項(xiàng)。一般直接指定Dockerfile所在文件夾路徑,可以是絕對(duì)路徑,或者相對(duì)于Compose配置文件的路徑。可以指定為包含構(gòu)建上下文(context)路徑的字符串。例如:
version: "3.8" services: webapp: build: ./dir
也可以使用context指定上下文路徑,使用dockerfile基于上下文路徑指定Dockerfile文件,使用args指定構(gòu)建參數(shù)。例如:r
version: "3.8" services: webapp: build: context: ./dir dockerfile: Dockerfile-alternate args: buildno: 1
如果同時(shí)指定了build和image。例如:
build: ./dir image: webapp:tag
Compose會(huì)在./dir目錄下構(gòu)建一個(gè)名為webapp,標(biāo)簽為tag的鏡像。
使用docker stack deploy時(shí)的注意事項(xiàng):在swarm mode下部署堆棧時(shí),build配置項(xiàng)被忽略。因?yàn)閐ocker stack命令不會(huì)在部署之前構(gòu)建鏡像。
(1) context
指定包含Dockerfile的目錄路徑或git倉(cāng)庫(kù)url。該目錄是發(fā)送給Docker守護(hù)進(jìn)程(Daemon)的構(gòu)建上下文(context)。當(dāng)配置的值是相對(duì)路徑時(shí),它將被解釋為相對(duì)于Compose配置文件的路徑。例如:
build: context: ./dir
指定上下文為Compose配置文件目錄下的dir目錄。
(2) dockerfile
指定Dockerfile文件。Compose會(huì)使用指定的Dockerfile文件構(gòu)建鏡像,但必須要指定構(gòu)建上下文路徑。例如:
build: context: . dockerfile: Dockerfile-alternate
Compose會(huì)使用Compose配置文件所在目錄下名為Dockerfile-alternate的Dockerfile文件構(gòu)建鏡像。
(3) args
添加構(gòu)建參數(shù),這些只能在構(gòu)建過(guò)程中訪(fǎng)問(wèn)的環(huán)境變量。首先在Dockerfile文件中指定參數(shù):
ARG buildno ARG gitcommithash RUN echo "Build number: $buildno" RUN echo "Based on commit: $gitcommithash"
然后build中指定參數(shù),以下兩種寫(xiě)法都可以:
build: context: . args: buildno: 1 gitcommithash: cdc3b19
build: context: . args: - buildno=1 - gitcommithash=cdc3b19
這時(shí)構(gòu)建過(guò)程中使用的參數(shù)的值為args指定的值。在指定構(gòu)建參數(shù)時(shí)也可以不指定值,在這種情況下,構(gòu)建過(guò)程中使用的參數(shù)的值為運(yùn)行Compose的環(huán)境中的值。例如:
args: - buildno - gitcommithash
使用布爾值時(shí)的注意事項(xiàng):YMAL中布爾類(lèi)型的值("true"、"false"、"yes"、"no"、"on"、"off")必須用引號(hào)引起來(lái),以便解析器將它們解釋為字符串。
(4) cache_from
在3.2版的配置文件格式中加入
指定緩存解析鏡像列表。例如:
build: context: . cache_from: - alpine:latest - corp/web_app:3.14
(5) labels
在3.3版的配置文件格式中加入
將元數(shù)據(jù)以標(biāo)簽的形式添加到生成的鏡像中??梢允褂脭?shù)組或字典兩種格式。推薦使用反向DNS寫(xiě)法以避免和其他應(yīng)用的標(biāo)簽沖突。例如:
build: context: . labels: com.example.description: "Accounting webapp" com.example.department: "Finance" com.example.label-with-empty-value: ""
build: context: . labels: - "com.example.description=Accounting webapp" - "com.example.department=Finance" - "com.example.label-with-empty-value"
(6) network
在3.4版的配置文件格式中加入
設(shè)置容器網(wǎng)絡(luò)連接以獲取構(gòu)建過(guò)程中的RUN指令。例如:
build: context: . network: custom_network_1
設(shè)置為none可以在構(gòu)建期間禁用網(wǎng)絡(luò)連接。例如:
build: context: . network: none
(7) shm_size
在3.5版的配置文件格式中加入
指定容器的/dev/shm分區(qū)大小。指定的值為表示字節(jié)數(shù)的整數(shù)值或表示字節(jié)值的字符串。例如
build: context: . shm_size: 10000000
build: context: . shm_size: '2gb'
(8) target
在3.4版的配置文件格式中加入
指定在Dockerfile中定義的構(gòu)建階段,即鏡像只構(gòu)建到指定階段就停止構(gòu)建。例如:
build: context: . target: prod
指定構(gòu)建階段為prod,即鏡像只構(gòu)建到prod階段,prod階段之后的內(nèi)容不會(huì)被構(gòu)建。
2. cap_add、cap_drop
添加或刪除容器內(nèi)核能力(capability)。完整的capability列表可查看man 7 capabilities。例如,讓容器擁有所有內(nèi)核能力:
cap_add: - ALL
例如,刪除NET_ADMIN和SYS_ADMIN能力:
cap_drop: - NET_ADMIN - SYS_ADMIN
使用docker stack deploy時(shí)的注意事項(xiàng):在swarm mode下部署堆棧時(shí),cap_add和cap_drop配置項(xiàng)將被忽略。
3. cgroup_parent
為容器指定一個(gè)可選的父控制組。例如:
cgroup_parent: m-executor-abcd
使用docker stack deploy時(shí)的注意事項(xiàng):在swarm mode下部署堆棧時(shí),cgroup_parent配置項(xiàng)將被忽略。
4. command
覆蓋容器啟動(dòng)后默認(rèn)執(zhí)行的命令。可以寫(xiě)成字符串形式。例如:
command: bundle exec thin -p 3000
也可以寫(xiě)成JSON數(shù)組形式。例如:
command: ["bundle", "exec", "thin", "-p", "3000"]
5. configs
在3.3版的配置文件格式中加入
為每個(gè)服務(wù)授予對(duì)配置(configs)的訪(fǎng)問(wèn)權(quán)限。支持short和long兩種格式的語(yǔ)法。更多configs信息,參考configs。
注意:該配置(config)必須已存在或者在堆棧文件頂層configs配置項(xiàng)中定義,否則堆棧部署將失敗。
short語(yǔ)法僅指定config名稱(chēng)來(lái)授予容器訪(fǎng)問(wèn)config的權(quán)限并將其掛載到容器的/<config_name>上。source名稱(chēng)和目標(biāo)掛載點(diǎn)都設(shè)置為config名稱(chēng)。例如以下示例,授予了redis服務(wù)對(duì)configs的my_config和my_other_config的訪(fǎng)問(wèn)權(quán)限,其中my_config的值設(shè)置到文件./my_config.txt的內(nèi)容中,my_other_config定義為外部資源,這意味著它已經(jīng)在Docker中通過(guò)運(yùn)行docker config create命令或其他堆棧部署進(jìn)行定義,如果外部config不存在,堆棧部署將會(huì)失敗并顯示config not found錯(cuò)誤:
version: "3.8" 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
long語(yǔ)法提供了在服務(wù)的任務(wù)容器內(nèi)如何創(chuàng)建config的更多粒度:
source:Docker中存在的config名稱(chēng)。
target:指定要掛載到服務(wù)的任務(wù)容器的文件的路徑加名稱(chēng)。如果未指定,默認(rèn)為/。
uid和gid:指定服務(wù)的任務(wù)容器所擁有的該文件的UID或GID。如果在LInux中未指定,兩者都默認(rèn)為0。不支持Windows。
mode:以八進(jìn)制表示法指定要掛載到服務(wù)的任務(wù)容器的文件權(quán)限。例如,0444代表可讀。默認(rèn)值就為0444。config內(nèi)容已掛載到臨時(shí)文件系統(tǒng)中,所以不可寫(xiě),如果設(shè)置了可寫(xiě)位將被忽略??梢栽O(shè)置可執(zhí)行位。如果不熟悉UNIX文件權(quán)限模式,可以使用權(quán)限計(jì)算器 。
例如以下示例,指定config名稱(chēng)為my_config,授予redis服務(wù)對(duì)my_config的訪(fǎng)問(wèn)權(quán)限,指定要掛載到redis服務(wù)的任務(wù)容器的路徑加文件名稱(chēng)為/redis_config,指定UID和GID均為103,指定要掛載到服務(wù)的任務(wù)容器的文件權(quán)限為0440(group-readable),但該redis服務(wù)沒(méi)有訪(fǎng)問(wèn)my_other_config的權(quán)限:
version: "3.8" 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
可以授予服務(wù)訪(fǎng)問(wèn)多個(gè)config的權(quán)限,并且可以混合long和short語(yǔ)法。定義config并不意味著授予服務(wù)對(duì)其的訪(fǎng)問(wèn)權(quán)限。
6. container_name
指定自定義容器的名稱(chēng),而不是使用默認(rèn)名稱(chēng)。例如:
container_name: my-web-container
因?yàn)镈ocker容器的名稱(chēng)必須唯一,所以為一個(gè)服務(wù)指定了自定義容器名稱(chēng)后,該服務(wù)不能進(jìn)行擴(kuò)展。如果嘗試為該服務(wù)擴(kuò)容將會(huì)導(dǎo)致錯(cuò)誤。
使用docker stack deploy時(shí)的注意事項(xiàng):在swarm mode下部署堆棧時(shí),container_name配置項(xiàng)將被忽略。
7. credential_spec
在3.3版的配置文件格式中加入
在3.8或更高版本文件格式中支持將組托管服務(wù)帳戶(hù)(GMSA)配置與Compose配置文件一起使用。
配置托管服務(wù)帳戶(hù)的憑據(jù)規(guī)格(credential spec)。此選項(xiàng)僅用于使用Windows容器的服務(wù)。credential_spec配置必須采用file://或registry://格式。使用file:時(shí),引用的文件必須存在于Docker數(shù)據(jù)目錄的CredentialSpecs子目錄中,在Windows上,Docker數(shù)據(jù)目錄默認(rèn)為C:\ProgramData\Docker\。以下示例從名為C:\ProgramData\Docker\CredentialSpecs\my-credential-spec.json的文件加載憑證規(guī)格:
credential_spec: file: my-credential-spec.json
使用registry:時(shí),將從守護(hù)進(jìn)程主機(jī)上的Windows注冊(cè)表中讀取憑據(jù)規(guī)格。其注冊(cè)表值必須位于HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Virtualization\Containers\CredentialSpecs。以下示例從注冊(cè)表中名為my-credential-spec的值加載憑證規(guī)格:
credential_spec: registry: my-credential-spec
為服務(wù)配置GMSA憑據(jù)規(guī)格時(shí),只需用config指定憑據(jù)規(guī)格。例如:
version: "3.8" services: myservice: image: myimage:latest credential_spec: config: my_credential_spec configs: my_credentials_spec: file: ./my-credential-spec.json|
8. depends_on
指定服務(wù)之間的依賴(lài)關(guān)系,解決服務(wù)啟動(dòng)先后順序問(wèn)題。指定服務(wù)之間的依賴(lài)關(guān)系,將會(huì)導(dǎo)致以下行為:
docker-compose up以依賴(lài)順序啟動(dòng)服務(wù)。
docker-compose up SERVICE會(huì)自動(dòng)包含SERVICE的依賴(lài)項(xiàng)。
docker-compose stop以依賴(lài)順序停止服務(wù)。
例如以下示例:
version: "3.8" services: web: build: . depends_on: - db - redis redis: image: redis db: image: postgres
啟動(dòng)時(shí)會(huì)先啟動(dòng)db和redis,最后才啟動(dòng)web。在使用docker-compose up web啟動(dòng)web時(shí),也會(huì)啟動(dòng)db和redis,因?yàn)樵趙eb服務(wù)中指定了依賴(lài)關(guān)系。在停止時(shí)也在web之前先停止db和redis。
使用depends_on時(shí)的注意事項(xiàng):
服務(wù)不會(huì)等待該服務(wù)所依賴(lài)的服務(wù)完全啟動(dòng)之后才啟動(dòng)。例如上例,web不會(huì)等到db和redis完全啟動(dòng)之后才啟動(dòng)。
V3版不再支持的condition形式的depends_on。
V3版中,在swarm mode下部署堆棧時(shí),depends_on配置項(xiàng)將被忽略。
9. deploy
在3版的配置文件格式中加入
指定部署和運(yùn)行服務(wù)的相關(guān)配置。該配置僅在swarm mode下生效,并只能通過(guò)docker stack deploy命令部署,docker-compose up和docker-compose run命令將被忽略。例如:
version: "3.8" services: redis: image: redis:alpine deploy: replicas: 6 placement: max_replicas_per_node: 1 update_config: parallelism: 2 delay: 10s restart_policy: condition: on-failure
deploy配置項(xiàng)中包含endpoint_mode、labels、mode、placement、replicas、resources、restart_policy、update_config等子配置項(xiàng)。
(1) endpoint_mode
在3.2版的配置文件格式中加入
為外部客戶(hù)端連接到swarm指定服務(wù)發(fā)現(xiàn)方式:
endpoint_mode: vip:Docker為服務(wù)分配了一個(gè)前端的虛擬IP,客戶(hù)端通過(guò)該虛擬IP訪(fǎng)問(wèn)網(wǎng)絡(luò)上的服務(wù)。Docker在客戶(hù)端和服務(wù)的可用工作節(jié)點(diǎn)之間進(jìn)行路由請(qǐng)求,而無(wú)須關(guān)系有多少節(jié)點(diǎn)正在參與該服務(wù)或這些節(jié)點(diǎn)的IP地址或者端口。這是默認(rèn)設(shè)置。
endpoint_mode: dnsrr:DNS輪詢(xún)(DNSRR),Docker設(shè)置服務(wù)的DNS條目,以便對(duì)服務(wù)名稱(chēng)的DNS查詢(xún)返回IP地址列表,并且客戶(hù)端通過(guò)輪詢(xún)的方式直接連接到其中之一。
例如:
version: "3.8" services: wordpress: image: wordpress ports: - "8080:80" deploy: mode: replicated replicas: 2 endpoint_mode: vip
(2) labels
指定服務(wù)的標(biāo)簽。這些標(biāo)簽僅在服務(wù)上設(shè)置,而不在服務(wù)的任何容器上設(shè)置。例如:
version: "3.8" services: web: image: web deploy: labels: com.example.description: "This label will appear on the web service"
(3) mode
指定服務(wù)的容器副本模式??梢詾椋?/p>
global:每個(gè)swarm節(jié)點(diǎn)只有一個(gè)該服務(wù)容器。
replicated:整個(gè)集群中存在指定份數(shù)的服務(wù)容器副本,為默認(rèn)值。
例如,指定容器副本模式為global:
version: "3.8" services: worker: image: dockersamples/examplevotingapp_worker deploy: mode: global
(4) placement
指定constraints和preferences。constraints可以指定只有符合要求的節(jié)點(diǎn)上才能運(yùn)行該服務(wù)容器,preferences可以指定容器分配策略。例如,指定集群中只有滿(mǎn)足node.rolemanager和engine.labels.operatingsystemubuntu 18.04條件的節(jié)點(diǎn)上能運(yùn)行db服務(wù)容器,并且在滿(mǎn)足node.labels.zone的節(jié)點(diǎn)上均勻分配:
version: "3.8" services: db: image: postgres deploy: placement: constraints: - "node.role==manager" - "engine.labels.operatingsystem==ubuntu 18.04" preferences: - spread: node.labels.zone
(5) max_replicas_per_node
在3.8版的配置文件格式中加入
如果服務(wù)的容器副本模式為replicated(默認(rèn)),可以指定每個(gè)節(jié)點(diǎn)上運(yùn)行的最大容器副本數(shù)量。當(dāng)指定的容器副本數(shù)量大于最大容器副本數(shù)量時(shí),將引發(fā)no suitable node (max replicas per node limit exceed)錯(cuò)誤。例如:
version: "3.8" services: worker: image: dockersamples/examplevotingapp_worker networks: - frontend - backend deploy: mode: replicated replicas: 6 placement: max_replicas_per_node: 1
(6) replicas
如果服務(wù)的容器副本模式為replicated(默認(rèn)),指定運(yùn)行的容器副本數(shù)量。例如:
version: "3.8" services: worker: image: dockersamples/examplevotingapp_worker networks: - frontend - backend deploy: mode: replicated replicas: 6
(7) resources
配置資源限制。例如,指定redis服務(wù)使用的cpu份額為25%到50%,內(nèi)存為20M到50M:
version: "3.8" services: redis: image: redis:alpine deploy: resources: limits: cpus: '0.50' memory: 50M reservations: cpus: '0.25' memory: 20M
在V3版Compose配置文件中的改變:resources取代了V3版之前的Compose配置文件中舊的資源限制的配置項(xiàng),包括cpu_shares、cpu_quota、cpuset、mem_limit、memswap_limit、mem_swappiness。
在非swarm mode容器上設(shè)置資源限制:此處的resources配置項(xiàng)只有用于deploy配置項(xiàng)之下和swarm mode。如果要在非swarm mode部署中設(shè)置資源限制,需使用V2版Compose配置文件中CPU、memory和其他資源的配置項(xiàng)。
(8) restart_policy
指定容器的重啟策略。代替restart。有以下配置選項(xiàng):
condition:重啟策略。值可以為none、on-failure或any,默認(rèn)為any。
delay:嘗試重啟的等待時(shí)間。指定為持續(xù)時(shí)間(durations)。默認(rèn)值為0。
max_attempts:重啟最多嘗試的次數(shù),超過(guò)該次數(shù)將放棄。默認(rèn)為永不放棄。如果在window配置的時(shí)間之內(nèi)未成功重啟,則此次嘗試不計(jì)入max_attempts的值。
window:在決定重啟是否成功之前的等待時(shí)間。指定為持續(xù)時(shí)間(durations)。默認(rèn)值為立即決定。
例如,指定重啟策略為失敗時(shí)重啟,等待5s,重啟最多嘗試3次,決定重啟是否成功前的等待時(shí)間為120s:
version: "3.8" services: redis: image: redis:alpine deploy: restart_policy: condition: on-failure delay: 5s max_attempts: 3 window: 120s
(9) rollback_config
在3.7版的配置文件格式中加入
配置在更新失敗的情況下如何回滾服務(wù)。有以下配置選項(xiàng):
parallelism:一次回滾的容器數(shù)量。如果設(shè)置為0,則所有容器同時(shí)回滾。
delay:每個(gè)容器組之間的回滾所等待的時(shí)間。默認(rèn)值為0s。
failure_action:回滾失敗后的行為。有continue和pause兩種,默認(rèn)值為pause。
monitor:每次任務(wù)更新后監(jiān)視失敗的時(shí)間(ns|us|ms|s|m|h)。默認(rèn)值為0s。
max_failure_ratio:在回滾期間能夠容忍的最大失敗率。默認(rèn)值為0。
order:設(shè)置回滾順序。stop-first為在開(kāi)啟新任務(wù)之前停止舊任務(wù),start-first為首先啟動(dòng)新任務(wù),和正在運(yùn)行任務(wù)短暫重疊,默認(rèn)值為stop-first。
(10) update_config
配置如何更新服務(wù)。該配置對(duì)滾動(dòng)更新很有用。有以下配置選項(xiàng):
parallelism:一次更新的容器數(shù)量。
delay:更新一組容器之間的等待時(shí)間。
failure_action:更新失敗后的行為。有continue、rollback和pause三種,默認(rèn)值為pause。
monitor:每次任務(wù)更新后監(jiān)視失敗的時(shí)間(ns|us|ms|s|m|h)。默認(rèn)值為0s。
max_failure_ratio:在更新期間能夠容忍的最大失敗率。
order:設(shè)置更新順序。stop-first為在開(kāi)啟新任務(wù)之前停止舊任務(wù),start-first為首先啟動(dòng)新任務(wù),和正在運(yùn)行任務(wù)短暫重疊,默認(rèn)值為stop-first。注意該配置項(xiàng)在3.4版的配置文件格式中加入,僅支持3.4或更高版本。
例如,指定每次更新2個(gè)容器,更新等待時(shí)間10s,更新順序?yàn)橄韧V古f任務(wù)再開(kāi)啟新任務(wù):
version: "3.8" services: vote: image: dockersamples/examplevotingapp_vote:before depends_on: - redis deploy: replicas: 2 update_config: parallelism: 2 delay: 10s order: stop-first
(11) 不支持docker stack deploy的配置項(xiàng)
以下為支持docker-compose up和docker-compose run,不支持docker stack deploy或deploy配置項(xiàng)的配置項(xiàng):
build cgroup_parent container_name devices tmpfs external_links links network_mode restart security_opt userns_mode
10. devices
指定設(shè)備映射列表。與Docker客戶(hù)端create的--device選項(xiàng)類(lèi)似。例如:
devices: - "/dev/ttyUSB0:/dev/ttyUSB0"
使用docker stack deploy時(shí)的注意事項(xiàng):在swarm mode下部署堆棧時(shí),devices配置選項(xiàng)將被忽略。
11. dns
自定義DNS服務(wù)器??梢允且粋€(gè)值或一個(gè)列表。例如:
dns: 8.8.8.8 dns: - 8.8.8.8 - 9.9.9.9
12. dns_search
自定義DNS搜索域。可以是一個(gè)值或一個(gè)列表。例如:
dns_search: example.com dns_search: - dc1.example.com - dc2.example.com
13. entrypoint
覆蓋默認(rèn)的入口命令。注意設(shè)置entrypoint會(huì)覆蓋所有在服務(wù)鏡像上使用Dockerfile的ENTRYPOINT指令設(shè)置的默認(rèn)入口命令,并清除掉服務(wù)鏡像上任何使用Dockerfile的CMD指令設(shè)置的啟動(dòng)容器時(shí)默認(rèn)執(zhí)行的命令。可以寫(xiě)成字符串形式,例如:
entrypoint: /code/entrypoint.sh
也可以寫(xiě)成JSON數(shù)組形式,例如:
entrypoint: ["php", "-d", "memory_limit=-1", "vendor/bin/phpunit"]
14. env_file
從文件中獲取環(huán)境變量。可以是一個(gè)值或一個(gè)列表。例如:
env_file: .env env_file: - ./common.env - ./apps/web.env - /opt/runtime_opts.env
如果指定了Compose配置文件,env_file路徑為相對(duì)于該文件所在目錄的路徑。如果環(huán)境文件中設(shè)置有與environment選項(xiàng)同名的變量,將以后者為準(zhǔn),無(wú)論這些變量的值是空還是未定義。其中環(huán)境文件每行都以VAR=VAL格式聲明環(huán)境變量,以#開(kāi)頭的行被解析為注釋?zhuān)涂招幸粯訉⒈缓雎浴-h(huán)境文件示例如下:
# Set Rails/Rack environment RACK_ENV=development
如果變量的值被引號(hào)引起來(lái)(通常是shell變量),則引號(hào)也包含在傳遞給Compose的值中。如果以列表的形式同時(shí)指定了多個(gè)環(huán)境文件,列表中文件的順序?qū)τ诮o多次出現(xiàn)的環(huán)境變量確定值十分重要,且列表中的文件是從上到下處理的。如果指定了多個(gè)環(huán)境文件且有至少兩個(gè)文件聲明了相同名稱(chēng)但不同值的環(huán)境變量,那么指定列表中順序靠下的文件將覆蓋順序靠上的文件中的相同名稱(chēng)的環(huán)境變量的值。例如:
services: some-service: env_file: - a.env - b.env
如果a.env中有VAR=1,b.env中有VAR=2,則最終$VAR=2。
注意:這里所說(shuō)的環(huán)境變量是針對(duì)宿主機(jī)的Compose而言的,如果在服務(wù)中指定了build配置項(xiàng),那么這些變量并不會(huì)進(jìn)入構(gòu)建過(guò)程中,如果要定義構(gòu)建時(shí)用的環(huán)境變量首選build的arg子選項(xiàng)。
15. environment
設(shè)置環(huán)境變量??梢允褂脭?shù)組或字典兩種格式。任何布爾類(lèi)型的值都必須用引號(hào)引起來(lái),以便解析器將它們解釋為字符串。值設(shè)置了鍵沒(méi)設(shè)置值的環(huán)境變量可以在運(yùn)行Compose的主機(jī)環(huán)境中解析它們的值,這對(duì)于使用密鑰和特定于主機(jī)的值用處很大。例如:
environment: RACK_ENV: development SHOW: 'true' SESSION_SECRET: environment: - RACK_ENV=development - SHOW=true - SESSION_SECRET
注意:這里所說(shuō)的環(huán)境變量是針對(duì)宿主機(jī)的Compose而言的,如果在服務(wù)中指定了build配置項(xiàng),那么這些變量并不會(huì)進(jìn)入構(gòu)建過(guò)程中,如果要定義構(gòu)建時(shí)用的環(huán)境變量首選build的arg子選項(xiàng)。
16. expose
暴露指定端口,但不映射到宿主機(jī),只被連接的服務(wù)訪(fǎng)問(wèn)。只能指定內(nèi)部端口。例如:
expose: - "3000" - "8000"
17. external_links
鏈接到docker-compose.yml外部的容器,甚至并非Compose管理的外部容器,特別是對(duì)于提供共享或公共服務(wù)的容器。在同時(shí)指定容器名稱(chēng)和鏈接別名(CONTAINER:ALIAS)時(shí),external_links與舊版本中的配置項(xiàng)links有類(lèi)似的語(yǔ)義。例如:
external_links: - redis_1 - project_db_1:mysql - project_db_1:postgresql
注意:Compose項(xiàng)目里面的容器連接到外部容器的前提條件是外部容器中必須至少有一個(gè)容器連接到與項(xiàng)目?jī)?nèi)的服務(wù)的同一個(gè)網(wǎng)絡(luò)里面。建議使用networks代替舊版本中的配置項(xiàng)Links。
使用docker stack deploy時(shí)的注意事項(xiàng):在swarm mode下部署堆棧時(shí),external_links配置項(xiàng)將被忽略。
18. extra_hosts
添加主機(jī)名到IP的映射。使用和Docker客戶(hù)端中的--add-host的參數(shù)一樣的值。例如:
extra_hosts: - "somehost:162.242.195.82" - "otherhost:50.31.209.229"
會(huì)在啟動(dòng)后的服務(wù)容器中的/etc/hosts文件中添加如下兩條具有主機(jī)名和IP地址的條目:
162.242.195.82 somehost
50.31.209.229 otherhost
19. healthcheck
配置運(yùn)行檢查以確定服務(wù)容器是否健康。支持以下配置選項(xiàng):
- test:指定健康檢測(cè)的方法。
- interval:?jiǎn)?dòng)容器到進(jìn)行健康檢查的間隔時(shí)間以及兩次健康檢查的間隔時(shí)間。
- timeout:?jiǎn)未谓】禉z查的超時(shí)時(shí)間,超過(guò)該時(shí)間該次健康檢查失敗。
- retries:健康檢查失敗后的最大重試次數(shù),重試了最大次數(shù)依然失敗,容器將被視為unhealthy。
- start_period:為需要時(shí)間引導(dǎo)的容器提供的初始化時(shí)間,在此期間檢查失敗將不計(jì)入最大重試次數(shù),但是如果在啟動(dòng)期間健康檢查成功,則會(huì)將容器視為已啟動(dòng),并且所有連續(xù)失敗將計(jì)入最大重試次數(shù)。
其中interval、timeout和start_period都被指定為持續(xù)時(shí)間(durations)。start_period是在3.4版的配置文件格式中加入。test必須是字符串或JSON數(shù)組格式。如果是JSON數(shù)組格式,第一項(xiàng)必須是NONE、CMD或CMD-SHELL其中之一。如果是字符串格式,則等效于指定CMD-SHELL后跟該字符串的JSON數(shù)組格式。
例如以下示例,指定檢測(cè)方法為訪(fǎng)問(wèn)http://localhost,健康檢查間隔時(shí)間為1m30s,健康檢查超時(shí)時(shí)間為10s,重試次數(shù)為3,啟動(dòng)容器后等待健康檢查的初始化時(shí)間為40s:
healthcheck: test: ["CMD", "curl", "-f", "http://localhost"] interval: 1m30s timeout: 10s retries: 3 start_period: 40s
例如以下示例,兩種形式等效:
test: ["CMD-SHELL", "curl -f http://localhost || exit 1"] test: curl -f https://localhost || exit 1
使用disable: true可以設(shè)置鏡像禁用所有健康檢查,相對(duì)于test: ["NONE"]。例如:
healthcheck: disable: true
20. image
指定要從中啟動(dòng)容器的鏡像??梢詫?xiě)倉(cāng)庫(kù)/標(biāo)簽(repository/tag)或鏡像ID。示例如下:
image: redis image: ubuntu:18.04 image: tutum/influxdb image: example-registry.com:4000/postgresql image: a4bc65fd
如果鏡像不存在,Compose會(huì)自動(dòng)拉取鏡像,除非指定了build,這種情況下會(huì)使用指定選項(xiàng)構(gòu)建鏡像并給鏡像打上指定標(biāo)簽。
21. init
在3.7版的配置文件格式中加入
在容器內(nèi)運(yùn)行一個(gè)初始化程序以轉(zhuǎn)發(fā)信號(hào)并獲取進(jìn)程。設(shè)置為true即可為服務(wù)啟動(dòng)此功能。例如:
version: "3.8" services: web: image: alpine:latest init: true
注意:默認(rèn)使用的初始化二進(jìn)制文件是Tini,并安裝在主機(jī)守護(hù)進(jìn)程的/usr/libexec/docker-init。可以通過(guò)Daemon configuration file中的init-path將守護(hù)進(jìn)程配置為使用自定義的初始化二進(jìn)制文件 。
22. isolation
指定容器的隔離技術(shù)。Linux上只支持default值。Windows上支持default、process和hyperv這三個(gè)值。
23. labels
將元數(shù)據(jù)以標(biāo)簽的形式添加到容器中??梢允褂脭?shù)組或字典兩種格式。例如:
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"
24. links
警告:--link是Docker的遺留功能。它最終可能會(huì)被刪除。建議您使用用戶(hù)自定義網(wǎng)絡(luò)代替--link來(lái)進(jìn)行兩個(gè)容器間的通信。用戶(hù)自定義的網(wǎng)絡(luò)不支持--link在容器之間共享的環(huán)境變量的功能。但是可以使用例如數(shù)據(jù)卷之類(lèi)的其他機(jī)制以更可控的方式在容器之間共享環(huán)境變量。
鏈接到其他服務(wù)中的容器??梢允褂?quot;SERVICE:ALIAS"或"SERVICE"的格式,其中SERVICE為服務(wù)名稱(chēng),ALIAS為鏈接別名。例如:
web: links: - "db" - "db:database" - "redis"
鏈接服務(wù)的容器可以通過(guò)與別名相同的主機(jī)名訪(fǎng)問(wèn),如果未指定別名,則可以使用服務(wù)名。默認(rèn)情況下,不需要鏈接即可使服務(wù)進(jìn)行通信,任何服務(wù)都可以使用該服務(wù)的名稱(chēng)訪(fǎng)問(wèn)任何其他服務(wù)。鏈接也可以和depends_on一樣表示服務(wù)之間的依賴(lài)關(guān)系 ,因此可以確定服務(wù)啟動(dòng)的順序。
注意:如果同時(shí)定義鏈接和網(wǎng)絡(luò),則它們之間具有鏈接的服務(wù)必須共享至少一個(gè)公共網(wǎng)絡(luò)才能進(jìn)行通信。
使用docker stack deploy時(shí)的注意事項(xiàng):在swarm mode下部署堆棧時(shí),links配置項(xiàng)將被忽略。
25. logging
服務(wù)的日志配置。例如:
logging: driver: syslog options: syslog-address: "tcp://192.168.0.42:123"
driver配置項(xiàng)指定服務(wù)容器的日志驅(qū)動(dòng),與docker run中的--log-driver選項(xiàng)一樣。默認(rèn)值為json-file,這里列舉三種日志驅(qū)動(dòng)類(lèi)型:
driver: "json-file" driver: "syslog" driver: "none"
使用options配置項(xiàng)為日志驅(qū)動(dòng)指定日志記錄選項(xiàng),與docker run中的--log-opt選項(xiàng)一樣。例如:
driver: "syslog" options: syslog-address: "tcp://192.168.0.42:123"
默認(rèn)日志驅(qū)動(dòng)json-file具有限制日志存儲(chǔ)量的選項(xiàng)。例如以下示例,max-size設(shè)置最大存儲(chǔ)大小為200k,max-file設(shè)置存儲(chǔ)的最大文件數(shù)為10,隨著日志超過(guò)最大限制,將刪除較舊的日志文件以允許存儲(chǔ)新日志:
options: max-size: "200k" max-file: "10"
26. network_mode
設(shè)置網(wǎng)絡(luò)模式。使用和Docker客戶(hù)端中的--network的參數(shù)一樣的值,格式為service:[service name]??梢灾付ㄊ褂梅?wù)或者容器的網(wǎng)絡(luò)。示例如下:
network_mode: "bridge" network_mode: "host" network_mode: "none" network_mode: "service:[service name]" network_mode: "container:[container name/id]"
注意事項(xiàng):
在swarm mode下部署堆棧時(shí),該選項(xiàng)將被忽略。
network_mode: "host"不能與links配置項(xiàng)混用。
27. networks
指定所加入的網(wǎng)絡(luò)。需要在頂層networks配置項(xiàng)中引入具體的網(wǎng)絡(luò)信息。例如:
services: some-service: networks: - some-network - other-network networks: some-network: other-network:
(1) aliases
指定服務(wù)在此網(wǎng)絡(luò)上的別名(備用主機(jī)名)。同一網(wǎng)絡(luò)上的其他容器可以使用服務(wù)名稱(chēng)或此別名來(lái)連接到服務(wù)的任何一個(gè)容器。由于aliases屬于網(wǎng)絡(luò)范圍,因此同一服務(wù)在不同的網(wǎng)絡(luò)上可以具有不同的別名。例如:
services: some-service: networks: some-network: aliases: - alias1 - alias3 other-network: aliases: - alias2
在以下示例中,提供了web、worker和db三個(gè)服務(wù),以及new和legacy兩個(gè)網(wǎng)絡(luò):
version: "3.8" 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:
在該例中,可以通過(guò)主機(jī)名db或database在new網(wǎng)絡(luò)上訪(fǎng)問(wèn)db服務(wù),通過(guò)db或mysql在legacy網(wǎng)絡(luò)上訪(fǎng)問(wèn)db服務(wù)。
注意:網(wǎng)絡(luò)范圍內(nèi)的別名可以被多個(gè)容器甚至多個(gè)服務(wù)共享。如果是這樣,則不能保證名稱(chēng)恰好解析到哪一個(gè)容器。
(2) ipv4_address、ipv6_address
加入網(wǎng)絡(luò)后,為此服務(wù)的容器指定一個(gè)靜態(tài)IP地址。在頂層networks配置項(xiàng)中的相應(yīng)網(wǎng)絡(luò)配置必須有子網(wǎng)配置覆蓋每個(gè)靜態(tài)地址的ipam配置。例如:
version: "3.8" 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"
注意:如果需要IPv6尋址,則必須使用V2.x版本的Compose配置文件并設(shè)置頂層networks配置項(xiàng)下的enable_ipv6選項(xiàng)。在當(dāng)前swarm mode下IPv6選項(xiàng)不會(huì)起作用。
28. pid
跟主機(jī)系統(tǒng)共享進(jìn)程命名空間。
pid: "host"
將PID模式設(shè)置為主機(jī)PID模式,打開(kāi)該選項(xiàng)的容器之間,以及容器和宿主機(jī)操作系統(tǒng)之間可以通過(guò)進(jìn)程ID來(lái)相互訪(fǎng)問(wèn)和操作。
29. ports
暴露端口。注意端口映射與network_mode: host不兼容。支持short和long兩種格式的語(yǔ)法。short語(yǔ)法可以使用HOST:CONTAINER的格式指定端口映射,也可以指定容器端口,宿主機(jī)會(huì)隨機(jī)選擇臨時(shí)端口進(jìn)行映射。例如:
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" - "12400-12500:1240"
注意:當(dāng)使用HOST:CONTAINE格式來(lái)映射端口時(shí),如果使用的容器端口小于60可能會(huì)得到錯(cuò)誤得結(jié)果,因?yàn)閅AML將會(huì)解析xx:yy這種數(shù)字格式為60進(jìn)制,因此建議始終采用字符串格式來(lái)指定端口映射。
long語(yǔ)法支持配置short語(yǔ)法中不支持的附加字段。這些附加字段如下:
- target:指定容器內(nèi)的端口。
- published:指定公開(kāi)的端口。
- protocol:指定端口協(xié)議(tcp或udp)。
- mode:使用host在每個(gè)節(jié)點(diǎn)公開(kāi)一個(gè)主機(jī)端口,或使用ingress對(duì)swarm mode端口進(jìn)行負(fù)載均衡。
示例如下:
ports: - target: 80 published: 8080 protocol: tcp mode: host
long語(yǔ)法在3.2版的配置文件格式中加入
30. restart
指定重啟策略。例如想要在容器退出時(shí)總是會(huì)重啟容器,指定以下重啟策略:
restart: always
一共支持以下重啟策略:
- no:在任何情況下都不會(huì)重啟容器。默認(rèn)的重啟策略。
- always:在容器退出時(shí)總是重啟容器。
- on-failure:在容器以非0狀態(tài)碼退出時(shí)才會(huì)重啟。
- unless-stopped:在容器退出時(shí)總是重啟容器,但是不考慮在Docker守護(hù)進(jìn)程啟動(dòng)時(shí)就已經(jīng)停止了的容器。
使用docker stack deploy時(shí)的注意事項(xiàng):在swarm mode下部署堆棧時(shí),restart配置項(xiàng)將被忽略。
31. secrets
為每個(gè)服務(wù)授予對(duì)保密數(shù)據(jù)(secrets)的訪(fǎng)問(wèn)權(quán)限。支持short和long兩種格式的語(yǔ)法。更多secrets信息,參考secrets。
使用docker stack deploy時(shí)的注意事項(xiàng):該保密數(shù)據(jù)(secret)必須已存在或者在Compose配置文件頂層secrets配置項(xiàng)中定義,否則堆棧部署將失敗。
short語(yǔ)法僅指定secret名稱(chēng)來(lái)授予容器訪(fǎng)問(wèn)secret數(shù)據(jù)的權(quán)限并將其掛載到容器的/run/secrets/<secret_name>上。source名稱(chēng)和目標(biāo)掛載點(diǎn)都設(shè)置為secret名稱(chēng)。例如以下示例,授予了redis服務(wù)對(duì)secrets的my_secret和my_other_secret的訪(fǎng)問(wèn)權(quán)限,其中my_secret的值設(shè)置到文件./my_secret.txt的內(nèi)容中,my_other_secret定義為外部資源,這意味著它已經(jīng)在Docker中通過(guò)運(yùn)行docker secret create命令或其他堆棧部署進(jìn)行定義,如果外部secret不存在,堆棧部署將會(huì)失敗并顯示secret not found錯(cuò)誤:
version: "3.8" 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
long語(yǔ)法提供了在服務(wù)的任務(wù)容器內(nèi)如何創(chuàng)建secret的更多粒度:
- source:Docker中存在的secret名稱(chēng)。
- target:指定要掛載到服務(wù)的任務(wù)容器的/run/secrets/中的文件名稱(chēng)。如果未指定,默認(rèn)為source的值。
- uid和gid:指定服務(wù)的任務(wù)容器的/run/secrets/中所擁有的該文件的UID或GID。如果未指定,兩者都默認(rèn)為0。
- mode:以八進(jìn)制表示法指定要掛載到服務(wù)的任務(wù)容器的/run/secrets/中的文件權(quán)限。例如,0444代表可讀。默認(rèn)值在Docker 1.13.1為0000,在較新版本為0444。secret內(nèi)容已掛載到臨時(shí)文件系統(tǒng)中,所以不可寫(xiě),如果設(shè)置了可寫(xiě)位將被忽略??梢栽O(shè)置可執(zhí)行位。如果不熟悉UNIX文件權(quán)限模式,可以使用權(quán)限計(jì)算器 。
例如以下示例,指定secret名稱(chēng)為my_secret,授予redis服務(wù)對(duì)my_secret的訪(fǎng)問(wèn)權(quán)限,指定要掛載到redis服務(wù)的任務(wù)容器的/run/secrets/中的文件名稱(chēng)為redis_secret,指定UID和GID均為103,指定要掛載到服務(wù)的任務(wù)容器的/run/secrets/中的文件權(quán)限為0440(group-readable),但該redis服務(wù)沒(méi)有訪(fǎng)問(wèn)my_other_secret的權(quán)限:
version: "3.8" 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
可以授予服務(wù)訪(fǎng)問(wèn)多個(gè)secret的權(quán)限,并且可以混合long和short語(yǔ)法。定義secret并不意味著授予服務(wù)對(duì)其的訪(fǎng)問(wèn)權(quán)限。
32. security_opt
為每個(gè)容器覆蓋默認(rèn)的標(biāo)簽(label)。例如配置標(biāo)簽中的用戶(hù)名和角色名:
security_opt: - label:user:USER - label:role:ROLE
使用docker stack deploy時(shí)的注意事項(xiàng):在swarm mode下部署堆棧時(shí),security_opt配置項(xiàng)將被忽略。
33. stop_grace_period
指定在發(fā)送SIGKILL之前,如果容器無(wú)法處理SIGTERM或使用stop_signal指定的任何停止信號(hào)時(shí),試圖停止該容器所需要的等待時(shí)間。默認(rèn)情況下,stop在發(fā)送SIGKILL之前等待10秒以退出容器。時(shí)間指定為duration。具體示例如下:
stop_grace_period: 1s stop_grace_period: 1m30s
34. stop_signal
設(shè)置停止容器的信號(hào)。默認(rèn)使用SIGTERM停止容器。例如指定SIGUSR1信號(hào):
stop_signal: SIGUSR1
35. sysctls
在容器中設(shè)置的內(nèi)核參數(shù)??梢允褂脭?shù)組或字典兩種格式。例如指定連接數(shù)為1024和開(kāi)啟TCP的syncookies:
sysctls: net.core.somaxconn: 1024 net.ipv4.tcp_syncookies: 0 sysctls: - net.core.somaxconn=1024 - net.ipv4.tcp_syncookies=0
使用docker stack deploy時(shí)的注意事項(xiàng):在swarm mode下部署堆棧時(shí),sysctls配置項(xiàng)要求Docker Engine 19.03或以上。
36. tmpfs
在3.6版的配置文件格式中加入
掛載一個(gè)臨時(shí)文件系統(tǒng)到容器內(nèi)部??梢允且粋€(gè)值或一個(gè)列表。例如:
tmpfs: /run 1. tmpfs: - /run - /tmp
在容器內(nèi)掛載一個(gè)臨時(shí)文件系統(tǒng)。Size可以指定掛載的tmpfs大小,以字節(jié)為單位。默認(rèn)情況下不受限制。例如:
- type: tmpfs target: /app tmpfs: size: 1000
使用docker stack deploy時(shí)的注意事項(xiàng):在swarm mode下部署堆棧時(shí)使用3至3.5版本的Compose配置文件,tmpfs配置項(xiàng)將被忽略。
37. ulimits
覆蓋容器的默認(rèn)ulimit值??梢詥我坏貙⑾拗浦翟O(shè)為一個(gè)整數(shù),也可以將soft/hard限制指定為映射。例如,指定最大進(jìn)程數(shù)為65535,指定文件句柄數(shù),其中軟限制為20000,系統(tǒng)硬限制為40000,軟限制應(yīng)用可以隨時(shí)修改,不能超過(guò)硬限制,硬限制只能root用戶(hù)提高:
ulimits: nproc: 65535 nofile: soft: 20000 hard: 40000
38. userns_mode
指定用戶(hù)命名空間模式。如果Docker守護(hù)進(jìn)程配置了用戶(hù)名稱(chēng)空間,則禁用此服務(wù)的用戶(hù)名稱(chēng)空間。以下是使用主機(jī)上的用戶(hù)命名空間的配置示例:
userns_mode: "host"
使用docker stack deploy時(shí)的注意事項(xiàng):在swarm mode下部署堆棧時(shí),userns_mode配置項(xiàng)將被忽略。
39. volumes
指定所掛載的主機(jī)路徑或數(shù)據(jù)卷名稱(chēng)。支持short和long兩種格式的語(yǔ)法。可以將主機(jī)路徑作為單個(gè)服務(wù)的一部分進(jìn)行掛載,而無(wú)需在頂層volumes配置項(xiàng)中定義。但是如果想要在多個(gè)服務(wù)之間重用數(shù)據(jù)卷,需要在頂層volumes配置項(xiàng)中定義一個(gè)數(shù)據(jù)卷名稱(chēng)。
在3版的配置文件格式中的變化:在頂層volumes配置項(xiàng)中定義了數(shù)據(jù)卷名稱(chēng)并從每個(gè)服務(wù)的volumes列表中引用了該數(shù)據(jù)卷。這將替代早期版本的Compose配置文件格式中的volumes_from配置項(xiàng)。
short語(yǔ)法使用通用的[SOURCE:]TARGET[:MODE]格式,SOURCE可以是主機(jī)路徑或數(shù)據(jù)卷名稱(chēng),TARGET為掛載數(shù)據(jù)卷的容器路徑,MODE可以為ro只讀模式或rw讀寫(xiě)模式(默認(rèn))??梢栽谥鳈C(jī)上掛載相對(duì)路徑,該路徑相對(duì)于正在使用的Compose配置文件的目錄進(jìn)行擴(kuò)展,相對(duì)路徑應(yīng)始終以.或..開(kāi)頭。例如:
volumes: #只指定一個(gè)路徑,Docker會(huì)自動(dòng)在創(chuàng)建一個(gè)數(shù)據(jù)卷(這個(gè)路徑是容器內(nèi)部的) - /var/lib/mysql #使用絕對(duì)路徑掛載數(shù)據(jù)卷 - /opt/data:/var/lib/mysql #使用基于Compose配置文件的相對(duì)路徑作為數(shù)據(jù)卷掛載到容器 - ./cache:/tmp/cache #使用基于root用戶(hù)的相對(duì)路徑作為數(shù)據(jù)卷掛載到容器 - ~/configs:/etc/configs/:ro #使用已經(jīng)存在命名的數(shù)據(jù)卷掛載到容器 - datavolume:/var/lib/mysql
long語(yǔ)法支持配置以下short語(yǔ)法中不支持的附加字段:
- type:掛載類(lèi)型,可以為volume、bind、tmpfs或npipe。
- source:掛載源,在主機(jī)上用于綁定掛載的路徑或定義在頂層volumes配置項(xiàng)中的數(shù)據(jù)卷名稱(chēng)。不適用于tmpfs掛載類(lèi)型。
- target:數(shù)據(jù)卷掛載在容器中的路徑。
- read_only:設(shè)置數(shù)據(jù)卷為只讀。
- bind:配置額外的bind選項(xiàng)。
- propagation:用于綁定的傳播模式。
- volume:配置額外的volume選項(xiàng)。
- nocopy:創(chuàng)建數(shù)據(jù)卷時(shí)禁止從容器復(fù)制數(shù)據(jù)。
- tmpfs:配置額外的tmpfs選項(xiàng)。
- size:tmpfs掛載的大小,以字節(jié)為單位。
- consistency:掛載的一致性要求,可以為consistent、cached或delegated。其中consistent表示主機(jī)和容器具有相同視圖。cached表示讀取緩存,主機(jī)視圖是權(quán)威的。delegated表示讀寫(xiě)緩存,容器視圖是權(quán)威的。
例如:
version: "3.8" 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:
40. 其他配置項(xiàng)
此外,還有domainname、hostname、ipc、mac_address、privileged、read_only、shm_size、stdin_open、tty、user和working_dir這些配置項(xiàng)。它們都是單值配置,和docker run中的對(duì)應(yīng)選項(xiàng)類(lèi)似。注意mac_address是舊版本配置項(xiàng)。例如:
#指定容器中運(yùn)行應(yīng)用的用戶(hù)名 user: postgresql #指定容器的工作目錄 working_dir: /code #指定容器中的搜索域名 domainname: foo.com #指定容器中的主機(jī)名 hostname: foo ipc: host #指定容器中的mac地址 mac_address: 02:42:ac:11:65:43 #指定容器為特權(quán)容器 privileged: true #指定以只讀模式掛載容器的root文件系統(tǒng),不能對(duì)容器內(nèi)容進(jìn)行修改 read_only: true #設(shè)置/dev/shm分區(qū)的大小 shm_size: 64M #打開(kāi)標(biāo)準(zhǔn)輸入,可以接受外部輸入 stdin_open: true #分配tty設(shè)備用來(lái)支持終端登錄 tty: true
四、數(shù)據(jù)卷配置
雖然可以聲明即時(shí)生效的數(shù)據(jù)卷作為服務(wù)聲明的一部分,但這部分可以通過(guò)頂層volumes配置項(xiàng)定義一個(gè)數(shù)據(jù)卷以實(shí)現(xiàn)在多個(gè)服務(wù)之間重用,并且可以使用docker命令行或API輕松進(jìn)行檢索和檢查。例如以下示例,數(shù)據(jù)庫(kù)的數(shù)據(jù)目錄作為數(shù)據(jù)卷與另一個(gè)服務(wù)共享以便定期備份:
version: "3.8" services: db: image: db volumes: - data-volume:/var/lib/db backup: image: backup-service volumes: - data-volume:/var/lib/backup/data volumes: data-volume:
頂層volumes配置項(xiàng)下的條目可以為空,這種情況下配置的默認(rèn)驅(qū)動(dòng),默認(rèn)驅(qū)動(dòng)在大多數(shù)情況下為local驅(qū)動(dòng)。下面就對(duì)數(shù)據(jù)卷的相關(guān)配置項(xiàng)進(jìn)行一個(gè)總結(jié)。
1. driver
指定該數(shù)據(jù)卷所要使用的數(shù)據(jù)卷驅(qū)動(dòng)。默認(rèn)為Docker Engine中配置使用的無(wú)論哪種驅(qū)動(dòng),大多數(shù)情況下為local驅(qū)動(dòng)。如果驅(qū)動(dòng)不可用,則引擎會(huì)在docker-compose up嘗試創(chuàng)建數(shù)據(jù)卷時(shí)返回一個(gè)錯(cuò)誤。以下為指定數(shù)據(jù)卷驅(qū)動(dòng)的示例:
driver: foobar
2. driver_opts
以鍵值對(duì)的形式指定用來(lái)傳遞給該數(shù)據(jù)卷所使用的數(shù)據(jù)卷驅(qū)動(dòng)的列表選項(xiàng)。這些選項(xiàng)取決于數(shù)據(jù)卷驅(qū)動(dòng),可以參考數(shù)據(jù)卷驅(qū)動(dòng)程序文檔。例如:
volumes: example: driver_opts: type: "nfs" o: "addr=10.40.0.199,nolock,soft,rw" device: ":/docker/example"
3. external
指定該數(shù)據(jù)卷是否是外部數(shù)據(jù)卷。如果設(shè)置為true,則指定該數(shù)據(jù)卷是在Compose外部創(chuàng)建的。由于docker-compose up不會(huì)嘗試創(chuàng)建該數(shù)據(jù)卷,如果該數(shù)據(jù)卷不存在則會(huì)引發(fā)錯(cuò)誤。在3.3及以下版本的Compose配置文件格式中,external配置項(xiàng)不能與包括driver、driver_opts和labels在內(nèi)的其他數(shù)據(jù)卷配置項(xiàng)同時(shí)使用,在3.4及以上版本中則沒(méi)有此限制。例如以下示例,Compose不會(huì)嘗試創(chuàng)建一個(gè)名為[projectname]_data的數(shù)據(jù)卷,而是查找一個(gè)現(xiàn)存的被簡(jiǎn)單稱(chēng)為data的數(shù)據(jù)卷并將其掛載到db服務(wù)的容器中:
version: "3.8" services: db: image: postgres volumes: - data:/var/lib/postgresql/data volumes: data: external: true
通過(guò)external配置項(xiàng)下的name配置項(xiàng)可以指定數(shù)據(jù)卷的名稱(chēng),該名稱(chēng)與Compose配置文件中用于引用數(shù)據(jù)卷的名稱(chēng)區(qū)分開(kāi)來(lái)。例如:
volumes: data: external: name: actual-name-of-volume
不過(guò)external配置項(xiàng)下的name配置項(xiàng)在3.4版的配置文件格式中就已經(jīng)被棄用了,可以用name配置項(xiàng)替代。
使用docker stack deploy時(shí)的注意事項(xiàng):如果使用docker stack deploy代替docker-compose up以swarm mode啟動(dòng)應(yīng)用,則會(huì)創(chuàng)建不存在的外部數(shù)據(jù)卷。在swarm mode下,服務(wù)定義數(shù)據(jù)卷后將自動(dòng)創(chuàng)建該卷。由于服務(wù)任務(wù)已在新節(jié)點(diǎn)上安排,因此SwarmKit將在本地節(jié)點(diǎn)上創(chuàng)建數(shù)據(jù)卷。
4. labels
將元數(shù)據(jù)以標(biāo)簽的形式添加到容器中??梢允褂脭?shù)組或字典兩種格式。例如:
labels: com.example.description: "Database volume" com.example.department: "IT/Ops" com.example.label-with-empty-value: "" labels: - "com.example.description=Database volume" - "com.example.department=IT/Ops" - "com.example.label-with-empty-value"
5. name
在3.4版的配置文件格式中加入
為該數(shù)據(jù)卷設(shè)置一個(gè)自定義名稱(chēng)。例如:
version: "3.8" volumes: data: name: my-app-data
可以和external配置項(xiàng)一起使用。例如:
version: "3.8" volumes: data: external: true name: my-app-data
五、網(wǎng)絡(luò)配置
通過(guò)頂層networks配置項(xiàng)可以指定要?jiǎng)?chuàng)建的網(wǎng)絡(luò)。下面就對(duì)網(wǎng)絡(luò)的相關(guān)配置項(xiàng)進(jìn)行一個(gè)總結(jié)。
1. driver
指定該網(wǎng)絡(luò)所要使用的驅(qū)動(dòng)。默認(rèn)驅(qū)動(dòng)取決于所使用的Docker Engine的配置方式,但是在大多數(shù)情況下,單個(gè)主機(jī)上用的bridge,Swarm上用的overlay。
bridge:表示橋接,Docker在單個(gè)主機(jī)上默認(rèn)使用bridge網(wǎng)絡(luò)。
overlay:overlay驅(qū)動(dòng)在一個(gè)swarm中的多個(gè)節(jié)點(diǎn)之間創(chuàng)建一個(gè)命名網(wǎng)絡(luò)。
如果驅(qū)動(dòng)不可用,則Docker Engine會(huì)返回一個(gè)錯(cuò)誤。以下為指定卷驅(qū)動(dòng)的示例:
driver: overlay
如果想要使用主機(jī)的網(wǎng)絡(luò)堆棧,或者不使用網(wǎng)絡(luò)。這相當(dāng)于docker run --net = host或docker run --net = none。僅在使用docker stack命令時(shí)使用。如果使用docker-compose命令,需使用服務(wù)配置中的network_mode配置項(xiàng)。如果要在相同構(gòu)建版本的容器上使用特定網(wǎng)絡(luò),需要在服務(wù)配置的build下的network配置項(xiàng)中設(shè)置。例如:
services: web: build: network: host context: .
使用諸如host和none的內(nèi)置網(wǎng)絡(luò)的語(yǔ)法有所不同。定義一個(gè)名為host或none的外部網(wǎng)絡(luò)以及Compose可以使用的別名,然后使用該別名向該網(wǎng)絡(luò)授予服務(wù)訪(fǎng)問(wèn)權(quán)限,而且該外部網(wǎng)絡(luò)在Docker中已經(jīng)自動(dòng)創(chuàng)建。例如以下示例,定義了名為host的外部網(wǎng)絡(luò),Compose中可以使用的別名為hostnet:
version: "3.8" services: web: networks: hostnet: {} networks: hostnet: external: true name: host
例如以下示例,定義了名為none的外部網(wǎng)絡(luò),Compose中可以使用的別名為nonet:
services: web: networks: nonet: {} networks: nonet: external: true name: none
2. driver_opts
以鍵值對(duì)的形式指定用來(lái)傳遞給該網(wǎng)絡(luò)所使用的驅(qū)動(dòng)的列表選項(xiàng)。這些選項(xiàng)取決于驅(qū)動(dòng),可以參考驅(qū)動(dòng)程序文檔。例如:
driver_opts: foo: "bar" baz: 1
3. attachable
在3.2版的配置文件格式中加入
指定是否允許除服務(wù)之外的獨(dú)立容器連接到該網(wǎng)絡(luò)。僅在driver設(shè)置為overlay時(shí)使用。如果設(shè)置為true,則除了服務(wù)之外的獨(dú)立容器也可以連接到該網(wǎng)絡(luò)。如果獨(dú)立容器連接到了overlay網(wǎng)絡(luò),那它可以與那些也從其他Docker守護(hù)進(jìn)程連接到overlay網(wǎng)絡(luò)的服務(wù)和獨(dú)立容器進(jìn)行通信。例如:
networks: mynet1: driver: overlay attachable: true
4. enable_ipv6
在該網(wǎng)絡(luò)上啟用IPv6網(wǎng)絡(luò)。
不支持V3版Compose配置文件:如果要使用enable_ipv6配置項(xiàng),則需要使用V2版Compose配置文件,因?yàn)閟warm mode尚不支持該配置項(xiàng)。
5. ipam
指定自定義IPAM配置。有以下配置選項(xiàng):
driver:自定義IPAM驅(qū)動(dòng)以代替默認(rèn)驅(qū)動(dòng)。
config:包含零個(gè)或多個(gè)配置塊的列表,每個(gè)配置塊可以有以下配置選項(xiàng)。
subnet:設(shè)置表示網(wǎng)段的CIDR格式的子網(wǎng)。
以下為指定自定義IPAM配置的示例:
ipam: driver: default config: - subnet: 172.28.0.0/16
注意:目前,例如gateway等其他IPAM配置僅適用于V2版Compose配置文件。
6. internal
指定是否創(chuàng)建一個(gè)與外部隔離的overlay網(wǎng)絡(luò)。默認(rèn)情況下,Docker也會(huì)將橋接網(wǎng)絡(luò)連接到它以提供外部連接。如果要?jiǎng)?chuàng)建一個(gè)與外部隔離的overlay網(wǎng)絡(luò),需將此配置項(xiàng)設(shè)置為true。
7. labels
將元數(shù)據(jù)以標(biāo)簽的形式添加到容器中??梢允褂脭?shù)組或字典兩種格式。例如:
labels: com.example.description: "Financial transaction network" com.example.department: "Finance" com.example.label-with-empty-value: "" labels: - "com.example.description=Financial transaction network" - "com.example.department=Finance" - "com.example.label-with-empty-value"
8. external
指定該網(wǎng)絡(luò)是否是外部網(wǎng)絡(luò)。如果設(shè)置為true,則指定該網(wǎng)絡(luò)是在Compose外部創(chuàng)建的。由于docker-compose up不會(huì)嘗試創(chuàng)建該網(wǎng)絡(luò),如果該網(wǎng)絡(luò)不存在則會(huì)引發(fā)錯(cuò)誤。在3.3及以下版本的Compose配置文件格式中,external配置項(xiàng)不能與包括driver、driver_opts、ipam和internal等在內(nèi)的其他網(wǎng)絡(luò)配置項(xiàng)同時(shí)使用,在3.4及以上版本中則沒(méi)有此限制。例如以下示例,proxy是通往外界的網(wǎng)關(guān),Compose不會(huì)嘗試創(chuàng)建一個(gè)名為[projectname] _outside的網(wǎng)絡(luò),而是查找一個(gè)現(xiàn)存的被簡(jiǎn)單稱(chēng)為的outside網(wǎng)絡(luò)并將proxy服務(wù)的容器連接到該網(wǎng)絡(luò):
version: "3.8" services: proxy: build: ./proxy networks: - outside - default app: build: ./app networks: - default networks: outside: external: true
通過(guò)external配置項(xiàng)下的name配置項(xiàng)可以指定網(wǎng)絡(luò)的名稱(chēng),該名稱(chēng)與Compose配置文件中用于引用網(wǎng)絡(luò)的名稱(chēng)區(qū)分開(kāi)來(lái)。例如:
networks: outside: external: name: actual-name-of-network
不過(guò)external配置項(xiàng)下的name配置項(xiàng)在3.5版的配置文件格式中就已經(jīng)被棄用了,可以用name配置項(xiàng)替代。
9. name
在3.5版的配置文件格式中加入
為該網(wǎng)絡(luò)設(shè)置一個(gè)自定義名稱(chēng)。例如:
version: "3.8" networks: network1: name: my-app-net
可以和external配置項(xiàng)一起使用。例如:
version: "3.8" networks: network1: external: true name: my-app-net
六、configs配置
頂層configs配置項(xiàng)定義或引用了授予此堆棧中的服務(wù)的configs,config來(lái)源于file或external。下面就對(duì)configs的相關(guān)配置項(xiàng)進(jìn)行一個(gè)簡(jiǎn)單總結(jié)。
- file:通過(guò)指定路徑中的文件內(nèi)容創(chuàng)建config。
- external:如果設(shè)置為true,則指定該config已經(jīng)創(chuàng)建。Docker不會(huì)嘗試創(chuàng)建它,如果它不存在,會(huì)發(fā)生config not found錯(cuò)誤。
- name:指定Docker中config的名稱(chēng)。在3.5版的配置文件格式中加入。
- driver和driver_opts:自定義secret驅(qū)動(dòng)的名稱(chēng),和以鍵值對(duì)的形式指定用來(lái)傳遞給特定驅(qū)動(dòng)的選項(xiàng)。這兩個(gè)配置項(xiàng)均在3.8版的配置文件格式中加入,僅在使用docker stack時(shí)受支持。
template_driver:指定要使用的模板驅(qū)動(dòng)的名稱(chēng),它控制是否以及如何將secret有效負(fù)載作為模板進(jìn)行評(píng)估。如果未設(shè)置驅(qū)動(dòng),則不使用任何模板。當(dāng)前僅支持使用Go語(yǔ)言的golang驅(qū)動(dòng)。該配置項(xiàng)在3.8版的配置文件格式中加入,僅在使用docker stack時(shí)受支持。
七、secrets配置
頂層secrets配置項(xiàng)定義或引用了授予此堆棧中的服務(wù)的secrets,secret來(lái)源于file或external。下面就對(duì)secrets的相關(guān)配置項(xiàng)進(jìn)行一個(gè)簡(jiǎn)單總結(jié)。
- file:通過(guò)指定路徑中的文件內(nèi)容創(chuàng)建secret。
- external:如果設(shè)置為true,則指定該secret已經(jīng)創(chuàng)建。Docker不會(huì)嘗試創(chuàng)建它,如果它不存在,會(huì)發(fā)生secretg not found錯(cuò)誤。
- name:指定Docker中secret的名稱(chēng)。在3.5版的配置文件格式中加入。
- template_driver:指定要使用的模板驅(qū)動(dòng)的名稱(chēng),它控制是否以及如何將secret有效負(fù)載作為模板進(jìn)行評(píng)估。如果未設(shè)置驅(qū)動(dòng),則不使用任何模板。當(dāng)前僅支持使用Go語(yǔ)言的golang驅(qū)動(dòng)。該配置項(xiàng)在3.8版的配置文件格式中加入,僅在使用docker stack時(shí)受支持。
八、擴(kuò)展字段
在3.4版的配置文件格式中加入
可以使用擴(kuò)展字段來(lái)定義可重用的配置片段。這些特殊字段只要位于Compose配置文件的最頂(root)層,可以為任何格式,它們的名稱(chēng)以x-開(kāi)頭。
注意:從3.7版(對(duì)于3.x系列)和2.4版(對(duì)于2.x系列)的配置文件格式開(kāi)始,擴(kuò)展字段可以位于服務(wù)、數(shù)據(jù)卷、網(wǎng)絡(luò)、config和 secret定義部分的root層。
例如以下示例,通過(guò)擴(kuò)展字段x-custom定義一個(gè)可重用的配置片段:
version: '3.4' x-custom: items: - a - b options: max-size: '12m' name: "custom"
這些擴(kuò)展字段內(nèi)容將被Compose忽略,但是可以通過(guò)YAML錨點(diǎn)來(lái)引用擴(kuò)展字段內(nèi)容。例如以下日志記錄配置,希望被多個(gè)服務(wù)引用:
logging: options: max-size: '12m' max-file: '5' driver: json-file
可以通過(guò)&開(kāi)頭的字符串在擴(kuò)展字段x-logging定義的日志記錄配置片段中設(shè)置錨點(diǎn),然后在需要引用該日志記錄配置片段的服務(wù)中以*加上錨點(diǎn)名進(jìn)行引用:
version: '3.4' x-logging: &default-logging options: max-size: '12m' max-file: '5' driver: json-file services: web: image: myapp/web:latest logging: *default-logging db: image: mysql:latest logging: *default-logging
也可以通過(guò)YAML合并來(lái)部分覆蓋擴(kuò)展字段中的值。例如:
version: '3.4' x-volumes: &default-volume driver: foobar-storage services: web: image: myapp/web:latest volumes: ["vol1", "vol2", "vol3"] volumes: vol1: *default-volume vol2: << : *default-volume name: volume02 vol3: << : *default-volume driver: default name: volume-local
九、其他內(nèi)容
1. 指定持續(xù)時(shí)間(durations)
某些配置項(xiàng)如healthcheck配置項(xiàng)的子配置項(xiàng)interval和timeout接受以類(lèi)似如下格式的字符串表示的持續(xù)時(shí)間(durations):
2.5s
10s
1m30s
2h32m
5h34m56s
支持的單位有us、ms、s、m和h。
2. 指定字節(jié)值
某些配置項(xiàng)如build配置項(xiàng)的子配置項(xiàng)shm_size接受以類(lèi)似如下格式的字符串表示的字節(jié)值:
2b
1024kb
2048k
300m
1gb
支持的單位有b、k或kb、m或mb、g或gb。目前不支持十進(jìn)制。
3. 變量替換
配置項(xiàng)中的值可以包含環(huán)境變量,Compose會(huì)使用運(yùn)行docker-compose時(shí)所在的shell中的環(huán)境變量值來(lái)替換Compose配置文件中的環(huán)境變量,VARIABLE和VARIABLE這兩種語(yǔ)法都支持。例如以下示例,假設(shè)shell中有POSTGRES_VERSION=9.3這個(gè)環(huán)境變量,則配置中的${POSTGRES_VERSION}將被替換為9.3:
db: image: "postgres:${POSTGRES_VERSION}"
如果未設(shè)置環(huán)境變量,則Compose會(huì)將配置文件中的環(huán)境變量替換為空字符串。如果上例中的POSTGRES_VERSION未設(shè)置,則image的值為postgres:??梢允褂?env環(huán)境文件為環(huán)境變量設(shè)置默認(rèn)值,不過(guò)shell中的環(huán)境變量值會(huì)覆蓋.env環(huán)境文件中設(shè)置的值。
使用docker stack deploy時(shí)的注意事項(xiàng):.env環(huán)境文件僅在使用docker-compose up命令時(shí)有效,不適用于docker stack deploy。
此外,可以使用典型的shell語(yǔ)法提供內(nèi)聯(lián)默認(rèn)值,支持以下兩種語(yǔ)法:
${VARIABLE:-default}:如果VARIABLE未設(shè)置或?yàn)榭?,則會(huì)應(yīng)用default的值。
${VARIABLE-default}:僅當(dāng)VARIABLE未設(shè)置時(shí)才會(huì)應(yīng)用default的值。
同樣,也可以使用以下兩種語(yǔ)法來(lái)強(qiáng)制要求變量必須賦值:
${VARIABLE:?err}:如果VARIABLE未設(shè)置或?yàn)榭眨顺霾⑤敵鲆粭l包含err的錯(cuò)誤信息。
${VARIABLE?err}:如果VARIABLE未設(shè)置,退出并輸出一條包含err的錯(cuò)誤信息。
當(dāng)配置中需要符號(hào)時(shí),可以使用符號(hào)。也可以防止Compose插值,因此$ 可以引用不想由Compose處理的環(huán)境變量。例如以下示例,就算設(shè)置了環(huán)境變量VAR_NOT_INTERPOLATED_BY_COMPOSE,Compose配置文件中的VAR_NOT_INTERPOLATED_BY_COMPOSE也不會(huì)被替換:
web: build: . command: "$$VAR_NOT_INTERPOLATED_BY_COMPOSE"
如果少指定了一個(gè),也就是只使用單個(gè)符號(hào),則Compose會(huì)將值解釋為環(huán)境變量,并出現(xiàn)一個(gè)類(lèi)似The VAR_NOT_INTERPOLATED_BY_COMPOSE is not set. Substituting an empty string.這樣的警告。
到此這篇關(guān)于Docker配置文件docker-compose.yml使用指南的文章就介紹到這了,更多相關(guān) docker-compose.yml 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
docker學(xué)習(xí)筆記之把容器commit成鏡像的方法
本篇文章主要介紹了docker學(xué)習(xí)筆記之把容器commit成鏡像,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05CentOS服務(wù)器部署Docker+Jenkins持續(xù)集成環(huán)境的方法
本文詳細(xì)介紹在CentOS服務(wù)器上部署Docker和Jenkins持續(xù)集成環(huán)境的步驟,涵蓋了準(zhǔn)備工作、安裝Docker、配置Docker鏡像加速、安裝Jenkins、配置Jenkins以及集成Docker與Jenkins,通過(guò)這些步驟,讀者可以實(shí)現(xiàn)代碼的持續(xù)集成與快速部署,提高軟件開(kāi)發(fā)效率,感興趣的朋友一起看看吧2025-02-02docker swarm 集群創(chuàng)建過(guò)程
通過(guò)docker swarm 工具將一臺(tái)或者多臺(tái)安裝了docker的服務(wù)器組成一個(gè)完整的集群,該集群中的node節(jié)點(diǎn)可以通過(guò)Leader節(jié)點(diǎn)管理,這篇文章主要介紹了docker swarm 集群創(chuàng)建,需要的朋友可以參考下2024-03-03Docker出現(xiàn)Cannot connect to the Docker daemon. Is the docker d
這篇文章主要介紹了Docker出現(xiàn)Cannot connect to the Docker daemon. Is the docker daemon running on this host錯(cuò)誤解決辦法的相關(guān)資料,需要的朋友可以參考下2016-12-12詳解利用nginx和docker實(shí)現(xiàn)一個(gè)簡(jiǎn)易的負(fù)載均衡
本篇文章主要介紹了利用nginx和docker實(shí)現(xiàn)一個(gè)簡(jiǎn)易的負(fù)載均衡 ,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06Docker容器生命周期 | kill和 stop的區(qū)別與聯(lián)系 | d
這篇文章主要介紹了Docker容器生命周期 | kill和 stop的區(qū)別與聯(lián)系 | docker pause/ unpause,本講內(nèi)容是從?Docker入門(mén)到進(jìn)階里面抽離出來(lái)的內(nèi)容,從而使原文更加有序、重點(diǎn)突出,需要的朋友可以參考下2023-08-08