1、build:指定dockerfile的上下文路徑,或詳細(xì)配置的對(duì)象。示例如下:
version: "3.9"
services:
webapp:
build:
context: ./dir
dockerfile: Dockerfile-alternate
args:
buildno: 1
context 上下文路徑,可以是文件路徑,也可以是到鏈接到 git 倉(cāng)庫(kù)的 url。當(dāng)是相對(duì)路徑時(shí),它被解釋為相對(duì)于 Compose 文件的位置。
dockerfile 指定構(gòu)建鏡像的 Dockerfile 文件名
args 構(gòu)建參數(shù),在構(gòu)建過(guò)程中訪問(wèn)的環(huán)境變量
cache_from 緩存解析鏡像列表
labels 設(shè)置構(gòu)建鏡像的元數(shù)據(jù)
network 設(shè)置網(wǎng)絡(luò)容器連接,none 表示在構(gòu)建期間禁用網(wǎng)絡(luò)
shm_size 設(shè)置/dev/shm此構(gòu)建容器的分區(qū)大小
target 多階段構(gòu)建,可以指定構(gòu)建哪一層
2、network:自定義網(wǎng)絡(luò)。一般的Compose為您的應(yīng)用程序設(shè)置單個(gè)網(wǎng)絡(luò)。services 服務(wù)的每個(gè)容器都加入默認(rèn)網(wǎng)絡(luò),并且可以被該網(wǎng)絡(luò)上的其他容器訪問(wèn)。
應(yīng)用程序網(wǎng)絡(luò)的名稱基于“項(xiàng)目名稱”,也就是其所在目錄的名稱。可以使用 --project-name 命令行選項(xiàng) 或 COMPOSE_PROJECT_NAME 環(huán)境變量覆蓋項(xiàng)目名稱。
例如:version: "3.9"
services:
web:
build: . #當(dāng)前目錄
ports:
- "8000:8000"
db:
image: postgres
ports:
- "8001:5432" #8001宿主機(jī)端口 5432(postgres默認(rèn)端口)即是容器端口
執(zhí)行docker-compose up即創(chuàng)建項(xiàng)目名稱(項(xiàng)目路徑)_default網(wǎng)絡(luò)并將web和db加入網(wǎng)絡(luò)
每個(gè)Sevices配置下也可以指定network配置,來(lái)指定一級(jí)配置的網(wǎng)絡(luò)。如下所示:
version: "3"
services:
proxy:
build: ./proxy
networks:
- frontend
app:
build: ./app
networks:
- frontend
- backend
db:
image: postgres
networks:
- backend
networks:
frontend:
# Use a custom driver
driver: custom-driver-1
backend:
# Use a custom driver which takes special options
driver: custom-driver-2
driver_opts:
foo: "1"
bar: "2"
這里配置了兩個(gè)frontend和backend ,且自定義了網(wǎng)絡(luò)類型。
每一個(gè)services下,proxy , app , db都定義了networks配置。
proxy 只加入到 frontend網(wǎng)絡(luò)。
db 只加入到backend網(wǎng)絡(luò)。
app同時(shí)加入到 frontend和backend 。
db和proxy不能通訊,因?yàn)椴辉谝粋€(gè)網(wǎng)絡(luò)中。
app和兩個(gè)都能通訊,因?yàn)閍pp在兩個(gè)網(wǎng)絡(luò)中都有配置。
db和proxy要通訊,只能通過(guò)app這個(gè)應(yīng)用來(lái)連接。
同一網(wǎng)絡(luò)上的其他容器可以使用服務(wù)名稱或別名來(lái)連接到其他服務(wù)的容器。例如
services:
s ome-service:
networks:
some-network:
aliases:#別名
- alias1
- alias3
other-network:
aliases:
- alias2
還可以指定靜態(tài)IP地址,例如
version: "3.9"
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
driver 指定該網(wǎng)絡(luò)應(yīng)使用哪個(gè)驅(qū)動(dòng)程序。默認(rèn)使用bridge單個(gè)主機(jī)上的網(wǎng)絡(luò),overlay代表跨多個(gè)節(jié)點(diǎn)的網(wǎng)絡(luò)群
host or none 使用主機(jī)的網(wǎng)絡(luò)堆棧,或者不使用網(wǎng)絡(luò)。相當(dāng)于docker run --net=host或docker run --net=none。僅在使用docker stack命令時(shí)使用。如果您使用該 docker-compose命令,請(qǐng)改用 network_mode。
driver_opts 將選項(xiàng)列表指定為鍵值對(duì)以傳遞給此網(wǎng)絡(luò)的驅(qū)動(dòng)程序
driver_opts:
foo: "bar"
baz: 1
attachable 僅在driver設(shè)置為 overlay時(shí)可用。如果設(shè)置為true,那么除了服務(wù)之外,獨(dú)立容器也可以連接到此網(wǎng)絡(luò)。例如
networks:
mynet1:
driver: overlay
attachable: true
enable_ipv6 在此網(wǎng)絡(luò)上啟用 IPv6 網(wǎng)絡(luò)。
ipam 自定義 IPAM (IP地址管理)配置
ipam:
driver: default
config:
- subnet: 172.28.0.0/16
internal 默認(rèn)情況下,Docker 會(huì)將橋接網(wǎng)絡(luò)提供外部連接。如果要?jiǎng)?chuàng)建外部隔離的覆蓋網(wǎng)絡(luò),可以將此選項(xiàng)設(shè)置為true。
labels 添加元數(shù)據(jù)
external如果設(shè)置為true,則指定此網(wǎng)絡(luò)是在 Compose 之外創(chuàng)建的。docker-compose up不會(huì)嘗試創(chuàng)建它,如果它不存在,則會(huì)引發(fā)錯(cuò)誤。在下面的例子中,proxy是通往外界的門戶。例如
version: "3.9"
services:
proxy:
build: ./proxy
networks:
- outside
- default
app:
build: ./app
networks:
- default
networks:
outside:
external: true
name為此網(wǎng)絡(luò)設(shè)置自定義名稱。例如
version: "3.9"
networks:
network1:
name: my-app-net
3、cap_add, cap_drop添加或刪除容器功能。例如
cap_add:
- ALL
cap_drop:
- NET_ADMIN
- SYS_ADMIN
4、cgroup_parent為容器指定一個(gè)可選的父 cgroup。
5、command:覆蓋容器啟動(dòng)后默認(rèn)執(zhí)行的命令
6、configs:賦予服務(wù)相應(yīng)的configs訪問(wèn)權(quán)限
一般指定配置名稱即可,以下示例授予redis服務(wù)訪問(wèn)my_config和my_other_configconfigs 的權(quán)限。
以下示例授予redis服務(wù)訪問(wèn)my_config和my_other_configconfigs 的權(quán)限。
version: "3.9"
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
詳細(xì)用法示例:
version: "3.9"
services:
redis:
image: redis:latest
deploy:
replicas: 1
configs:
- source: my_config #配置名
target: /redis_config #掛載文件路徑名稱
uid: '103'
gid: '103'
mode: 0440 #掛載文件在容器的權(quán)限 這里是可讀權(quán)限
configs:
my_config:
file: ./my_config.txt
my_other_config:
external: true
一級(jí)configs詳細(xì)配置參數(shù)說(shuō)明:
file: 使用指定路徑中的文件內(nèi)容創(chuàng)建配置。
external: 如果設(shè)置為 true,則指定此配置已經(jīng)創(chuàng)建。Docker 不會(huì)嘗試創(chuàng)建它,如果它不存在, 會(huì)報(bào)錯(cuò)config not found。
name: Docker 中配置對(duì)象的名稱。此字段可用于引用包含特殊字符的配置。
driver和driver_opts:自定義驅(qū)動(dòng)程序的名稱,以及作為鍵/值對(duì)傳遞的特定于驅(qū)動(dòng)程序的選項(xiàng)。
template_driver:要使用的模板驅(qū)動(dòng)程序的名稱,它控制是否以及如何將配置負(fù)載作為模板。如果未設(shè)置驅(qū)動(dòng)程序,則不使用模板。當(dāng)前支持的唯一驅(qū)動(dòng)程序是golang
當(dāng) Docker 中的配置名稱與服務(wù)中存在的名稱不同時(shí),可以使用name進(jìn)行配置
configs:
my_first_config:
file: ./config_data
my_second_config:
external:
name: redis_config
7、container_name:自定義容器名稱,必須是唯一
8、credential_spec:僅Windows 容器的服務(wù)有用。為托管服務(wù)帳戶配置憑據(jù)規(guī)范。
配置列表格式為file://<filename>或registry://<value-name>
9、depends_on:表示服務(wù)之間的依賴關(guān)系
docker-compose up按依賴順序啟動(dòng)服務(wù)。在下面的例子中,db和redis在 web之前啟動(dòng)。
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.9"
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
10、deploy:部署和運(yùn)行有關(guān)的配置,只在 swarm(集群管理工具)模式下才會(huì)有用。
endpoint_modeL:訪問(wèn)集群服務(wù)的方式.
vip是Docker 集群服務(wù)一個(gè)對(duì)外的虛擬 ip,求都會(huì)通過(guò)這個(gè)虛擬 ip 到達(dá)集群服務(wù)內(nèi)部的機(jī)器。
dnsrr :dns輪詢。所有的請(qǐng)求會(huì)自動(dòng)輪詢獲取到集群 ip 列表中的一個(gè) ip 地址。
labels 在服務(wù)上設(shè)置標(biāo)簽 容器上的 labels(跟 deploy 同級(jí)的配置) 覆蓋 deploy 下的 labels。
mode 指定服務(wù)提供的模式
global:全局服務(wù),服務(wù)將部署至集群的每個(gè)節(jié)點(diǎn)
replicated:復(fù)制服務(wù),復(fù)制指定服務(wù)到集群的機(jī)器上
placement 指定約束和首選項(xiàng)的位置。示例如下
version: "3.9"
services:
db:
image: postgres
deploy:
placement:
constraints:
- "node.role==manager"
- "engine.labels.operatingsystem==ubuntu 18.04"
preferences:
- spread: node.labels.zone
可以通過(guò)定義約束表達(dá)式來(lái)限制可以安排任務(wù)的節(jié)點(diǎn)集。約束表達(dá)式可以使用匹配(==) 或排除(!=) 規(guī)則。多個(gè)約束查找可以使用 AND 匹配。
約束可以匹配節(jié)點(diǎn)或 Docker 引擎標(biāo)簽,如下所示:
節(jié)點(diǎn)屬性 匹配 例子
node.id 節(jié)點(diǎn)ID node.id==2ivku8v2gvtg4
node.hostname 節(jié)點(diǎn)主機(jī)名 node.hostname!=node-2
node.role 節(jié)點(diǎn)角色 ( manager/ worker) node.role==manager
node.platform.os 節(jié)點(diǎn)操作系統(tǒng) node.platform.os==windows
node.platform.arch 節(jié)點(diǎn)架構(gòu) node.platform.arch==x86_64
node.labels 用戶定義的節(jié)點(diǎn)標(biāo)簽 node.labels.security==high
engine.labels Docker 引擎的標(biāo)簽 engine.labels.operatingsystem==ubuntu-14.04
max_replicas_per_node 如果服務(wù)是replicated(默認(rèn)值),則限制任何時(shí)間在節(jié)點(diǎn)上運(yùn)行的副本數(shù)
replicas 如果服務(wù)是replicated(默認(rèn)值),指定在任何給定時(shí)間應(yīng)運(yùn)行的容器數(shù)量。
resources 配置資源約束。在下面示例中,redis服務(wù)被限制為使用不超過(guò) 50M 的內(nèi)存和0.50(單核的 50%)可用處理時(shí)間 (CPU),并保留20M內(nèi)存和0.25CPU 時(shí)間(始終可用)。
version: "3.9"
services:
redis:
image: redis:alpine
deploy:
resources:
limits:
cpus: '0.50'
memory: 50M
reservations:
cpus: '0.25'
memory: 20M
restart_policy 配置是否以及如何在退出時(shí)重新啟動(dòng)容器。替換restart
condition: none, on-failure 或 any (默認(rèn): any) 之一
delay:重新啟動(dòng)嘗試之間等待的時(shí)間(默認(rèn)值:5s)。
max_attempts:在放棄之前嘗試重新啟動(dòng)容器的次數(shù)(默認(rèn)值:永不放棄),。如果在配置的窗口(window)內(nèi)重新啟動(dòng)未成功,則此嘗試不計(jì)入配置max_attempts值
window:決定重啟是否成功之前等待多長(zhǎng)時(shí)間(默認(rèn)值:立即重啟)。
rollback_config 在更新失敗的情況下應(yīng)如何回滾服務(wù)
parallelism:一次回滾的容器數(shù)量。如果設(shè)置為 0,則所有容器同時(shí)回滾。
delay:每個(gè)容器組回滾之間等待的時(shí)間(默認(rèn)為 0 秒)。
failure_action: 如果回滾失敗怎么辦。continue或者pause(默認(rèn)pause)
monitor:每次任務(wù)更新后監(jiān)控失敗的持續(xù)時(shí)間(ns|us|ms|s|m|h)(默認(rèn) 5s)注意:設(shè)置為 0 將使用默認(rèn) 5s。
max_failure_ratio:回滾期間允許的故障率(默認(rèn)為 0)。
order:回滾期間的操作順序。stop-first(舊任務(wù)在開(kāi)始新任務(wù)之前停止),或start-first(首先啟動(dòng)新任務(wù),并且正在運(yùn)行的任務(wù)短暫重疊)(默認(rèn)stop-first)。
update_config 配置應(yīng)如何更新服務(wù)
parallelism:一次更新的容器數(shù)量。
delay:更新一組容器之間的等待時(shí)間。
failure_action: 如果更新失敗怎么辦。continue,rollback或者pause (默認(rèn):pause)。
monitor:每次任務(wù)更新后監(jiān)控失敗的持續(xù)時(shí)間(ns|us|ms|s|m|h)(默認(rèn) 5s)注意:設(shè)置為 0 將使用默認(rèn) 5s。
max_failure_ratio:更新期間可容忍的故障率。
order:更新期間的操作順序。stop-first(舊任務(wù)在開(kāi)始新任務(wù)之前停止),或start-first(新任務(wù)首先啟動(dòng),并且正在運(yùn)行的任務(wù)短暫重疊)(默認(rèn)stop-first)
11、devices。設(shè)備映射列表。使用與--devicedocker 客戶端創(chuàng)建選項(xiàng)格式相同
devices:
- "/dev/ttyUSB0:/dev/ttyUSB0"
12、dns:自定義 DNS 服務(wù)器。可以是單個(gè)值或列表
13、dns_earch:自定義 DNS 搜索域。可以是單個(gè)值或列表
14、entrypoint:用于運(yùn)行程序
entrypoint: /code/entrypoint.sh
entrypoint: ["php", "-d", "memory_limit=-1", "vendor/bin/phpunit"]
15、env_file:從文件添加環(huán)境變量。可以是單個(gè)值或列表。
Compose 文件docker-compose -f FILE,則其中的路徑 env_file相對(duì)于該文件所在的目錄。
environment 聲明的環(huán)境變量會(huì)覆蓋這些值——即使這些值是空的或未定義的。
16、environment:添加環(huán)境變量。您可以使用數(shù)組或字典。任何布爾值(true、false、yes、no)都需要用引號(hào)括起來(lái)。
environment和Dockerfile 中的ENV指令一樣把變量保存在容器、鏡像中。
17、expose:暴露端口。實(shí)際上docker-compose.yml的端口映射還得ports這樣的標(biāo)簽。
18、external_links鏈接到 docker-compose.yml 外部的容器,甚至 并非 Compose 項(xiàng)目文件管理的容器
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql
19、extra_hosts:添加主機(jī)名映射,使用與 docker 客戶端--add-host類似會(huì)往/etc/hosts文件中添加一些記錄
extra_hosts:
- "somehost:162.242.195.82"
- "otherhost:50.31.209.229"
20、healthcheck:檢查容器是否“健康”。如果需要禁用鏡像的所有檢查項(xiàng)目,可以使用disable:true,相當(dāng)于test:["NONE"]
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 1m30s #間隔
timeout: 10s
retries: 3
start_period: 40s #開(kāi)始時(shí)間
test必須是字符串或列表。如果是列表,則第一項(xiàng)必須是NONE,CMD或CMD-SHELL。如果是字符串,則相當(dāng)于指定CMD-SHELL后跟該字符串。
# Hit the local web app
test: ["CMD", "curl", "-f", "http://localhost"]
test: ["CMD-SHELL", "curl -f http://localhost || exit 1"]
test: curl -f https://localhost || exit 1
21、image:從指定的鏡像中啟動(dòng)容器,可以是存儲(chǔ)倉(cāng)庫(kù)、標(biāo)簽以及鏡像 ID
22、init:轉(zhuǎn)發(fā)信號(hào)和取得進(jìn)程,將此選項(xiàng)設(shè)置true為服務(wù)啟用此功能
23、isolation:容器隔離技術(shù).在 Linux 上,唯一支持的值是default。
在 Windows 上,可接受的值為default、process和hyperv。
24、labels:元數(shù)據(jù)添加到容器,可以使用數(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: ""
25、links:鏈接到另一個(gè)服務(wù)中的容器。指定服務(wù)名稱和鏈接別名 ("SERVICE:ALIAS"),或僅指定服務(wù)名稱。
在以下示例中,web可以訪問(wèn)db,并且設(shè)置別名為database:
version: "3.9"
services:
web:
build: .
links:
- "db:database"
db:
image: postgres
26、logging:日志記錄配置.示例如下
version: "3.9"
services:
some-service:
image: some-service
logging:
driver: "json-file"
options:
max-size: "200k"
max-file: "10"
network_mode
27、network_mode:網(wǎng)絡(luò)模式,可以使用特殊形式service:[service name]。
network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"
28、pid:將 PID 模式設(shè)置為主機(jī) PID 模式。這會(huì)在容器和主機(jī)操作系統(tǒng)之間共享 PID 地址空間。
使用此標(biāo)志啟動(dòng)的容器可以訪問(wèn)和操作裸機(jī)命名空間中的其他容器.
pid: "host"
29、port:暴露端口
一般寫(xiě)法:指定兩個(gè)端口 ( HOST:CONTAINER)
僅指定容器端口(為主機(jī)端口選擇了一個(gè)臨時(shí)主機(jī)端口)。
指定要綁定到兩個(gè)端口的主機(jī) IP 地址(默認(rèn)為 0.0.0.0,表示所有接口):( IPADDR:HOSTPORT:CONTAINERPORT)。
如果 HOSTPORT 為空(例如127.0.0.1::80),則會(huì)選擇一個(gè)臨時(shí)端口來(lái)綁定到主機(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"
- "127.0.0.1::5000"
- "6060:6060/udp"
- "12400-12500:1240"
詳細(xì)寫(xiě)法:
target: 容器內(nèi)的端口
published: 公開(kāi)的端口
protocol:端口協(xié)議(tcp或udp)
mode:host用于在每個(gè)節(jié)點(diǎn)上發(fā)布主機(jī)端口,或ingress用于負(fù)載平衡的群模式端口。
ports:
- target: 80
published: 8080
protocol: tcp
mode: host
30、profiles:用于定義和控制哪些服務(wù)在特定場(chǎng)景下運(yùn)行,通過(guò)為每個(gè)服務(wù)指定一個(gè)或多個(gè) profile 標(biāo)簽,可以實(shí)現(xiàn)條件化啟動(dòng)服務(wù)。
默認(rèn)啟動(dòng)所有。要激活特定的 profile,可以在命令行中使用 `--profile` 參數(shù)。
profiles: ["frontend", "debug"]
profiles:
- frontend
- debug
31、restart:重啟策略
restart: "no" #默認(rèn),任何情況下都不會(huì)重啟
restart: always #一直重啟不停
restart: on-failure #如果退出代碼指示失敗錯(cuò)誤,則該策略會(huì)重新啟動(dòng)容器
restart: unless-stopped #總是重新啟動(dòng)容器,除非容器停止(手動(dòng)或其他方式)
32、secrets:授予訪問(wèn)權(quán)限
一般用法僅指定機(jī)密名稱,示例如下
version: "3.9"
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 #外部機(jī)密,表示已經(jīng)在docker中定義,無(wú)論如何都不會(huì)重新建立。如果外部機(jī)密不存在,部署失敗并顯示secret not found
詳細(xì)用法:source:定義機(jī)密標(biāo)識(shí)符。
arget:要掛載在/run/secrets/服務(wù)的任務(wù)容器中的文件的名稱,默認(rèn)是 source。
uid和gid:/run/secrets/在服務(wù)的任務(wù)容器中擁有文件的數(shù)字 UID 或 GID 。
mode:要掛載在/run/secrets/ 服務(wù)的任務(wù)容器中的文件的權(quán)限,以八進(jìn)制表示法。例如,0444 代表可讀。
file:使用指定路徑中的文件內(nèi)容創(chuàng)建機(jī)密。
template_driver:要使用的模板驅(qū)動(dòng)程序的名稱。當(dāng)前支持的唯一驅(qū)動(dòng)程序是golang,它使用golang。示例
version: "3.9"
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 #使用指定路徑中的文件內(nèi)容創(chuàng)建機(jī)密
my_other_secret:
external: true
上述例子表示my_first_secret在<stack_name>_my_first_secret 部署堆棧時(shí)創(chuàng)建 ,并且my_second_secret已存在于 Docker 中。
33、security_opt:管理全部服務(wù)的標(biāo)簽,比如設(shè)置全部服務(wù)的 user 標(biāo)簽值為USER
security_opt:
- label:user:USER
- label:role:ROLE
34、stop_grace_period:嘗試停止容器時(shí)等待多長(zhǎng)時(shí)間,默認(rèn)10秒
35、stop_signal:設(shè)置信號(hào)來(lái)停止容器。默認(rèn)情況下stop使用 SIGTERM
36、sysctls:內(nèi)核參數(shù)。可以是數(shù)組或字典
sysctls:
net.core.somaxconn: 1024
net.ipv4.tcp_syncookies: 0
37、tmpfs:容器掛載臨時(shí)文件。可以是單個(gè)值或列表
tmpfs: /run
tmpfs:
- /run
- /tmp
38、ulimits:設(shè)置當(dāng)前進(jìn)程以及其子進(jìn)程的資源使用量,覆蓋默認(rèn)試著
ulimits:
nproc: 65535 #最大進(jìn)程數(shù)
nofile:
soft: 20000 #軟件資源限制
hard: 40000
39、userns_mode:如果 Docker 守護(hù)程序配置了用戶命名空間,則禁用此服務(wù)的用戶命名空間。
userns_mode: "host" #服務(wù)停用用戶命名空間功能,讓服務(wù)以宿主機(jī)的用戶命名空間運(yùn)行,類似 docker run 命令中使用 --userns=host 參數(shù)的效果
使用 docker stack deploy 在 Swarm(集群) 模式下部署堆棧時(shí),userns_mode 配置項(xiàng)會(huì)被忽略,其僅對(duì)基于常規(guī) docker-compose 啟動(dòng)的服務(wù)生效
40、volumes:指定卷(Volumes)的掛載位置。卷用于在容器和宿主機(jī)之間共享數(shù)據(jù),或者在不同的容器之間共享數(shù)據(jù)。
web 服務(wù)使用命名卷 (mydata),以及為單個(gè)服務(wù)定義的綁定安裝(dbservice下的第一個(gè)路徑volumes)。db服務(wù)還使用名為dbdata(dbservice下的第二個(gè)路徑 volumes)的命名卷,使用了舊字符串格式定義它以安裝命名卷。命名卷必須列在頂級(jí)volumes鍵下。
version: "3.9"
services:
web:
image: nginx:alpine
volumes:
- type: volume #安裝類型,volume(默認(rèn)值:持久化存儲(chǔ)卷)
#tmpfs(數(shù)據(jù)會(huì)存儲(chǔ)內(nèi)存里。適合存儲(chǔ)臨時(shí)的非持久化且需較快讀寫(xiě)速度的數(shù)據(jù),容器停止后對(duì)應(yīng)數(shù)據(jù)便會(huì)消失。能搭配 size 等選項(xiàng)設(shè)定容量限制)
#npipe(僅適用于 Windows 系統(tǒng),用于掛載命名管道(Named Pipe))
#bind(代表綁定掛載,把宿主機(jī)指定路徑直接掛載到容器內(nèi)。宿主機(jī)路徑可用絕對(duì)或相對(duì)路徑表示,常適合開(kāi)發(fā)中需快速訪問(wèn)宿主機(jī)文件場(chǎng)景)
source: mydata #安裝源、主機(jī)上用于綁定安裝的路徑或在頂級(jí)volumes 中定義的卷的名稱 。不適用于 tmpfs 掛載
target: /data #安裝卷的容器中的路徑
volume:
nocopy: true #創(chuàng)建卷時(shí)禁用從容器復(fù)制數(shù)據(jù)的標(biāo)志
- type: bind
source: ./static
target: /opt/app/static
db:
image: postgres:latest
volumes:
- "/var/run/postgres/postgres.sock:/var/run/postgres/postgres.sock" #綁定掛載:指定宿主機(jī)路徑和容器內(nèi)路徑。格式[SOURCE:]TARGET[:MODE]格式
- "dbdata:/var/lib/postgresql/data" #具名掛載:指定卷名和容器內(nèi)路徑。卷名需要在頂級(jí)volumes鍵下聲明。
- /path/in/container #匿名掛載:只指定容器內(nèi)路徑,不指定宿主機(jī)路徑或卷名。Docker Compose會(huì)創(chuàng)建一個(gè)匿名卷。
volumes:
mydata:
dbdata: # 聲明具名卷
一級(jí)(最上面Volmes)配置參數(shù):driver 指定該卷應(yīng)使用哪個(gè)卷驅(qū)動(dòng)程序
driver_opts 將選項(xiàng)列表指定為鍵值對(duì)以傳遞給此卷的驅(qū)動(dòng)程序
labels 添加元數(shù)據(jù)
name 為此卷設(shè)置自定義名稱
o選項(xiàng)用于向卷驅(qū)動(dòng)傳遞以逗號(hào)分隔的多個(gè)掛載選項(xiàng)列表。其具體取值取決于卷驅(qū)動(dòng)類型(type)
使用 local 驅(qū)動(dòng)作綁定掛載:用 o: bind 表明用綁定模式掛載,類似執(zhí)行 mount -o bind 命令,常與 type: none 組合
當(dāng)驅(qū)動(dòng)為 nfs 時(shí),o 可設(shè)服務(wù)器地址、讀寫(xiě)權(quán)限等
掛載 CIFS 卷:掛載 CIFS 協(xié)議的網(wǎng)絡(luò)共享目錄時(shí),借 o 設(shè)定用戶名、密碼及目錄、文件權(quán)限等
當(dāng) driver 為 tmpfs 時(shí),能借 o 配置類似大小、uid 等,像 o: "size=100m,uid=1000" 限制卷大小 100MB,并設(shè)所有者用戶 ID 為 1000。
volumes:
example:
driver_opts:
type: "nfs"
o: "addr=10.40.0.199,nolock,soft,rw"
device: ":/docker/example
41、變量置換:用 $VARIABLE 或者 ${VARIABLE} 來(lái)置換變量,避免硬編碼敏感信息或重復(fù)配置,非常適合多環(huán)境部署場(chǎng)景
${VARIABLE:-default}VARIABLE在環(huán)境中未設(shè)置或?yàn)榭諘r(shí)設(shè)置為default。
${VARIABLE-default}僅當(dāng)VARIABLE在環(huán)境中未設(shè)置時(shí)才設(shè)置為default。
${VARIABLE:?err}退出并顯示一條錯(cuò)誤消息,其中包含環(huán)境中的errif VARIABLE未設(shè)置或?yàn)榭铡?/div>
${VARIABLE?err}退出并顯示一條錯(cuò)誤消息,其中包含errif VARIABLE在環(huán)境中未設(shè)置。
如果想使用一個(gè)不被compose處理的變量,可用使用 $$;如有特殊字符,要用引號(hào)引起來(lái)使用環(huán)境變量
services:
app:
image: ${IMAGE_NAME:default-app:latest} # 變量不存在時(shí)使用默認(rèn)值
ports:
- "${APP_PORT}:80"
使用 .env 文件
# .env 文件
IMAGE_NAME=my-app:1.0
APP_PORT=8080
compose.yml文件
services:
app:
image: ${IMAGE_NAME}
ports:
- "${APP_PORT}:80" #若 APP_PORT 未定義,使用 80
--env-file 選項(xiàng)指定額外的環(huán)境變量文件
docker-compose --env-file ./config/prod.env up
在環(huán)境變量中使用變量,注意env 文件中支持變量嵌套(需注意 Shell 兼容性),env文件示例如下
BASE_DIR=/app
DATA_DIR=${BASE_DIR}/data # 引用 BASE_DIR 的值
默認(rèn)情況下,未定義的變量會(huì)被替換為空字符串。若希望未定義變量報(bào)錯(cuò),可啟用嚴(yán)格模式