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