docker-compose編排語(yǔ)法及使用說(shuō)明
一、前言
Compose 是一個(gè)用于定義和運(yùn)行多容器 Docker 的工具。借助 Compose,您可以使用 YAML 文件來(lái)配置應(yīng)用程序的服務(wù)。
使用 Compose 基本上分為三步:
- 使用 Dockerfile 定義您的應(yīng)用程序的環(huán)境
- 使用 docker-compose.yml 定義組成您的應(yīng)用程序的服務(wù)
- 運(yùn)行docker compose up啟動(dòng)并運(yùn)行程序
compose 的優(yōu)點(diǎn)
- 在單個(gè)主機(jī)上建立多個(gè)隔離環(huán)境,Compose 使用項(xiàng)目名稱將環(huán)境彼此隔離。您可以在多個(gè)不同的上下文中使用此項(xiàng)目名稱。默認(rèn)項(xiàng)目名稱是項(xiàng)目目錄的基本名稱。您可以使用-p 命令行選項(xiàng)或 - COMPOSE_PROJECT_NAME 環(huán)境變量設(shè)置自定義項(xiàng)目名稱 。默認(rèn)項(xiàng)目目錄是 Compose 文件的基本目錄??梢允褂?ndash;project-directory 命令行選項(xiàng)自定義項(xiàng)目目錄。
- 創(chuàng)建容器時(shí)保留卷數(shù)據(jù)
- 僅重新創(chuàng)建已更改的容器,當(dāng)您重新啟動(dòng)未更改的服務(wù)時(shí),Compose 會(huì)使用現(xiàn)有容器。
- 變量在環(huán)境之間組合重復(fù)使用
多個(gè)配置文件
我們可認(rèn)為同一個(gè)項(xiàng)目配置多個(gè)compose文件,使用多個(gè) Compose 文件使您能夠針對(duì)不同的環(huán)境或不同的工作流程自定義 Compose 應(yīng)用程序。
默認(rèn)情況下,Compose 讀取兩個(gè)文件,docker-compose.yml和一個(gè)可選的docker-compose.override.yml文件。按照慣例,docker-compose.yml包含您的基本配置。override.yml 文件,顧名思義,就是包含現(xiàn)有服務(wù)或全新服務(wù)的配置覆蓋。
如果在兩個(gè)文件中都定義了服務(wù),Compose 會(huì)使用 override 進(jìn)行合并配置。
要使用多個(gè)覆蓋文件或具有不同名稱的覆蓋文件,您可以使用該-f選項(xiàng)來(lái)指定文件列表。Compose 按照在命令行中指定的順序合并文件。
當(dāng)您使用多個(gè)配置文件時(shí),您必須確保文件中的所有路徑都相對(duì)于基本 Compose 文件( 指定的第一個(gè) Compose 文件-f)
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
二、Docker Compose 配置文件的構(gòu)建參數(shù)說(shuō)明
version
版本信息,定義關(guān)乎于docker的兼容性,Compose 文件格式有3個(gè)版本,分別為1, 2.x 和 3.x
build
服務(wù)除了可以基于指定的鏡像,還可以基于一份 Dockerfile,在使用 up 啟動(dòng)之時(shí)執(zhí)行構(gòu)建任務(wù),這個(gè)構(gòu)建標(biāo)簽就是 build,它可以指定 Dockerfile 所在文件夾的路徑。Compose 將會(huì)利用它自動(dòng)構(gòu)建這個(gè)鏡像,然后使用這個(gè)鏡像啟動(dòng)服務(wù)容器。
build 可以指定為包含構(gòu)建上下文路徑的字符串:
version:"3.7"
services:
webapp:
build:./dir或者,作為具有在上下文中指定的路徑的對(duì)象以及可選的Dockerfile和args:
version:"3.7"
services:
webapp:
build:
context:./dir
dockerfile:Dockerfile-alternate
args:
buildno:1如果你指定image以及build,則使用以下指定的webapp和可選項(xiàng)對(duì)構(gòu)建的鏡像進(jìn)行命名:
這會(huì)在./dir目錄下生成一個(gè)名為webapp和標(biāo)記的鏡像tag。
build:./dir image:webapp:tag
context
context 選項(xiàng)可以是 Dockerfile 的文件路徑,也可以是到鏈接到 git 倉(cāng)庫(kù)的 url。
當(dāng)提供的值是相對(duì)路徑時(shí),它被解析為相對(duì)于撰寫(xiě)文件的路徑,此目錄也是發(fā)送到 Docker 守護(hù)進(jìn)程的 context。
build: context:./dir
dockerfile
使用此 dockerfile 文件來(lái)構(gòu)建,必須指定構(gòu)建路徑。
build: context:. dockerfile:Dockerfile-alternate
args
添加構(gòu)建參數(shù),這些參數(shù)是僅在構(gòu)建過(guò)程中可訪問(wèn)的環(huán)境變量。
首先,在Dockerfile中指定參數(shù):
ARG buildno ARG gitcommithash RUN echo "Build number: $buildno" RUN echo "Based on commit: $gitcommithash"
然后在build鍵下指定參數(shù),可以傳遞映射或列表:
build:
context:.
args:
buildno:1
gitcommithash:cdc3b19
build:
context:.
args:
- buildno=1
- gitcommithash=cdc3b19注意:在Dockerfile中,如果ARG在FROM指令之前指定, ARG則在構(gòu)建說(shuō)明中不可用FROM。如果您需要在兩個(gè)位置都可以使用參數(shù),請(qǐng)?jiān)贔ROM指令下指定它。
你可以在指定構(gòu)建參數(shù)時(shí)省略該值,在這種情況下,它在構(gòu)建時(shí)的值是運(yùn)行Compose的環(huán)境中的值。
args: - buildno - gitcommithash
注意:YAML布爾值(true,false,yes,no,on,off)必須用引號(hào)括起來(lái),這樣分析器會(huì)將它們解釋為字符串。
cache_from
編寫(xiě)緩存解析鏡像列表,此選項(xiàng)是v3.2中的新選項(xiàng)。
build:
context:.
cache_from:
- alpine:latest
- corp/web_app:3.14labels
使用 Docker標(biāo)簽 將元數(shù)據(jù)添加到生成的鏡像中,可以使用數(shù)組或字典。
建議使用反向 DNS 標(biāo)記來(lái)防止簽名與其他軟件所使用的簽名沖突,此選項(xiàng)是v3.3中的新選項(xiàng)。
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"
shm_size
設(shè)置容器 /dev/shm 分區(qū)的大小,值為表示字節(jié)的整數(shù)值或表示字符的字符串
build: context:. shm_size:'2gb' build: context:. shm_size:10000000
target
根據(jù)對(duì)應(yīng)的 Dockerfile 構(gòu)建指定 Stage
build: context:. target:prod
cap_add,cap_drop
添加或刪除容器功能
cap_add: - ALL cap_drop: - NET_ADMIN - SYS_ADMIN
注意:當(dāng)用(Version 3) Compose 文件在群集模式下部署堆棧時(shí),該選項(xiàng)被忽略。因?yàn)?docker stack 命令只接受預(yù)先構(gòu)建的鏡像
command
覆蓋容器啟動(dòng)后默認(rèn)執(zhí)行的命令
command:bundle exec thin -p 3000
該命令也可以是一個(gè)列表,方式類似于dockerfile:
command:["bundle","exec","thin","-p","3000"]
configs
使用服務(wù) configs 配置為每個(gè)服務(wù)賦予相應(yīng)的訪問(wèn)權(quán)限,支持兩種不同的語(yǔ)法
- SHORT 語(yǔ)法
SHORT 語(yǔ)法只能指定配置名稱,這允許容器訪問(wèn)配置并將其安裝在 /<config_name> 容器內(nèi),源名稱和目標(biāo)裝入點(diǎn)都設(shè)為配置名稱。
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以上實(shí)例使用 SHORT 語(yǔ)法將 redis 服務(wù)訪問(wèn)授予 my_config 和 my_other_config ,并被 my_other_config 定義為外部資源,這意味著它已經(jīng)在 Docker 中定義??梢酝ㄟ^(guò) docker config create 命令或通過(guò)另一個(gè)堆棧部署。如果外部部署配置都不存在,則堆棧部署會(huì)失敗并出現(xiàn) config not found 錯(cuò)誤。
注意: config 定義僅在 3.3 版本或在更高版本的撰寫(xiě)文件格式中受支持,YAML 的布爾值(true, false, yes, no, on, off)必須要使用引號(hào)引起來(lái)(單引號(hào)、雙引號(hào)均可),否則會(huì)當(dāng)成字符串解析。
LONG 語(yǔ)法
LONG 語(yǔ)法提供了創(chuàng)建服務(wù)配置的更加詳細(xì)的信息。
- source:Docker 中存在的配置的名稱
- target:要在服務(wù)的任務(wù)中裝載的文件的路徑或名稱。如果未指定則默認(rèn)為 /
- uid 和 gid:在服務(wù)的任務(wù)容器中擁有安裝的配置文件的數(shù)字 UID 或 GID。如果未指定,則默認(rèn)為在Linux上。Windows不支持。
- mode:在服務(wù)的任務(wù)容器中安裝的文件的權(quán)限,以八進(jìn)制表示法。例如,0444 代表文件可讀的。默認(rèn)是 0444。如果配置文件無(wú)法寫(xiě)入,是因?yàn)樗鼈儼惭b在臨時(shí)文件系統(tǒng)中,所以如果設(shè)置了可寫(xiě)位,它將被忽略。可執(zhí)行位可以設(shè)置。如果您不熟悉 UNIX 文件權(quán)限模式,Unix Permissions Calculator
下面示例在容器中將 my_config 名稱設(shè)置為 redis_config,將模式設(shè)置為 0440(group-readable)并將用戶和組設(shè)置為 103。該redis服務(wù)無(wú)法訪問(wèn) 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可以同時(shí)授予多個(gè)配置的服務(wù)相應(yīng)的訪問(wèn)權(quán)限,也可以混合使用 LONG 和 SHORT 語(yǔ)法。定義配置并不意味著授予服務(wù)訪問(wèn)權(quán)限。
container_name
為自定義的容器指定一個(gè)名稱,而不是使用默認(rèn)的名稱
container_name:my-web-container
由于Docker容器名稱必須是唯一的,因此如果指定了自定義名稱,則無(wú)法將服務(wù)擴(kuò)展到1個(gè)容器之外。試圖這樣做會(huì)導(dǎo)致錯(cuò)誤。
depends_on
容器中服務(wù)之間的依賴關(guān)系,依賴關(guān)系會(huì)導(dǎo)致以下行為:
- docker-compose up以依賴順序啟動(dòng)服務(wù)。在以下示例中,db并redis在之前啟動(dòng)web。
- docker-compose up SERVICE自動(dòng)包含SERVICE依賴項(xiàng)。在以下示例中,docker-compose up web還創(chuàng)建并啟動(dòng)db和redis。
- docker-compose stop按依賴順序停止服務(wù)。在以下示例中,web在db和之前停止redis
version:"3.7"
services:
web:
build:.
depends_on:
- db
- redis
redis:
image:redis
db:
image:postgres使用時(shí)需要注意以下幾點(diǎn)depends_on:
depends_on不會(huì)在啟動(dòng)web之前等待db和redis“就緒”
版本3不再支持condition形式depends_on。
deploy
指定與部署和運(yùn)行服務(wù)相關(guān)的配置。
version:"3.7"
services:
redis:
image:redis:alpine
deploy:
replicas:6
update_config:
parallelism:2
delay:10s
restart_policy:
condition:on-failure有幾個(gè)子選項(xiàng)可供選擇:
endpoint_mode(第一個(gè))
endpoint_mode:指定連接到群組外部客戶端服務(wù)發(fā)現(xiàn)方法
endpoint_mode:vip :Docker 為該服務(wù)分配了一個(gè)虛擬 IP(VIP),作為客戶端的 “前端“ 部位用于訪問(wèn)網(wǎng)絡(luò)上的服務(wù)。
endpoint_mode: dnsrr : DNS輪詢(DNSRR)服務(wù)發(fā)現(xiàn)不使用單個(gè)虛擬 IP。Docker為服務(wù)設(shè)置 DNS 條目,使得服務(wù)名稱的 DNS 查詢返回一個(gè) IP 地址列表,并且客戶端直接連接到其中的一個(gè)。如果想使用自己的負(fù)載平衡器,或者混合 Windows 和 Linux 應(yīng)用程序,則 DNS 輪詢調(diào)度(round-robin)功能就非常實(shí)用。
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:labels(第二種)
指定服務(wù)的標(biāo)簽,這些標(biāo)簽僅在服務(wù)上設(shè)置
version:"3.7"
services:
web:
image:web
deploy:
labels:
com.example.description:"Thislabelwillappearonthewebservice"通過(guò)將 deploy 外面的 labels 標(biāo)簽來(lái)設(shè)置容器上的 labels
version:"3.7"
services:
web:
image:web
labels:
com.example.description:"Thislabelwillappearonallcontainersforthewebservice"mode(第三種)
global:每個(gè)集節(jié)點(diǎn)只有一個(gè)容器
replicated:指定容器數(shù)量(默認(rèn))
version:"3.7"
services:
worker:
image:dockersamples/examplevotingapp_worker
deploy:
mode:globalplacement(第四種)
指定 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.zonereplicas(第五種)
如果服務(wù)是 replicated(默認(rèn)),需要指定運(yùn)行的容器數(shù)量
version:"3.7"
services:
worker:
image:dockersamples/examplevotingapp_worker
networks:
- frontend
- backend
deploy:
mode:replicated
replicas:6resources(第六種)
配置資源限制
version:"3.7"
services:
redis:
image:redis:alpine
deploy:
resources:
limits:
cpus:'0.50'
memory:50M
reservations:
cpus:'0.25'
memory:20M例子中,redis 服務(wù)限制使用不超過(guò) 50M 的內(nèi)存和 0.50(50%)可用處理時(shí)間(CPU),并且保留 20M 了內(nèi)存和 0.25 CPU時(shí)間。
devices
設(shè)置映射列表,與 Docker 客戶端的 --device 參數(shù)類似
devices: - "/dev/ttyUSB0:/dev/ttyUSB0"
dns
自定義 DNS 服務(wù)器,與 --dns 具有一樣的用途,可以是單個(gè)值或列表
dns:8.8.8.8 dns: - 8.8.8.8 - 9.9.9.9
dns_search
自定義 DNS 搜索域,可以是單個(gè)值或列表
dns_search:example.com dns_search: - dc1.example.com - dc2.example.com
entrypoint
在 Dockerfile 中有一個(gè)指令叫做 ENTRYPOINT 指令,用于指定接入點(diǎn)。在 docker-compose.yml 中可以定義接入點(diǎn),覆蓋 Dockerfile 中的定義
entrypoint:/code/entrypoint.sh
入口點(diǎn)也可以是一個(gè)列表,方式類似于 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
env_file
從文件中添加環(huán)境變量??梢允菃蝹€(gè)值或是列表
如果已經(jīng)用 docker-compose -f FILE 指定了 Compose 文件,那么 env_file 路徑值為相對(duì)于該文件所在的目錄
但 environment 環(huán)境中的設(shè)置的變量會(huì)會(huì)覆蓋這些值,無(wú)論這些值未定義還是為 None
env_file:.env
env_file:
- ./common.env
- ./apps/web.env
-/opt/secrets.env
a.env 文件
# a.env VAR=1
b.env文件
# b.env VAR=hello
對(duì)于在文件a.env 中指定的相同變量但在文件 b.env 中分配了不同的值,如果 b.env 像下面列在 a.env 之后,則剛在 a.env 設(shè)置的值被 b.env 相同變量的值覆蓋,此時(shí) $VAR 值為 hello。此外,這里所說(shuō)的環(huán)境變量是對(duì)宿主機(jī)的 Compose 而言的,如果在配置文件中有 build 操作,這些變量并不會(huì)進(jìn)入構(gòu)建過(guò)程中,如果要在構(gòu)建中使用變量還是首選 arg 標(biāo)簽。
environment
添加環(huán)境變量,可以使用數(shù)組或字典。與上面的 env_file 選項(xiàng)完全不同,反而和 arg 有幾分類似,這個(gè)標(biāo)簽的作用是設(shè)置鏡像變量,它可以保存變量到鏡像里面,也就是說(shuō)啟動(dòng)的容器也會(huì)包含這些變量設(shè)置,這是與 arg 最大的不同。
一般 arg 標(biāo)簽的變量?jī)H用在構(gòu)建過(guò)程中。而 environment 和 Dockerfile 中的 ENV 指令一樣會(huì)把變量一直保存在鏡像、容器中,類似 docker run -e 的效果。
environment: RACK_ENV:development SHOW:'true' SESSION_SECRET: environment: - RACK_ENV=development - SHOW=true - SESSION_SECRET
expose
暴露端口,但不映射到宿主機(jī),只被連接的服務(wù)訪問(wèn)。這個(gè)標(biāo)簽與 Dockerfile 中的 EXPOSE 指令一樣,用于指定暴露的端口,但是只是作為一種參考,實(shí)際上 docker-compose.yml 的端口映射還得 ports 這樣的標(biāo)簽
expose: - "3000" - "8000"
image
從指定的鏡像中啟動(dòng)容器,可以是存儲(chǔ)倉(cāng)庫(kù)、標(biāo)簽以及鏡像 ID。
如果鏡像不存在,Compose 會(huì)自動(dòng)拉去鏡像。
image: redis image: ubuntu:14.04 image: tutum/influxdb image: example-registry.com:4000/postgresql image: a4bc65fd
init
在容器內(nèi)運(yùn)行init,轉(zhuǎn)發(fā)信號(hào)并重新獲得進(jìn)程。將此選項(xiàng)設(shè)置true是為服務(wù)啟用此功能。
version:"3.7"
services:
web:
image:alpine:latest
init:true
links
鏈接到其它服務(wù)的中的容器,可以指定服務(wù)名稱也可以指定鏈接別名(SERVICE:ALIAS),與 Docker 客戶端的 --link 有一樣效果,會(huì)連接到其它服務(wù)中的容器。
web:
links:
- db
- db:database
- redis
logging
配置日志服務(wù)
logging: driver:syslog options: syslog-address:"tcp://192.168.59.5:123"
該 driver值是指定服務(wù)器的日志記錄驅(qū)動(dòng)程序,默認(rèn)值為 json-file,與 --log-diver 選項(xiàng)一樣
driver: "json-file" driver: "syslog" driver: "none"
注意:只有驅(qū)動(dòng)程序 json-file 和 journald 驅(qū)動(dòng)程序可以直接從 docker-compose up 和 docker-compose logs 獲取日志。使用任何其他方式不會(huì)顯示任何日志。
對(duì)于可選值,可以使用 options 指定日志記錄中的日志記錄選項(xiàng)
driver:"syslog" options: syslog-address:"tcp://192.168.0.42:123"
默認(rèn)驅(qū)動(dòng)程序 json-file 具有限制存儲(chǔ)日志量的選項(xiàng),所以,使用鍵值對(duì)來(lái)獲得最大存儲(chǔ)大小以及最小存儲(chǔ)數(shù)量
driver: "json-file" options: max-size:"200k" max-file:"10"
上面實(shí)例將存儲(chǔ)日志文件,直到它們達(dá)到max-size:200kB,存儲(chǔ)的單個(gè)日志文件的數(shù)量由該 max-file 值指定。隨著日志增長(zhǎng)超出最大限制,舊日志文件將被刪除以存儲(chǔ)新日志
docker-compose.yml 限制日志存儲(chǔ)的示例
version:"3.7"
services:
some-service:
image:some-service
logging:
driver:"json-file"
options:
max-size:"200k"
max-file:"10"
network_mode
網(wǎng)絡(luò)模式,用法類似于 Docke 客戶端的 --net 選項(xiàng),格式為: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]"
networks
加入指定網(wǎng)絡(luò)
services:
some-service:
networks:
- some-network
- other-network
#####aliases
同一網(wǎng)絡(luò)上的其他容器可以使用服務(wù)器名稱或別名來(lái)連接到其他服務(wù)的容器,相同的服務(wù)可以在不同的網(wǎng)絡(luò)有不同的別名。
services:
some-service:
networks:
some-network:
aliases:
- alias1
- alias3
other-network:
aliases:
- alias2
下面實(shí)例中,提供 web 、worker以及db 服務(wù),伴隨著兩個(gè)網(wǎng)絡(luò) 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:
ipv4_address、ipv6_address
為服務(wù)的容器指定一個(gè)靜態(tài) 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"
pid
將 PID 模式設(shè)置為主機(jī) PID 模式,可以打開(kāi)容器與主機(jī)操作系統(tǒng)之間的共享 PID 地址空間。使用此標(biāo)志啟動(dòng)的容器可以訪問(wèn)和操作宿主機(jī)的其他容器,反之亦然
pid: "host"
ports
映射端口
- SHORT 語(yǔ)法
- 可以使用 HOST:CONTAINER 的方式指定端口,也可以指定容器端口(選擇臨時(shí)主機(jī)端口),宿主機(jī)會(huì)隨機(jī)映射端口
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"
注意:當(dāng)使用 HOST:CONTAINER 格式來(lái)映射端口時(shí),如果使用的容器端口小于60可能會(huì)得到錯(cuò)誤得結(jié)果,因?yàn)閅AML 將會(huì)解析 xx:yy 這種數(shù)字格式為 60 進(jìn)制,所以建議采用字符串格式。
- LONG 語(yǔ)法
- LONG 語(yǔ)法支持 SHORT 語(yǔ)法不支持的附加字段
- target:容器內(nèi)的端口
- published:公開(kāi)的端口
- protocol: 端口協(xié)議(tcp 或 udp)
- mode:通過(guò)host 用在每個(gè)節(jié)點(diǎn)還是哪個(gè)發(fā)布的主機(jī)端口或使用 ingress 用于集群模式端口進(jìn)行平衡負(fù)載
- LONG 語(yǔ)法支持 SHORT 語(yǔ)法不支持的附加字段
ports:
- target:80
published:8080
protocol:tcp
mode:host
restart
默認(rèn)值為 no ,即在任何情況下都不會(huì)重新啟動(dòng)容器;當(dāng)值為 always 時(shí),容器總是重新啟動(dòng);當(dāng)值為 on-failure 時(shí),當(dāng)出現(xiàn) on-failure 報(bào)錯(cuò)容器退出時(shí),容器重新啟動(dòng)。
restart: "no" restart: always restart: on-failure restart: unless-stopped
volumes
掛載一個(gè)目錄或者一個(gè)已存在的數(shù)據(jù)卷容器,可以直接使用 HOST:CONTAINER 這樣的格式,或者使用 HOST:CONTAINER:ro 這樣的格式,后者對(duì)于容器來(lái)說(shuō),數(shù)據(jù)卷是只讀的,這樣可以有效保護(hù)宿主機(jī)的文件系統(tǒng)
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:
此示例顯示服務(wù)使用的命名卷(mydata)web以及為單個(gè)服務(wù)(db服務(wù) 下的第一個(gè)路徑volumes)定義的綁定安裝。該db服務(wù)還使用名為dbdata(db服務(wù)中的第二個(gè)路徑volumes)的命名卷,但使用舊字符串格式定義它以安裝命名卷。必須在頂級(jí)volumes鍵下列出命名卷
SHORT語(yǔ)法
- 可以選擇在主機(jī)(HOST:CONTAINER)或訪問(wèn)模式(HOST:CONTAINER:ro)上指定路徑。
- 可以在主機(jī)上掛載相對(duì)路徑,該路徑相對(duì)于正在使用的 Compose 配置文件的目錄進(jìn)行擴(kuò)展。相對(duì)路徑應(yīng)始終以 . 或 … 開(kāi)頭
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
LONG語(yǔ)法
LONG 語(yǔ)法有些附加字段
- type:安裝類型,可以為 volume、bind 或 tmpfs
- source:安裝源,主機(jī)上用于綁定安裝的路徑或定義在頂級(jí) volumes密鑰中卷的名稱 ,不適用于 tmpfs 類型安裝。
- target:卷安裝在容器中的路徑
- read_only:標(biāo)志將卷設(shè)置為只讀
- bind:配置額外的綁定選項(xiàng)
- propagation:用于綁定的傳播模式
- volume:配置其他卷選項(xiàng)
- nocopy:創(chuàng)建卷時(shí)禁止從容器復(fù)制數(shù)據(jù)的標(biāo)志
- tmpfs:配置額外的 tmpfs 選項(xiàng)
- size:tmpfs 的大小,以字節(jié)為單位
- consistent:完全一致。容器運(yùn)行時(shí)和主機(jī)始終保持相同的安裝視圖。這是默認(rèn)值。
- cached:主機(jī)的mount視圖是權(quán)威的。在主機(jī)上進(jìn)行的更新在容器中可見(jiàn)之前可能會(huì)有延遲。
- delegated:容器運(yùn)行時(shí)的mount視圖是權(quán)威的。在容器中進(jìn)行的更新在主機(jī)上可見(jiàn)之前可能會(huì)有延遲。
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:總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
docker容器內(nèi)要啟動(dòng)兩個(gè)進(jìn)程時(shí)Dockerfile的實(shí)現(xiàn)代碼
這篇文章主要介紹了docker容器內(nèi)要啟動(dòng)兩個(gè)進(jìn)程時(shí)Dockerfile的實(shí)現(xiàn)代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11
Docker無(wú)法連接到官方鏡像倉(cāng)庫(kù)常見(jiàn)原因及解決辦法
在軟件開(kāi)發(fā)和部署過(guò)程中,Docker已經(jīng)成為一個(gè)廣泛使用的容器化解決方案,下面這篇文章主要介紹了Docker無(wú)法連接到官方鏡像倉(cāng)庫(kù)常見(jiàn)原因及解決辦法的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2026-02-02
Idea通過(guò)docker compose?發(fā)布項(xiàng)目的過(guò)程
這篇文章主要介紹了Idea結(jié)合docker-compose發(fā)布項(xiàng)目,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08
Docker部署Jirafeau文件共享工具的實(shí)現(xiàn)步驟
Jirafeau 是一款開(kāi)源的文件分享工具,為用戶提供簡(jiǎn)單、快速的一鍵式文件上傳與分享服務(wù),本文就來(lái)介紹一下Docker部署Jirafeau文件共享工具的實(shí)現(xiàn)步驟,感興趣的可以了解一下2025-07-07
docker?運(yùn)行花生殼實(shí)現(xiàn)內(nèi)外網(wǎng)穿透的詳細(xì)過(guò)程
這篇文章主要介紹了docker?運(yùn)行花生殼實(shí)現(xiàn)內(nèi)外網(wǎng)穿透,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03

