什么是YAML呢?
YAML全稱YAML Ain't Markup Language表示“YAML不是一種標(biāo)記語(yǔ)言”的縮寫(xiě),為了強(qiáng)調(diào)YAML語(yǔ)言以數(shù)據(jù)作為中心,不是以標(biāo)記語(yǔ)言為重點(diǎn),使用返璞詞重新命名。
YAML是一種直觀的能夠被電腦識(shí)別的數(shù)據(jù)序列化格式,是一個(gè)可讀性高且容易被人類(lèi)閱讀,容易和腳本語(yǔ)言交互,用來(lái)表達(dá)資料序列的編程語(yǔ)言。
YAML是一種類(lèi)似于標(biāo)準(zhǔn)通用標(biāo)記語(yǔ)言的子集XML的數(shù)據(jù)描述語(yǔ)言,語(yǔ)法比XML更加容易簡(jiǎn)單。
什么是Docker Compose呢?
docker-compose是用來(lái)將Docker自動(dòng)化的命令,有了docker-compose可將繁瑣的Docker操作整合為一條命令,自動(dòng)化的完成。
Docker Compose命令請(qǐng)參見(jiàn) 《docker-compose命令》
什么是docker-compose.yml文件呢?
Docker Compose默認(rèn)的模板文件是docker-compose.yml,其中定義的每個(gè)服務(wù)都必須通過(guò)image指令指定鏡像或使用Dockerfile的build指令進(jìn)行自動(dòng)構(gòu)建,其它大部分指令跟docker run中選項(xiàng)類(lèi)似。
如果使用Dockerfile的build指令,則在Dockerfile中設(shè)置的選項(xiàng)如CMD、EXPOSE、VOLUME、ENV等將會(huì)自動(dòng)被獲取,無(wú)需在docker-comopse.yml文件中再次設(shè)置。
如果使用image指定為鏡像名稱或鏡像ID時(shí)鏡像在本地不存在,Compose將會(huì)嘗試去拉取這個(gè)鏡像。
典型的docker-comopse.yml文件格式
$ vim docker-compose.yml
version: '2'
services:
web:
image: dockercloud/hello-world
ports:
- 8080
networks:
- front-tier
- back-tier
redis:
image: redis
links:
- web
networks:
- back-tier
lb:
image: dockercloud/haproxy
ports:
- 80:80
links:
- web
networks:
- front-tier
- back-tier
volumes:
- /var/run/docker.sock:/var/run/docker.sock
networks:
front-tier:
driver: bridge
back-tier:
driver: bridge
Compose文件是一個(gè)定義服務(wù)services、網(wǎng)絡(luò)networks和卷volumes的YAML文件,默認(rèn)路徑是./docker-compose.yml,可使用.yml或.yaml作為文件擴(kuò)展名。
服務(wù)services定義包含應(yīng)用于為該服務(wù)啟動(dòng)的每個(gè)容器的配置,類(lèi)似傳遞命令行參數(shù)一樣docker container create。同樣,網(wǎng)絡(luò)networks和卷volumes的定義類(lèi)似于docker network create和docker volume create。正如docker container create在Dockerfile指定選項(xiàng),如CMD、EXPOSE、VOLUME、ENV,在默認(rèn)情況下,不需要在docker-compose.yml配置中再次指定。可以使用Bash類(lèi)${VARIABLE}語(yǔ)法在配置值中使用環(huán)境變量。
version: "3"
services:
redis:
image: redis:alpine
ports:
- "6379"
networks:
- frontend
deploy:
replicas: 2
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
db:
image: postgres:9.4
volumes:
- db-data:/var/lib/postgresql/data
networks:
- backend
deploy:
placement:
constraints: [node.role == manager]
vote:
image: dockersamples/examplevotingapp_vote:before
ports:
- 5000:80
networks:
- frontend
depends_on:
- redis
deploy:
replicas: 2
update_config:
parallelism: 2
restart_policy:
condition: on-failure
result:
image: dockersamples/examplevotingapp_result:before
ports:
- 5001:80
networks:
- backend
depends_on:
- db
deploy:
replicas: 1
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
worker:
image: dockersamples/examplevotingapp_worker
networks:
- frontend
- backend
deploy:
mode: replicated
replicas: 1
labels: [APP=VOTING]
restart_policy:
condition: on-failure
delay: 10s
max_attempts: 3
window: 120s
placement:
constraints: [node.role == manager]
visualizer:
image: dockersamples/visualizer:stable
ports:
- "8080:8080"
stop_grace_period: 1m30s
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement:
constraints: [node.role == manager]
networks:
frontend:
backend:
volumes:
db-data:
docker-compose.yml指令有那些呢?
標(biāo)準(zhǔn)配置文件應(yīng)該包含version、services、networks三部分,其中最關(guān)鍵的是services和networks兩個(gè)部分。
images
images用來(lái)指定服務(wù)的鏡像名稱或鏡像ID,如果鏡像在本地不存在,compose將會(huì)嘗試去拉取這個(gè)鏡像。
services:
web:
image:redis
volumes
volumes指令用于設(shè)置數(shù)據(jù)卷掛載路徑,數(shù)據(jù)卷掛載路徑可以是一個(gè)目錄或一個(gè)已經(jīng)存在的數(shù)據(jù)卷容器,可以設(shè)置宿主機(jī)路徑HOST:CONTAINER或加上訪問(wèn)模式HOST:CONTAINER:ro。使用ro表示對(duì)于容器來(lái)說(shuō)數(shù)據(jù)卷是只讀的,這樣可以有效地保護(hù)宿主機(jī)的文件系統(tǒng)。
volumes:
# 指定一個(gè)容器內(nèi)的路徑,Docker會(huì)自動(dòng)創(chuàng)建一個(gè)數(shù)據(jù)卷。
- /var/lib/mysql
# 使用絕對(duì)路徑掛載數(shù)據(jù)卷
- /opt/data:/var/lib/mysql
# 以compose配置文件所在目錄為根的相對(duì)路徑作為數(shù)據(jù)卷掛載到容器
- ./cache:/tmp/cache
# 使用用戶的相對(duì)路徑
- ~/configs:/etc/configs:ro
networks
networks指令用于設(shè)置指定網(wǎng)絡(luò)
services:
some-service:
networks:
- some-network
networks標(biāo)簽擁有一個(gè)特別的子標(biāo)簽aliases用于設(shè)置服務(wù)別名,相同的別名可以在不同的網(wǎng)絡(luò)中擁有不同的別名。
services:
some-service:
networks:
some-network:
aliases:
- alias1
未完待續(xù)...