Compose和Docker兼容性矩陣:
詳情請(qǐng)參考官方文檔
先來一個(gè) docker-compose.yml
版本 3.x 的一個(gè)示例
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:
提示:您可以使用此文件的擴(kuò)展名為
.yml
或.yaml
擴(kuò)展名。
文件結(jié)構(gòu)說明
從上面的示例模板文件中可以看出脑融,頂級(jí)的配置項(xiàng)有:
- version 定義了版本信息
- services 定義了服務(wù)的配置信息
- networks 定義了網(wǎng)絡(luò)信息俏脊,提供給 services 中的 具體容器使用
- volumes 定義了卷信息,提供給 services 中的 具體容器使用
services
的定義包含應(yīng)用于為該服務(wù)啟動(dòng)的每個(gè)容器的配置的猛,非常類似于將命令行的docker container create
耀盗。networks
的定義類似于命令行的docker network create
。volumes
的定義類似于命令行的docker volume create
卦尊。
關(guān)于頂級(jí) services
配置參考
以下僅僅討論常用的配置指令
1. container_name
指定容器名稱叛拷。默認(rèn)將會(huì)使用 項(xiàng)目名稱服務(wù)名稱序號(hào) 這樣的格式。
container_name: docker-web-container
注意: 指定容器名稱后岂却,該服務(wù)將無法進(jìn)行擴(kuò)展(scale)忿薇,因?yàn)?Docker 不允許多個(gè)容器具有相同的名稱。
2. labels
為容器添加 Docker 元數(shù)據(jù)(metadata
)信息躏哩。例如可以為容器添加輔助說明信息煌恢。
labels:
com.startupteam.description: "webapp for a startup team"
com.startupteam.department: "devops department"
com.startupteam.release: "rc3 for v1.0"
3. 在構(gòu)建時(shí)應(yīng)用的配置選項(xiàng)。
注意每個(gè)服務(wù)都必須通過
image
指令指定鏡像或build
指令(需要 Dockerfile)等來自動(dòng)構(gòu)建生成鏡像震庭。
如果使用
build
指令瑰抵,那么在 Dockerfile 中設(shè)置的選項(xiàng)(例如:CMD, EXPOSE, VOLUME, ENV 等) 將會(huì)自動(dòng)被獲取,無需在docker-compose.yml
中再次設(shè)置器联。
下面分別介紹幾個(gè)指令的用法二汛。
bulid
指定 Dockerfile 所在文件夾的路徑(可以是絕對(duì)路徑,或者相對(duì) docker-compose.yml
文件的路徑)拨拓。 Compose 將會(huì)利用它自動(dòng)構(gòu)建這個(gè)鏡像肴颊,然后使用這個(gè)鏡像。
類似于命令行的 docker build .
version: '3'
services:
webapp:
build: ./dir
你也可以使用 context 指令指定 Dockerfile 所在文件夾的路徑渣磷。
同時(shí)使用 dockerfile 指令指定 Dockerfile 文件名婿着。
version: '3'
services:
webapp:
build:
context: ./dir
dockerfile: Dockerfile-alternate
image
指定為鏡像名稱或鏡像 ID。如果鏡像在本地不存在醋界,Compose 將會(huì)嘗試?yán)∵@個(gè)鏡像竟宋。
image: ubuntu
image: orchardup/postgresql
image: a4bc65fd
如果同時(shí)指定了 image
和 build
, image
不在具有單獨(dú)使用它的意義形纺,而是指定了目前要構(gòu)建的鏡像的名稱丘侠。 也就是說 Compose 會(huì)使用 build
指令中指定的 Dockerfilel
構(gòu)建的鏡像,之后構(gòu)建的鏡像名稱使用 image
中指定的名字 webapp:tag
命名逐样。
build: ./dir
image: webapp:tag
3. command
使用 command 可以覆蓋容器啟動(dòng)后默認(rèn)執(zhí)行的命令蜗字。
command: bundle exec thin -p 3000
也可以寫成類似 Dockerfile 中的格式:
command: [bundle, exec, thin, -p, 3000]
4. depends_on
解決容器的依賴、啟動(dòng)先后的問題脂新。以下例子中會(huì)先啟動(dòng)容器 db 和 redis 再啟動(dòng) web
version: '3'
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
注意:
web
服務(wù)不會(huì)等待redis
和db
「完全啟動(dòng)」之后才啟動(dòng)挪捕。
5. environment
設(shè)置環(huán)境變量。你可以使用數(shù)組或字典兩種格式争便。
只給定名稱的變量會(huì)自動(dòng)獲取運(yùn)行 Compose 主機(jī)上對(duì)應(yīng)變量的值级零,可以用來防止泄露不必要的數(shù)據(jù)。
environment:
RACK_ENV: development
SESSION_SECRET:
environment:
- RACK_ENV=development
- SESSION_SECRET
如果變量名稱或者值中用到 true|false始花,yes|no
等表達(dá) 布爾 含義的詞匯妄讯,最好放到引號(hào)里,避免 YAML 自動(dòng)解析某些內(nèi)容為對(duì)應(yīng)的布爾語義酷宵。這些特定詞匯亥贸,包括
y|Y|yes|Yes|YES|n|N|no|No|NO|true|True|TRUE|false|False|FALSE|on|On|ON|off|Off|OFF
6. expose
暴露端口,但不映射到宿主機(jī)浇垦,只被其他容器連接到此容器時(shí)使用炕置。
僅可以指定容器內(nèi)部的端口為參數(shù)
expose:
- "3000"
- "8000"
7. ports
映射端口信息。
使用:
宿主端口:容器端口 (即:HOST:CONTAINER) 的格式格式男韧,或者僅僅指定容器的端口(宿主將會(huì)隨機(jī)選擇端口)都可以朴摊。
ports:
- "3000"
- "8000:8000"
- "49100:22"
- "127.0.0.1:8001:8001"
注意:當(dāng)使用 HOST:CONTAINER 格式來映射端口時(shí),如果你使用的容器端口小于 60 并且沒放到引號(hào)里此虑,可能會(huì)得到錯(cuò)誤結(jié)果甚纲,因?yàn)?YAML 會(huì)自動(dòng)解析 xx:yy 這種數(shù)字格式為 60 進(jìn)制。為避免出現(xiàn)這種問題朦前,建議數(shù)字串都采用引號(hào)包括起來的字符串格式介杆。
8. extra_hosts
類似 Docker 中的 --add-host 參數(shù),指定額外的 host 名稱映射信息韭寸。
extra_hosts:
- "googledns:8.8.8.8"
- "dockerhub:52.1.157.61"
會(huì)在啟動(dòng)后的服務(wù)容器中 /etc/hosts 文件中添加如下兩條條目春哨。
8.8.8.8 googledns
52.1.157.61 dockerhub
9. networks
要加入的網(wǎng)絡(luò),使用頂級(jí)networks
定義下的條目 恩伺。
services:
some-service:
networks:
- some-network
- other-network
networks:
some-network:
other-network:
指定 IPv4 和 IPv6 地址
version: "2.4"
services:
app:
image: busybox
command: ifconfig
networks:
app_net:
ipv4_address: 172.16.238.10
ipv6_address: 2001:3984:3989::10
networks:
app_net:
driver: bridge
enable_ipv6: true
ipam:
driver: default
config:
- subnet: 172.16.238.0/24
gateway: 172.16.238.1
- subnet: 2001:3984:3989::/64
gateway: 2001:3984:3989::1
指定自定義IPAM配置赴背。這是一個(gè)具有多個(gè)屬性的對(duì)象,每個(gè)屬性都是可選的:
-
driver
:自定義IPAM驅(qū)動(dòng)程序晶渠,而不是默認(rèn)驅(qū)動(dòng)程序凰荚。 -
config
:具有零個(gè)或多個(gè)配置塊的列表,每個(gè)配置塊包含以下任一鍵:-
subnet
:CIDR格式的子網(wǎng), 就是這個(gè)網(wǎng)絡(luò)的網(wǎng)段 -
ip_range
:從中分配容器IP的IP范圍 -
gateway
:主子網(wǎng)的IPv4或IPv6網(wǎng)關(guān) -
aux_addresses
:網(wǎng)絡(luò)驅(qū)動(dòng)程序使用的輔助IPv4或IPv6地址褒脯,作為從主機(jī)名到IP的映射
-
- options:特定于驅(qū)動(dòng)程序的選項(xiàng)作為鍵值映射浇揩。
使用現(xiàn)有網(wǎng)絡(luò)
如果您希望容器加入現(xiàn)有網(wǎng)絡(luò),請(qǐng)使用以下external
選項(xiàng)
networks:
default:
external:
name: my-pre-existing-network
這種情況下憨颠,Compose不會(huì)嘗試創(chuàng)建名為 [projectname]_default
的網(wǎng)絡(luò)胳徽,而是查找名為 my-pre-existing-network
的網(wǎng)絡(luò),并將應(yīng)用程序的容器連接到該網(wǎng)絡(luò)爽彤。
10. alias
網(wǎng)絡(luò)上此服務(wù)的別名(備用主機(jī)名)养盗。同一網(wǎng)絡(luò)上的其他容器可以使用服務(wù)名稱或此別名連接到其中一個(gè)服務(wù)的容器。
由于aliases是網(wǎng)絡(luò)范圍的适篙,因此相同的服務(wù)可以在不同的網(wǎng)絡(luò)上具有不同的別名往核。
注意:網(wǎng)絡(luò)范圍的別名可以由多個(gè)容器共享,甚至可以由多個(gè)服務(wù)共享嚷节。如果是聂儒,則無法保證名稱解析為的容器虎锚。
一般格式如下所示。
services:
some-service:
networks:
some-network:
aliases:
- alias1
- alias3
other-network:
aliases:
- alias2
11. healthcheck
通過命令檢查容器是否健康運(yùn)行衩婚。
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 1m30s
timeout: 10s
retries: 3
12. logging
配置日志選項(xiàng)窜护。
logging:
driver: syslog
options:
syslog-address: "tcp://192.168.0.42:123"
目前支持三種日志驅(qū)動(dòng)類型。
driver: "json-file"
driver: "syslog"
driver: "none"
options 配置日志驅(qū)動(dòng)的相關(guān)參數(shù)非春。
options:
max-size: "200k"
max-file: "10"
關(guān)于頂級(jí) volumes
的配置參考
1. volumes
數(shù)據(jù)卷所掛載路徑設(shè)置柱徙。可以設(shè)置宿主機(jī)路徑 (HOST:CONTAINER) 或加上訪問模式 (HOST:CONTAINER:ro)奇昙。
該指令中路徑支持相對(duì)路徑护侮。
volumes:
- /var/lib/mysql
- cache/:/tmp/cache
- ~/configs:/etc/configs/:ro
卷的 bind
和 volume
的混合使用示例
version: "3.2"
services:
web:
image: nginx:alpine
volumes:
# 卷 (volume)
- type: volume
source: mydata
target: /data
volume:
nocopy: true
# 掛載 (bind)
- type: bind
source: ./static
target: /opt/app/static
db:
image: postgres:latest
volumes:
- "/var/run/postgres/postgres.sock:/var/run/postgres/postgres.sock"
- "dbdata:/var/lib/postgresql/data"
volumes:
mydata:
dbdata:
關(guān)于容器的限制的參數(shù)
sysctls
配置容器內(nèi)核參數(shù)。
sysctls:
net.core.somaxconn: 1024
net.ipv4.tcp_syncookies: 0
sysctls:
- net.core.somaxconn=1024
- net.ipv4.tcp_syncookies=0
ulimits
指定容器的 ulimits 限制值储耐。
例如羊初,指定最大進(jìn)程數(shù)為 65535,指定文件句柄數(shù)為 20000(軟限制什湘,應(yīng)用可以隨時(shí)修改凳忙,不能超過硬限制) 和 40000(系統(tǒng)硬限制,只能 root 用戶提高)禽炬。
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000