Docker Compose 模板文件 docker-compose.yml V3.x 指令詳解

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 中的 具體容器使用數組

  1. services 的定義包含應用於爲該服務啓動的每一個容器的配置,很是相似於將命令行的 docker container create

  2. networks 的定義相似於命令行的 docker network create

  3. 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

若是同時指定了 imagebuildimage 不在具備單獨使用它的意義,而是指定了目前要構建的鏡像的名稱。也就是說 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

解決容器的依賴、啓動前後的問題。如下例子中會先啓動容器  dbredis 再啓動 web

version: '3'

services:
web:
build: .
depends_on:
- db
- redis

redis:
image: redis

db:
image: postgres

注意:web 服務不會等待 redisdb 「徹底啓動」以後才啓動。

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

卷的 bindvolume 的混合使用示例

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源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索