Compose和Docker兼容性矩陣:node
image.pngmysql
詳情請參考官方文檔nginx
先來一個 docker-compose.yml
版本 3.x 的一個示例web
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:
提示:您可使用此文件的擴展名爲
.yml
或.yaml
擴展名。redis
文件結構說明
從上面的示例模板文件中能夠看出,頂級的配置項有:sql
version 定義了版本信息docker
services 定義了服務的配置信息json
networks 定義了網絡信息,提供給 services 中的 具體容器使用ubuntu
volumes 定義了卷信息,提供給 services 中的 具體容器使用數組
services
的定義包含應用於爲該服務啓動的每一個容器的配置,很是相似於將命令行的docker container create
。networks
的定義相似於命令行的docker network create
。volumes
的定義相似於命令行的docker volume create
。
關於頂級 services
配置參考
如下僅僅討論經常使用的配置指令
1. container_name
指定容器名稱。默認將會使用 項目名稱服務名稱序號 這樣的格式。
container_name: docker-web-container
注意: 指定容器名稱後,該服務將沒法進行擴展(scale),由於 Docker 不容許多個容器具備相同的名稱。
2. labels
爲容器添加 Docker 元數據(metadata
)信息。例如能夠爲容器添加輔助說明信息。
labels:
com.startupteam.description: "webapp for a startup team"
com.startupteam.department: "devops department"
com.startupteam.release: "rc3 for v1.0"
3. 在構建時應用的配置選項。
注意每一個服務都必須經過
image
指令指定鏡像或build
指令(須要 Dockerfile)等來自動構建生成鏡像。
若是使用
build
指令,那麼在 Dockerfile 中設置的選項(例如:CMD, EXPOSE, VOLUME, ENV 等) 將會自動被獲取,無需在docker-compose.yml
中再次設置。
下面分別介紹幾個指令的用法。
bulid
指定 Dockerfile 所在文件夾的路徑(能夠是絕對路徑,或者相對 docker-compose.yml
文件的路徑)。Compose 將會利用它自動構建這個鏡像,而後使用這個鏡像。
相似於命令行的 docker build .
version: '3'
services:
webapp:
build: ./dir
你也可使用 context 指令指定 Dockerfile 所在文件夾的路徑。
同時使用 dockerfile 指令指定 Dockerfile 文件名。
version: '3'
services:
webapp:
build:
context: ./dir
dockerfile: Dockerfile-alternate
image
指定爲鏡像名稱或鏡像 ID。若是鏡像在本地不存在,Compose 將會嘗試拉取這個鏡像。
image: ubuntu
image: orchardup/postgresql
image: a4bc65fd
若是同時指定了 image
和 build
, image
不在具備單獨使用它的意義,而是指定了目前要構建的鏡像的名稱。也就是說 Compose 會使用 build
指令中指定的 Dockerfilel
構建的鏡像,以後構建的鏡像名稱使用 image
中指定的名字 webapp:tag
命名。
build: ./dir
image: webapp:tag
3. command
使用 command 能夠覆蓋容器啓動後默認執行的命令。
command: bundle exec thin -p 3000
也能夠寫成相似 Dockerfile 中的格式:
command: [bundle, exec, thin, -p, 3000]
4. depends_on
解決容器的依賴、啓動前後的問題。如下例子中會先啓動容器 db 和 redis 再啓動 web
version: '3'
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
注意:
web
服務不會等待redis
和db
「徹底啓動」以後才啓動。
5. environment
設置環境變量。你可使用數組或字典兩種格式。
只給定名稱的變量會自動獲取運行 Compose 主機上對應變量的值,能夠用來防止泄露沒必要要的數據。
environment:
RACK_ENV: development
SESSION_SECRET:
environment:
- RACK_ENV=development
- SESSION_SECRET
若是變量名稱或者值中用到 true|false,yes|no
等表達 布爾 含義的詞彙,最好放到引號裏,避免 YAML 自動解析某些內容爲對應的布爾語義。這些特定詞彙,包括
y|Y|yes|Yes|YES|n|N|no|No|NO|true|True|TRUE|false|False|FALSE|on|On|ON|off|Off|OFF
6. expose
暴露端口,但不映射到宿主機,只被其餘容器鏈接到此容器時使用。
僅能夠指定容器內部的端口爲參數
expose:
- "3000"
- "8000"
7. ports
映射端口信息。
使用:
宿主端口:容器端口 (即:HOST:CONTAINER) 的格式格式,或者僅僅指定容器的端口(宿主將會隨機選擇端口)均可以。
ports:
- "3000"
- "8000:8000"
- "49100:22"
- "127.0.0.1:8001:8001"
注意:當使用 HOST:CONTAINER 格式來映射端口時,若是你使用的容器端口小於 60 而且沒放到引號裏,可能會獲得錯誤結果,由於 YAML 會自動解析 xx:yy 這種數字格式爲 60 進制。爲避免出現這種問題,建議數字串都採用引號包括起來的字符串格式。
8. extra_hosts
相似 Docker 中的 --add-host 參數,指定額外的 host 名稱映射信息。
extra_hosts:
- "googledns:8.8.8.8"
- "dockerhub:52.1.157.61"
會在啓動後的服務容器中 /etc/hosts 文件中添加以下兩條條目。
8.8.8.8 googledns
52.1.157.61 dockerhub
9. networks
要加入的網絡,使用頂級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
image.png
指定自定義IPAM配置。這是一個具備多個屬性的對象,每一個屬性都是可選的:
driver
:自定義IPAM驅動程序,而不是默認驅動程序。config
:具備零個或多個配置塊的列表,每一個配置塊包含如下任一鍵:subnet
:CIDR格式的子網, 就是這個網絡的網段ip_range
:從中分配容器IP的IP範圍gateway
:主子網的IPv4或IPv6網關aux_addresses
:網絡驅動程序使用的輔助IPv4或IPv6地址,做爲從主機名到IP的映射options:特定於驅動程序的選項做爲鍵值映射。
使用現有網絡
若是您但願容器加入現有網絡,請使用如下external
選項
networks:
default:
external:
name: my-pre-existing-network
這種狀況下,Compose不會嘗試建立名爲 [projectname]_default
的網絡,而是查找名爲 my-pre-existing-network
的網絡,並將應用程序的容器鏈接到該網絡。
10. alias
網絡上此服務的別名(備用主機名)。同一網絡上的其餘容器可使用服務名稱或此別名鏈接到其中一個服務的容器。
因爲aliases是網絡範圍的,所以相同的服務能夠在不一樣的網絡上具備不一樣的別名。
注意:網絡範圍的別名能夠由多個容器共享,甚至能夠由多個服務共享。若是是,則沒法保證名稱解析爲的容器。
通常格式以下所示。
services:
some-service:
networks:
some-network:
aliases:
- alias1
- alias3
other-network:
aliases:
- alias2
11. healthcheck
經過命令檢查容器是否健康運行。
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 1m30s
timeout: 10s
retries: 3
12. logging
配置日誌選項。
logging:
driver: syslog
options:
syslog-address: "tcp://192.168.0.42:123"
目前支持三種日誌驅動類型。
driver: "json-file"
driver: "syslog"
driver: "none"
options 配置日誌驅動的相關參數。
options:
max-size: "200k"
max-file: "10"
關於頂級 volumes
的配置參考
1. volumes
數據卷所掛載路徑設置。能夠設置宿主機路徑 (HOST:CONTAINER) 或加上訪問模式 (HOST:CONTAINER:ro)。
該指令中路徑支持相對路徑。
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:
關於容器的限制的參數
sysctls
配置容器內核參數。
sysctls:
net.core.somaxconn: 1024
net.ipv4.tcp_syncookies: 0
sysctls:
- net.core.somaxconn=1024
- net.ipv4.tcp_syncookies=0
ulimits
指定容器的 ulimits 限制值。
例如,指定最大進程數爲 65535,指定文件句柄數爲 20000(軟限制,應用能夠隨時修改,不能超過硬限制) 和 40000(系統硬限制,只能 root 用戶提升)。
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
做者:運維開發_西瓜甜
連接:https://www.jianshu.com/p/ba77c7bdf03e
來源:簡書
著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。
本文分享自微信公衆號 - 架構師智庫(beijing-tmt)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。