溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

docker compose書寫規(guī)則是什么

發(fā)布時(shí)間:2020-07-27 10:41:26 來(lái)源:億速云 閱讀:167 作者:小豬 欄目:服務(wù)器

這篇文章主要為大家展示了docker compose書寫規(guī)則是什么,內(nèi)容簡(jiǎn)而易懂,希望大家可以學(xué)習(xí)一下,學(xué)習(xí)完之后肯定會(huì)有收獲的,下面讓小編帶大家一起來(lái)看看吧。

本文對(duì)集群部署相關(guān)的一概不做介紹

版本約束

  • Docker Engine >= 19.03
  • Docker Compose >=3.8

結(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.819.03.0+
3.718.06.0+
3.618.02.0+
3.517.12.0+
3.417.09.0+
3.317.06.0+
3.217.04.0+
3.11.13.1+
3.01.13.0+
2.417.12.0+
2.317.06.0+
2.21.13.0+
2.11.12.0+
2.01.10.0+
1.01.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地址

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-filejournald時(shí),docker-compose updocker-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)列表

DriverDescription
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)的字段

  • arget:容器內(nèi)的端口
  • published:公開(kāi)暴露端口
  • protocol:端口協(xié)議(tcp或udp)
  • mode:host用于在每個(gè)節(jié)點(diǎn)上發(fā)布主機(jī)端口,或ingress使群集模式端口達(dá)到負(fù)載平衡。
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包括rofor read-onlyrw 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 或者 npipesource: 掛載源,可以是宿主機(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í)或者技能,可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI