您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了docker compose書寫規(guī)則是什么,內(nèi)容簡(jiǎn)而易懂,希望大家可以學(xué)習(xí)一下,學(xué)習(xí)完之后肯定會(huì)有收獲的,下面讓小編帶大家一起來(lái)看看吧。
本文對(duì)集群部署相關(guān)的一概不做介紹
版本約束
結(jié)構(gòu)介紹
docker-compose.yaml
文件結(jié)構(gòu)主要由
version # docker compose版本 networks # 網(wǎng)絡(luò),用于docker容器內(nèi)部通訊 x-{name} # 模版命名規(guī)則 以x-開(kāi)頭 用于復(fù)用 volumes # 掛載卷 services # 服務(wù)模塊,內(nèi)部定義容器信息 其內(nèi)部參數(shù)相當(dāng)于docker run時(shí)的參數(shù)
模塊介紹
Docker Compose官方文檔
version
設(shè)定docker-compose.yaml
的版本
需要升級(jí)的話,參看文檔版本升級(jí)參考文檔
Compose file 版本 | 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.+ |
network_mode
使用與--network
參數(shù)相同的值,以及特殊形式service:[service name]
network_mode: "bridge" network_mode: "host" network_mode: "none" network_mode: "service:[service name]" network_mode: "container:[container name/id]"
networks
為當(dāng)前docker-compose.yaml
文件創(chuàng)建的容器設(shè)定網(wǎng)絡(luò)
不一定存在于和version同級(jí),也可以在各個(gè)其他模塊中,例如services中
內(nèi)部網(wǎng)絡(luò)
services: some-service: networks: - some-network - other-network
公用網(wǎng)絡(luò)
version: "3" networks: default-network:
aliases(待補(bǔ)充)
網(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:
ipv4_address , ipv6_address(待補(bǔ)充)
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"
services
最主要的部分,用來(lái)配置各個(gè)服務(wù)
build
用于構(gòu)建鏡像,當(dāng)build和image字段都存在時(shí),使用image指定的鏡像名和tag作為build鏡像的name和tag
version: "3.8" # docker compose版本 services: webapp: # docker-compose定義的服務(wù)(容器)名,主要是針對(duì)docker-compose命令的參數(shù),與docker ps看到的容器名不一定一致 build: # 使用Dockerfile構(gòu)建鏡像 context: ./dir 上下文路徑,相對(duì)路徑則是相對(duì)于compose文件路徑 dockerfile: Dockerfile-alternate # 指定Dockerfile文件名 args: # 指定Dockerfile的參數(shù) 環(huán)境變量 buildno: 1 # directory寫法和list寫法均可
context
可以使用相對(duì)路徑或者git倉(cāng)庫(kù)的url
build: context: ./dir
Dockerfile
指定Dockerfile文件名,必須指定context
build: context: . dockerfile: Dockerfile-alternate
args
Dockerfile中的ARG
字段,用于指定docker build時(shí)的環(huán)境變量
ARG buildno ARG gitcommithash RUN echo "Build number: $buildno" # bash-like風(fēng)格的寫法 RUN echo "Based on commit: $gitcommithash"
可以使用list或者map來(lái)設(shè)定args
build: context: . args: # map buildno: 1 gitcommithash: cdc3b19
build: context: . args: # list - buildno=1 - gitcommithash=cdc3b19
tips
如果需要使用boolean值,需要使用雙引號(hào)("true", "false", "yes", "no", "on", "off"),以便解析器將他們解析為字符串。
cache_from
為build過(guò)程指定cache
build: context: . cache_from: - alpine:latest - corp/web_app:3.14
labels
同Dockerfile中的LABEL
指令,為鏡像設(shè)定metadata
build: context: . labels: # map com.example.description: "Accounting webapp" com.example.department: "Finance" com.example.label-with-empty-value: ""
build: context: . labels: # list - "com.example.description=Accounting webapp" - "com.example.department=Finance" - "com.example.label-with-empty-value"
network
同docker --network
指令,為容器指定網(wǎng)絡(luò),個(gè)人理解為設(shè)定局域網(wǎng)
橋接可以將兩個(gè)物理局域網(wǎng)連接起來(lái)
三種模式
build: context: . network: host # host模式,網(wǎng)絡(luò)延遲最低,性能與宿主機(jī)一致
build: context: . network: custom_network_1 # 自創(chuàng)network
build: context: . network: none # 無(wú)網(wǎng)絡(luò)
shm_size
設(shè)置容器內(nèi)/dev/shm
目錄的大小
/dev/shm
目錄非常重要,此目錄并不在硬盤上,而是在內(nèi)存中,默認(rèn)大小為內(nèi)存的一半大小,存入其中的文件不會(huì)被清空,容器內(nèi)劃分此目錄可以一定程度上指定容器的性能。
build: context: . shm_size: '2gb' # 使用字符串設(shè)置大小
build: context: . shm_size: 10000000 # 設(shè)置字節(jié)大小
command
相當(dāng)于Dockerfile中的CMD
命令
command: bundle exec thin -p 3000 # shell-like
command: ["bundle", "exec", "thin", "-p", "3000"] # json-like
container_name
相當(dāng)于docker run --name
container_name: my-web-container
depends_on
用于表述服務(wù)之間的依賴關(guān)系
在docker-compose up
時(shí),會(huì)根據(jù)depends_on來(lái)決定啟動(dòng)順序
version: "3.8" services: web: build: . depends_on: # 先啟動(dòng) db 和 redis - db - redis redis: image: redis db: image: postgres
tips:
docker-compose 不會(huì)等待depends_on中的容器的狀態(tài)時(shí)‘ready'時(shí)才啟動(dòng),所以需要在啟動(dòng)完成后檢查容器狀態(tài)。官方給出了解決辦法,使用shell腳本來(lái)曲線救國(guó),不做贅述。
depends_on does not wait for db and redis to be “ready” before starting web - only until they have been started. If you need to wait for a service to be ready, see Controlling startup order for more on this problem and strategies for solving it.
----form https://docs.docker.com/compo...
devices
掛載的外接設(shè)備,與--devices
功能相同
devices: - "/dev/ttyUSB0:/dev/ttyUSB0"
自定義dns地址
dns: 8.8.8.8 # 單個(gè)string值
dns: # list - 8.8.8.8 - 9.9.9.9
dns_search
自定義dns搜索域名
dns_search: example.com # 單個(gè)string值
dns_search: - dc1.example.com - dc2.example.com
entrypoint
覆蓋重寫默認(rèn)的 entrypoint
entrypoint: /code/entrypoint.sh
同Dockerfile中的寫法
entrypoint: ["php", "-d", "memory_limit=-1", "vendor/bin/phpunit"]
tips:docker-compose.yaml
中的 entrypoint
清空Dockerfile中的CMD
命令,并覆蓋所有的Dockerfile中的ENTRYPOINT
指令。
env_file
為docker-compose.yaml
添加環(huán)境變量文件。如果在docker-compose -f FILE
中設(shè)置了 compose 文件,則env_file
中的文件路徑是相對(duì)于FILE
的相對(duì)路徑
env_file: .env # single value
env_file: # list - ./common.env - ./apps/web.env - /opt/runtime_opts.env
tips:
.env 文件格式:
# Set Rails/Rack environment # '#'為注釋, # 空行會(huì)被忽略 RACK_ENV=development # 格式為 VAR=VAL
.env 文件中的環(huán)境變量無(wú)法在build過(guò)程中被顯示讀取,只會(huì)被docker-compose.yaml文件讀取,如果需要在build時(shí)使用該環(huán)境變量,請(qǐng)?jiān)赽uild后加args子參數(shù)。
對(duì)于指定多個(gè).env文件的情況,官網(wǎng)的這句話賊復(fù)雜
Keep in mind that the order of files in the list is significant in determining the value assigned to a variable that shows up more than once.
---from https://docs.docker.com/compo...
直譯過(guò)來(lái)是
請(qǐng)記住,列表中文件的順序?qū)τ诖_定分配給多次顯示的變量的值很重要。
因?yàn)閷?duì)環(huán)境參數(shù)文件的處理是自上而下的,所以翻譯成人話就是,多個(gè)參數(shù)文件中包含同一個(gè)環(huán)境變量,以最后一個(gè)為準(zhǔn)。
environment
添加環(huán)境變量
environment: # map RACK_ENV: development SHOW: 'true' SESSION_SECRET:
environment: # list - RACK_ENV=development - SHOW=true - SESSION_SECRET
tips:
.env 文件中的環(huán)境變量無(wú)法在build過(guò)程中被顯示讀取,只會(huì)被docker-compose.yaml文件讀取,如果需要在build時(shí)使用該環(huán)境變量,請(qǐng)?jiān)赽uild后加args子參數(shù)。
次環(huán)境變量在構(gòu)建鏡像時(shí),可以被我們自身的代碼讀取到,例如:
func getEnvInfo() string { rackEnv := os.Getenv("RACK_ENV") fmt.Println(rackEnv) } output: development
expose
暴露端口,但是僅限于服務(wù)之間的通信,暴露的是內(nèi)部端口,類似Dockerfile的EXPOSE
指令
expose: - "3000" - "8000"
external_links
連接服務(wù)
external_links: - redis_1 - project_db_1:mysql - project_db_1:postgresql
tips:
官方推薦使用network
extra_hosts
添加自定義域名,同--add-host
extra_hosts: - "somehost:162.242.195.82" - "otherhost:50.31.209.229"
也可以在容器內(nèi)的/etc/hosts
文件內(nèi)寫入
162.242.195.82 somehost 50.31.209.229 otherhost
healthcheck
同Dockerfile中的HEALTHCHECK
指令
healthcheck: test: ["CMD", "curl", "-f", "http://localhost"] interval: 1m30s timeout: 10s retries: 3 start_period: 40s
使用disabel: true
,相當(dāng)于test: ["NONE"]
healthcheck: disable: true
image
指定需要拉取或使用的鏡像,也可以使用倉(cāng)庫(kù)/標(biāo)簽
或部分鏡像ID
image: redis # 默認(rèn)標(biāo)簽 latest image: ubuntu:18.04 image: tutum/influxdb image: example-registry.com:4000/postgresql image: a4bc65fd
init
在容器內(nèi)運(yùn)行一個(gè)初始化程序,以轉(zhuǎn)發(fā)信號(hào)開(kāi)獲取進(jìn)程。
version: "3.8" services: web: image: alpine:latest init: true
tips:
使用的默認(rèn)初始化二進(jìn)制文件是Tini,并安裝在/usr/libexec/docker-init守護(hù)程序主機(jī)上。您可以通過(guò)init-path配置選項(xiàng)將守護(hù)程序配置為使用自定義init二進(jìn)制文件 。
isolation
指定容器隔離技術(shù),Linux只支持default
,windows支持default
`process
hyperv`三個(gè)值,具體參考 Docker Engine Docs
labels
同Dockerfile中的LABEL
指令,為容器設(shè)定metadata
build: context: . labels: # map com.example.description: "Accounting webapp" com.example.department: "Finance" com.example.label-with-empty-value: ""
build: context: . labels: # list - "com.example.description=Accounting webapp" - "com.example.department=Finance" - "com.example.label-with-empty-value"
links
舊版的功能,不推薦使用
logging
為當(dāng)前服務(wù)設(shè)置日至參數(shù)
logging: driver: syslog options: syslog-address: "tcp://192.168.0.42:123"
driver
參數(shù)同--log-driver
指令
driver: "json-file" driver: "syslog" driver: "none"
tips:
只有使用json-file和journald時(shí),docker-compose up和docker-compose logs才能看到日志,其他任何的驅(qū)動(dòng)都無(wú)法看到日志打印。
指定日志設(shè)置,同docker run --log-opt
.格式為k-v結(jié)構(gòu)
driver: "syslog" options: syslog-address: "tcp://192.168.0.42:123"
默認(rèn)的日志驅(qū)動(dòng)是json-file
,可以設(shè)置存儲(chǔ)限制
options: max-size: "200k" # 單文件最大存儲(chǔ) max-file: "10" # 文件最大數(shù)量
tips:
上述的option
參數(shù)僅為json-file
日志驅(qū)動(dòng)支持的參數(shù),不同驅(qū)動(dòng)支持的參數(shù)各不相同,具體參照下表。
支持的驅(qū)動(dòng)列表
Driver | Description |
---|---|
none | 不輸出日志。 |
local | 日志以自定義格式存儲(chǔ),旨在最大程度地減少開(kāi)銷。 |
json-file | 日志以自定義格式存儲(chǔ),旨在最大程度地減少開(kāi)銷。 |
syslog | 將日志消息寫入syslog設(shè)施。該syslog守護(hù)程序必須在主機(jī)上運(yùn)行。 |
journald | 將日志消息寫入journald。該journald守護(hù)程序必須在主機(jī)上運(yùn)行。 |
gelf | 將日志消息寫入Graylog擴(kuò)展日志格式(GELF)端點(diǎn),例如Graylog或Logstash。 |
fluentd | 將日志消息寫入fluentd(向前輸入)。該fluentd守護(hù)程序必須在主機(jī)上運(yùn)行。 |
awslogs | 將日志消息寫入Amazon CloudWatch Logs。 |
splunk | 將日志消息寫入到splunk使用HTTP Event Collector。 |
etwlogs | 將日志消息寫為Windows事件跟蹤(ETW)事件。僅在Windows平臺(tái)上可用。 |
gcplogs | 將日志消息寫入Google Cloud Platform(GCP)日志記錄。 |
logentries | 將日志消息寫入Rapid7 Logentries。 |
tips:
具體請(qǐng)參考 Configure logging drivers
ports
對(duì)外暴露端口
short syntax:
要么指定兩個(gè)端口HOST:CONTAINER
,要么僅指定容器端口(選擇了臨時(shí)主機(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" - "12400-12500:1240"
tips:
當(dāng)以HOST:CONTAINER
格式映射端口時(shí),使用低于60的容器端口可能會(huì)報(bào)錯(cuò),因?yàn)閅AML會(huì)將格式xx:yy
中的數(shù)字解析為以60進(jìn)制的數(shù)(可以理解為時(shí)間)。因此建議始終將端口映射顯式指定為字符串。
long syntax
長(zhǎng)語(yǔ)法允許出現(xiàn)短語(yǔ)法不允許出現(xiàn)的字段
ports: - target: 80 published: 8080 protocol: tcp mode: host
restart
容器重啟策略
restart: "no" # 失敗不重啟 restart: always # 失敗后總是重啟 restart: on-failure # 錯(cuò)誤碼為 on-failure 時(shí)才重啟 restart: unless-stopped # 手動(dòng)停止后不重啟
secrets(待補(bǔ)充)
volumes
用來(lái)掛載數(shù)據(jù)卷
short syntax
短語(yǔ)法使用最簡(jiǎn)單的格式[SOURCE:]TARGET[:MODE]
SOURCE
可以是宿主機(jī)地址,也可以是數(shù)據(jù)卷名。TARGET
是容器內(nèi)路徑。MODE
包括ro
for read-only
和 rw
for read-write
(默認(rèn))如果使用宿主機(jī)的相對(duì)路徑,則以docker-compose.yaml
為基礎(chǔ)進(jìn)行拓展。
volumes: # 指定容器內(nèi)路徑,docker 自動(dòng)創(chuàng)建路徑 - /var/lib/mysql # 掛載絕對(duì)路徑 - /opt/data:/var/lib/mysql # 掛載相對(duì)路徑 - ./cache:/tmp/cache # 用戶目錄相對(duì)路徑 - ~/configs:/etc/configs/:ro # 命名掛載 - datavolume:/var/lib/mysql
long syntax
長(zhǎng)語(yǔ)法允許使用短語(yǔ)法無(wú)法表達(dá)的字段
type
: 安裝類型, bind
, tmpfs
或者 npipe
source
: 掛載源,可以是宿主機(jī)路徑,也可以是頂級(jí)掛載設(shè)置中設(shè)置好的卷名。tmpfs不適用于掛載target
: 容器內(nèi)掛載路徑read_only
: 設(shè)置掛載路徑只讀bind
: 配置額外的綁定設(shè)置propagation
: 用于設(shè)置綁定的傳播模式volume
: 配置額外的掛載配置nocopy
: 創(chuàng)建卷時(shí)禁用從容器復(fù)制數(shù)據(jù)標(biāo)識(shí)位tmpfs
: 配置額外的tmpfs配置size
: 設(shè)置掛載tmpfs的大?。ㄗ止?jié))consistency
: 裝載的一致性要求,consistent (主機(jī)和容器具有相同的視圖),cached(讀緩存,主機(jī)視圖具有權(quán)威性)或delegated(讀寫緩存,容器的視圖具有權(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:
以上就是關(guān)于docker compose書寫規(guī)則是什么的內(nèi)容,如果你們有學(xué)習(xí)到知識(shí)或者技能,可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。