1. 摘要
Docker Compose 是 Docker 官方編排(Orchestration)項目之一,負(fù)責(zé)快速的部署分布式應(yīng)用。
本章將介紹 Compose 項目情況以及安裝和使用。
2. 內(nèi)容
2.1 簡介
Compose
項目是 Docker 官方的開源項目,負(fù)責(zé)實現(xiàn)對 Docker 容器集群的快速編排。從功能上看,跟 OpenStack
中的 Heat
十分類似。
其代碼目前在 https://github.com/docker/compose 上開源。
Compose
定位是 「定義和運行多個 Docker 容器的應(yīng)用(Defining and running multi-container Docker applications)」,其前身是開源項目 Fig。
通過第一部分中的介紹,我們知道使用一個 Dockerfile
模板文件,可以讓用戶很方便的定義一個單獨的應(yīng)用容器。然而,在日常工作中,經(jīng)常會碰到需要多個容器相互配合來完成某項任務(wù)的情況。例如要實現(xiàn)一個 Web 項目,除了 Web 服務(wù)容器本身,往往還需要再加上后端的數(shù)據(jù)庫服務(wù)容器,甚至還包括負(fù)載均衡容器等。
Compose
恰好滿足了這樣的需求。它允許用戶通過一個單獨的 docker-compose.yml
模板文件(YAML 格式)來定義一組相關(guān)聯(lián)的應(yīng)用容器為一個項目(project)。
Compose
中有兩個重要的概念:
服務(wù) (
service
):一個應(yīng)用的容器,實際上可以包括若干運行相同鏡像的容器實例。項目 (
project
):由一組關(guān)聯(lián)的應(yīng)用容器組成的一個完整業(yè)務(wù)單元,在docker-compose.yml
文件中定義。
Compose
的默認(rèn)管理對象是項目,通過子命令對項目中的一組容器進(jìn)行便捷地生命周期管理。
Compose
項目由 Python 編寫,實現(xiàn)上調(diào)用了 Docker 服務(wù)提供的 API 來對容器進(jìn)行管理。因此,只要所操作的平臺支持 Docker API,就可以在其上利用 Compose
來進(jìn)行編排管理。
2.2 安裝與卸載
Compose 支持 Linux、macOS、Windows 10 三大平臺。
Compose 可以通過 Python 的包管理工具 pip 進(jìn)行安裝,也可以直接下載編譯好的二進(jìn)制文件使用,甚至能夠直接在 Docker 容器中運行。
Docker Desktop for Mac/Windows 自帶 docker-compose 二進(jìn)制文件,安裝 Docker 之后可以直接使用。
$ docker-compose --version
docker-compose version 1.27.4, build 40524192
Linux 系統(tǒng)請使用以下介紹的方法安裝。
二進(jìn)制包
在 Linux 上的也安裝十分簡單,從 官方 GitHub Release 處直接下載編譯好的二進(jìn)制文件即可。
例如,在 Linux 64 位系統(tǒng)上直接下載對應(yīng)的二進(jìn)制包。
$ sudo curl -L https://github.com/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# 國內(nèi)用戶可以使用以下方式加快下載
$ sudo curl -L https://download.fastgit.org/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
PIP 安裝
注: x86_64 架構(gòu)的 Linux 建議按照上邊的方法下載二進(jìn)制包進(jìn)行安裝,如果您計算機(jī)的架構(gòu)是 ARM (例如,樹莓派),再使用 pip 安裝。
這種方式是將 Compose 當(dāng)作一個 Python 應(yīng)用來從 pip 源中安裝。
執(zhí)行安裝命令:
$ sudo pip install -U docker-compose
可以看到類似如下輸出,說明安裝成功。
Collecting docker-compose
Downloading docker-compose-1.27.4.tar.gz (149kB): 149kB downloaded
...
Successfully installed docker-compose cached-property requests texttable websocket-client docker-py dockerpty six enum34 backports.ssl-match-hostname ipaddress
bash 補(bǔ)全命令
$ curl -L https://raw.githubusercontent.com/docker/compose/1.27.4/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
卸載
如果是二進(jìn)制包方式安裝的,刪除二進(jìn)制文件即可。
$ sudo rm /usr/local/bin/docker-compose
如果是通過 pip 安裝的,則執(zhí)行如下命令即可刪除。
$ sudo pip uninstall docker-compose
2.3 使用
術(shù)語
首先介紹幾個術(shù)語。
服務(wù) (
service
):一個應(yīng)用容器,實際上可以運行多個相同鏡像的實例。項目 (
project
):由一組關(guān)聯(lián)的應(yīng)用容器組成的一個完整業(yè)務(wù)單元。
可見,一個項目可以由多個服務(wù)(容器)關(guān)聯(lián)而成,Compose
面向項目進(jìn)行管理。
場景
最常見的項目是 web 網(wǎng)站,該項目應(yīng)該包含 web 應(yīng)用和緩存。
下面我們用 Python
來建立一個能夠記錄頁面訪問次數(shù)的 web 網(wǎng)站。
web 應(yīng)用
新建文件夾,在該目錄中編寫 app.py
文件
from flask import Flask
from redis import Redis
app = Flask(__name__)
redis = Redis(host='redis', port=6379)
@app.route('/')
def hello():
count = redis.incr('hits')
return 'Hello World! 該頁面已被訪問 {} 次。\n'.format(count)
if __name__ == "__main__":
app.run(host="0.0.0.0", debug=True)
Dockerfile
編寫 Dockerfile
文件,內(nèi)容為
FROM python:3.6-alpine
ADD . /code
WORKDIR /code
RUN pip install redis flask
CMD ["python", "app.py"]
docker-compose.yml
編寫 docker-compose.yml
文件,這個是 Compose 使用的主模板文件。
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
運行 compose 項目
$ docker-compose up
此時訪問本地 5000
端口,每次刷新頁面,計數(shù)就會加 1。
2.4 命令說明
命令對象與格式
對于 Compose 來說,大部分命令的對象既可以是項目本身,也可以指定為項目中的服務(wù)或者容器。如果沒有特別的說明,命令對象將是項目,這意味著項目中所有的服務(wù)都會受到命令影響。
執(zhí)行 docker-compose [COMMAND] --help
或者 docker-compose help [COMMAND]
可以查看具體某個命令的使用格式。
docker-compose
命令的基本的使用格式是
docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS...]
命令選項
-f, --file FILE
指定使用的 Compose 模板文件,默認(rèn)為docker-compose.yml
,可以多次指定。-p, --project-name NAME
指定項目名稱,默認(rèn)將使用所在目錄名稱作為項目名。--verbose
輸出更多調(diào)試信息。-v, --version
打印版本并退出。
命令使用說明
build
格式為 docker-compose build [options] [SERVICE...]
。
構(gòu)建(重新構(gòu)建)項目中的服務(wù)容器。
服務(wù)容器一旦構(gòu)建后,將會帶上一個標(biāo)記名,例如對于 web 項目中的一個 db 容器,可能是 web_db。
可以隨時在項目目錄下運行 docker-compose build
來重新構(gòu)建服務(wù)。
選項包括:
--force-rm
刪除構(gòu)建過程中的臨時容器。--no-cache
構(gòu)建鏡像過程中不使用 cache(這將加長構(gòu)建過程)。--pull
始終嘗試通過 pull 來獲取更新版本的鏡像。
config
驗證 Compose 文件格式是否正確,若正確則顯示配置,若格式錯誤顯示錯誤原因。
down
此命令將會停止 up
命令所啟動的容器,并移除網(wǎng)絡(luò)
exec
進(jìn)入指定的容器。
help
獲得一個命令的幫助。
images
列出 Compose 文件中包含的鏡像。
kill
格式為 docker-compose kill [options] [SERVICE...]
。
通過發(fā)送 SIGKILL
信號來強(qiáng)制停止服務(wù)容器。
支持通過 -s
參數(shù)來指定發(fā)送的信號,例如通過如下指令發(fā)送 SIGINT
信號。
$ docker-compose kill -s SIGINT
logs
格式為 docker-compose logs [options] [SERVICE...]
。
查看服務(wù)容器的輸出。默認(rèn)情況下,docker-compose 將對不同的服務(wù)輸出使用不同的顏色來區(qū)分。可以通過 --no-color
來關(guān)閉顏色。
該命令在調(diào)試問題的時候十分有用。
pause
格式為 docker-compose pause [SERVICE...]
。
暫停一個服務(wù)容器。
port
格式為 docker-compose port [options] SERVICE PRIVATE_PORT
。
打印某個容器端口所映射的公共端口。
選項:
--protocol=proto
指定端口協(xié)議,tcp(默認(rèn)值)或者 udp。--index=index
如果同一服務(wù)存在多個容器,指定命令對象容器的序號(默認(rèn)為 1)。
ps
格式為 docker-compose ps [options] [SERVICE...]
。
列出項目中目前的所有容器。
選項:
-
-q
只打印容器的 ID 信息。
pull
格式為 docker-compose pull [options] [SERVICE...]
。
拉取服務(wù)依賴的鏡像。
選項:
-
--ignore-pull-failures
忽略拉取鏡像過程中的錯誤。
push
推送服務(wù)依賴的鏡像到 Docker 鏡像倉庫。
restart
格式為 docker-compose restart [options] [SERVICE...]
。
重啟項目中的服務(wù)。
選項:
-
-t, --timeout TIMEOUT
指定重啟前停止容器的超時(默認(rèn)為 10 秒)。
rm
格式為 docker-compose rm [options] [SERVICE...]
。
刪除所有(停止?fàn)顟B(tài)的)服務(wù)容器。推薦先執(zhí)行 docker-compose stop
命令來停止容器。
選項:
-f, --force
強(qiáng)制直接刪除,包括非停止?fàn)顟B(tài)的容器。一般盡量不要使用該選項。-v
刪除容器所掛載的數(shù)據(jù)卷。
run
格式為 docker-compose run [options] [-p PORT...] [-e KEY=VAL...] SERVICE [COMMAND] [ARGS...]
。
在指定服務(wù)上執(zhí)行一個命令。
例如:
$ docker-compose run ubuntu ping docker.com
將會啟動一個 ubuntu 服務(wù)容器,并執(zhí)行 ping docker.com
命令。
默認(rèn)情況下,如果存在關(guān)聯(lián),則所有關(guān)聯(lián)的服務(wù)將會自動被啟動,除非這些服務(wù)已經(jīng)在運行中。
該命令類似啟動容器后運行指定的命令,相關(guān)卷、鏈接等等都將會按照配置自動創(chuàng)建。
兩個不同點:
給定命令將會覆蓋原有的自動運行命令;
不會自動創(chuàng)建端口,以避免沖突。
如果不希望自動啟動關(guān)聯(lián)的容器,可以使用 --no-deps
選項,例如
$ docker-compose run --no-deps web python manage.py shell
將不會啟動 web 容器所關(guān)聯(lián)的其它容器。
選項:
-d
后臺運行容器。--name NAME
為容器指定一個名字。--entrypoint CMD
覆蓋默認(rèn)的容器啟動指令。-e KEY=VAL
設(shè)置環(huán)境變量值,可多次使用選項來設(shè)置多個環(huán)境變量。-u, --user=""
指定運行容器的用戶名或者 uid。--no-deps
不自動啟動關(guān)聯(lián)的服務(wù)容器。--rm
運行命令后自動刪除容器,d
模式下將忽略。-p, --publish=[]
映射容器端口到本地主機(jī)。--service-ports
配置服務(wù)端口并映射到本地主機(jī)。-T
不分配偽 tty,意味著依賴 tty 的指令將無法運行。
scale
格式為 docker-compose scale [options] [SERVICE=NUM...]
。
設(shè)置指定服務(wù)運行的容器個數(shù)。
通過 service=num
的參數(shù)來設(shè)置數(shù)量。例如:
$ docker-compose scale web=3 db=2
將啟動 3 個容器運行 web 服務(wù),2 個容器運行 db 服務(wù)。
一般的,當(dāng)指定數(shù)目多于該服務(wù)當(dāng)前實際運行容器,將新創(chuàng)建并啟動容器;反之,將停止容器。
選項:
-
-t, --timeout TIMEOUT
停止容器時候的超時(默認(rèn)為 10 秒)。
start
格式為 docker-compose start [SERVICE...]
。
啟動已經(jīng)存在的服務(wù)容器。
stop
格式為 docker-compose stop [options] [SERVICE...]
。
停止已經(jīng)處于運行狀態(tài)的容器,但不刪除它。通過 docker-compose start
可以再次啟動這些容器。
選項:
-
-t, --timeout TIMEOUT
停止容器時候的超時(默認(rèn)為 10 秒)。
top
查看各個服務(wù)容器內(nèi)運行的進(jìn)程。
unpause
格式為 docker-compose unpause [SERVICE...]
。
恢復(fù)處于暫停狀態(tài)中的服務(wù)。
up
格式為 docker-compose up [options] [SERVICE...]
。
該命令十分強(qiáng)大,它將嘗試自動完成包括構(gòu)建鏡像,(重新)創(chuàng)建服務(wù),啟動服務(wù),并關(guān)聯(lián)服務(wù)相關(guān)容器的一系列操作。
鏈接的服務(wù)都將會被自動啟動,除非已經(jīng)處于運行狀態(tài)。
可以說,大部分時候都可以直接通過該命令來啟動一個項目。
默認(rèn)情況,docker-compose up
啟動的容器都在前臺,控制臺將會同時打印所有容器的輸出信息,可以很方便進(jìn)行調(diào)試。
當(dāng)通過 Ctrl-C
停止命令時,所有容器將會停止。
如果使用 docker-compose up -d
,將會在后臺啟動并運行所有的容器。一般推薦生產(chǎn)環(huán)境下使用該選項。
默認(rèn)情況,如果服務(wù)容器已經(jīng)存在,docker-compose up
將會嘗試停止容器,然后重新創(chuàng)建(保持使用 volumes-from
掛載的卷),以保證新啟動的服務(wù)匹配 docker-compose.yml
文件的最新內(nèi)容。如果用戶不希望容器被停止并重新創(chuàng)建,可以使用 docker-compose up --no-recreate
。這樣將只會啟動處于停止?fàn)顟B(tài)的容器,而忽略已經(jīng)運行的服務(wù)。如果用戶只想重新部署某個服務(wù),可以使用 docker-compose up --no-deps -d <SERVICE_NAME>
來重新創(chuàng)建服務(wù)并后臺停止舊服務(wù),啟動新服務(wù),并不會影響到其所依賴的服務(wù)。
選項:
-d
在后臺運行服務(wù)容器。--no-color
不使用顏色來區(qū)分不同的服務(wù)的控制臺輸出。--no-deps
不啟動服務(wù)所鏈接的容器。--force-recreate
強(qiáng)制重新創(chuàng)建容器,不能與--no-recreate
同時使用。--no-recreate
如果容器已經(jīng)存在了,則不重新創(chuàng)建,不能與--force-recreate
同時使用。--no-build
不自動構(gòu)建缺失的服務(wù)鏡像。-t, --timeout TIMEOUT
停止容器時候的超時(默認(rèn)為 10 秒)。
version
格式為 docker-compose version
。
打印版本信息。
2.5 Compose 模板文件
模板文件是使用 Compose
的核心,涉及到的指令關(guān)鍵字也比較多。但大家不用擔(dān)心,這里面大部分指令跟 docker run
相關(guān)參數(shù)的含義都是類似的。
默認(rèn)的模板文件名稱為 docker-compose.yml
,格式為 YAML 格式。
version: "3"
services:
webapp:
image: examples/web
ports:
- "80:80"
volumes:
- "/data"
注意每個服務(wù)都必須通過 image
指令指定鏡像或 build
指令(需要 Dockerfile)等來自動構(gòu)建生成鏡像。
如果使用 build
指令,在 Dockerfile
中設(shè)置的選項(例如:CMD
, EXPOSE
, VOLUME
, ENV
等) 將會自動被獲取,無需在 docker-compose.yml
中重復(fù)設(shè)置。
下面分別介紹各個指令的用法。
build
指定 Dockerfile
所在文件夾的路徑(可以是絕對路徑,或者相對 docker-compose.yml 文件的路徑)。 Compose
將會利用它自動構(gòu)建這個鏡像,然后使用這個鏡像。
version: '3'
services:
webapp:
build: ./dir
你也可以使用 context
指令指定 Dockerfile
所在文件夾的路徑。
使用 dockerfile
指令指定 Dockerfile
文件名。
使用 arg
指令指定構(gòu)建鏡像時的變量。
version: '3'
services:
webapp:
build:
context: ./dir
dockerfile: Dockerfile-alternate
args:
buildno: 1
使用 cache_from
指定構(gòu)建鏡像的緩存
build:
context: .
cache_from:
- alpine:latest
- corp/web_app:3.14
cap_add, cap_drop
指定容器的內(nèi)核能力(capacity)分配。
例如,讓容器擁有所有能力可以指定為:
cap_add:
- ALL
去掉 NET_ADMIN 能力可以指定為:
cap_drop:
- NET_ADMIN
command
覆蓋容器啟動后默認(rèn)執(zhí)行的命令。
command: echo "hello world"
configs
僅用于 Swarm mode
,詳細(xì)內(nèi)容請查看 Swarm mode
一節(jié)。
cgroup_parent
指定父 cgroup
組,意味著將繼承該組的資源限制。
例如,創(chuàng)建了一個 cgroup 組名稱為 cgroups_1
。
cgroup_parent: cgroups_1
container_name
指定容器名稱。默認(rèn)將會使用 項目名稱_服務(wù)名稱_序號
這樣的格式。
container_name: docker-web-container
注意: 指定容器名稱后,該服務(wù)將無法進(jìn)行擴(kuò)展(scale),因為 Docker 不允許多個容器具有相同的名稱。
deploy
僅用于 Swarm mode
,詳細(xì)內(nèi)容請查看 Swarm mode
一節(jié)
devices
指定設(shè)備映射關(guān)系。
devices:
- "/dev/ttyUSB1:/dev/ttyUSB0"
depends_on
解決容器的依賴、啟動先后的問題。以下例子中會先啟動 redis
db
再啟動 web
version: '3'
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
注意:
web
服務(wù)不會等待redis
db
「完全啟動」之后才啟動。
dns
自定義 DNS
服務(wù)器。可以是一個值,也可以是一個列表。
dns: 8.8.8.8
dns:
- 8.8.8.8
- 114.114.114.114
dns_search
配置 DNS
搜索域。可以是一個值,也可以是一個列表。
dns_search: example.com
dns_search:
- domain1.example.com
- domain2.example.com
tmpfs
掛載一個 tmpfs 文件系統(tǒng)到容器。
tmpfs: /run
tmpfs:
- /run
- /tmp
env_file
從文件中獲取環(huán)境變量,可以為單獨的文件路徑或列表。
如果通過 docker-compose -f FILE
方式來指定 Compose 模板文件,則 env_file
中變量的路徑會基于模板文件路徑。
如果有變量名稱與 environment
指令沖突,則按照慣例,以后者為準(zhǔn)。
env_file: .env
env_file:
- ./common.env
- ./apps/web.env
- /opt/secrets.env
環(huán)境變量文件中每一行必須符合格式,支持 #
開頭的注釋行。
# common.env: Set development environment
PROG_ENV=development
environment
設(shè)置環(huán)境變量。你可以使用數(shù)組或字典兩種格式。
只給定名稱的變量會自動獲取運行 Compose 主機(jī)上對應(yīng)變量的值,可以用來防止泄露不必要的數(shù)據(jù)。
environment:
RACK_ENV: development
SESSION_SECRET:
environment:
- RACK_ENV=development
- SESSION_SECRET
如果變量名稱或者值中用到 true|false,yes|no
等表達(dá) 布爾 含義的詞匯,最好放到引號里,避免 YAML 自動解析某些內(nèi)容為對應(yīng)的布爾語義。這些特定詞匯,包括
y|Y|yes|Yes|YES|n|N|no|No|NO|true|True|TRUE|false|False|FALSE|on|On|ON|off|Off|OFF
expose
暴露端口,但不映射到宿主機(jī),只被連接的服務(wù)訪問。
僅可以指定內(nèi)部端口為參數(shù)
expose:
- "3000"
- "8000"
external_links
注意:不建議使用該指令。
鏈接到 docker-compose.yml
外部的容器,甚至并非 Compose
管理的外部容器。
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql
extra_hosts
類似 Docker 中的 --add-host
參數(shù),指定額外的 host 名稱映射信息。
extra_hosts:
- "googledns:8.8.8.8"
- "dockerhub:52.1.157.61"
會在啟動后的服務(wù)容器中 /etc/hosts
文件中添加如下兩條條目。
8.8.8.8 googledns
52.1.157.61 dockerhub
healthcheck
通過命令檢查容器是否健康運行。
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 1m30s
timeout: 10s
retries: 3
image
指定為鏡像名稱或鏡像 ID。如果鏡像在本地不存在,Compose
將會嘗試?yán)∵@個鏡像。
image: ubuntu
image: orchardup/postgresql
image: a4bc65fd
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"
links
注意:不推薦使用該指令。
logging
配置日志選項。
logging:
driver: syslog
options:
syslog-address: "tcp://192.168.0.42:123"
目前支持三種日志驅(qū)動類型。
driver: "json-file"
driver: "syslog"
driver: "none"
options
配置日志驅(qū)動的相關(guān)參數(shù)。
options:
max-size: "200k"
max-file: "10"
network_mode
設(shè)置網(wǎng)絡(luò)模式。使用和 docker run
的 --network
參數(shù)一樣的值。
network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"
networks
配置容器連接的網(wǎng)絡(luò)。
version: "3"
services:
some-service:
networks:
- some-network
- other-network
networks:
some-network:
other-network:
pid
跟主機(jī)系統(tǒng)共享進(jìn)程命名空間。打開該選項的容器之間,以及容器和宿主機(jī)系統(tǒng)之間可以通過進(jìn)程 ID 來相互訪問和操作。
pid: "host"
ports
暴露端口信息。
使用宿主端口:容器端口 (HOST:CONTAINER)
格式,或者僅僅指定容器的端口(宿主將會隨機(jī)選擇端口)都可以。
ports:
- "3000"
- "8000:8000"
- "49100:22"
- "127.0.0.1:8001:8001"
注意:當(dāng)使用 HOST:CONTAINER
格式來映射端口時,如果你使用的容器端口小于 60 并且沒放到引號里,可能會得到錯誤結(jié)果,因為 YAML
會自動解析 xx:yy
這種數(shù)字格式為 60 進(jìn)制。為避免出現(xiàn)這種問題,建議數(shù)字串都采用引號包括起來的字符串格式。
secrets
存儲敏感數(shù)據(jù),例如 mysql
服務(wù)密碼。
version: "3.1"
services:
mysql:
image: mysql
environment:
MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_root_password
secrets:
- db_root_password
- my_other_secret
secrets:
my_secret:
file: ./my_secret.txt
my_other_secret:
external: true
security_opt
指定容器模板標(biāo)簽(label)機(jī)制的默認(rèn)屬性(用戶、角色、類型、級別等)。例如配置標(biāo)簽的用戶名和角色名。
security_opt:
- label:user:USER
- label:role:ROLE
stop_signal
設(shè)置另一個信號來停止容器。在默認(rèn)情況下使用的是 SIGTERM 停止容器。
stop_signal: SIGUSR1
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)用可以隨時修改,不能超過硬限制) 和 40000(系統(tǒng)硬限制,只能 root 用戶提高)。
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
volumes
數(shù)據(jù)卷所掛載路徑設(shè)置。可以設(shè)置為宿主機(jī)路徑(HOST:CONTAINER
)或者數(shù)據(jù)卷名稱(VOLUME:CONTAINER
),并且可以設(shè)置訪問模式 (HOST:CONTAINER:ro
)。
該指令中路徑支持相對路徑。
volumes:
- /var/lib/mysql
- cache/:/tmp/cache
- ~/configs:/etc/configs/:ro
如果路徑為數(shù)據(jù)卷名稱,必須在文件中配置數(shù)據(jù)卷。
version: "3"
services:
my_src:
image: mysql:8.0
volumes:
- mysql_data:/var/lib/mysql
volumes:
mysql_data:
# 其它指令
此外,還有包括 domainname, entrypoint, hostname, ipc, mac_address, privileged, read_only, shm_size, restart, stdin_open, tty, user, working_dir
等指令,基本跟 docker run
中對應(yīng)參數(shù)的功能一致。
指定服務(wù)容器啟動后執(zhí)行的入口文件。
entrypoint: /code/entrypoint.sh
指定容器中運行應(yīng)用的用戶名。
user: nginx
指定容器中工作目錄。
working_dir: /code
指定容器中搜索域名、主機(jī)名、mac 地址等。
domainname: your_website.com
hostname: test
mac_address: 08-00-27-00-0C-0A
允許容器中運行一些特權(quán)命令。
privileged: true
指定容器退出后的重啟策略為始終重啟。該命令對保持服務(wù)始終運行十分有效,在生產(chǎn)環(huán)境中推薦配置為 always
或者 unless-stopped
。
restart: always
以只讀模式掛載容器的 root 文件系統(tǒng),意味著不能對容器內(nèi)容進(jìn)行修改。
read_only: true
打開標(biāo)準(zhǔn)輸入,可以接受外部輸入。
stdin_open: true
模擬一個偽終端。
tty: true
讀取變量
Compose 模板文件支持動態(tài)讀取主機(jī)的系統(tǒng)環(huán)境變量和當(dāng)前目錄下的 .env
文件中的變量。
例如,下面的 Compose 文件將從運行它的環(huán)境中讀取變量 ${MONGO_VERSION}
的值,并寫入執(zhí)行的指令中。
version: "3"
services:
db:
image: "mongo:${MONGO_VERSION}"
如果執(zhí)行 MONGO_VERSION=3.2 docker-compose up
則會啟動一個 mongo:3.2
鏡像的容器;如果執(zhí)行 MONGO_VERSION=2.8 docker-compose up
則會啟動一個 mongo:2.8
鏡像的容器。
若當(dāng)前目錄存在 .env
文件,執(zhí)行 docker-compose
命令時將從該文件中讀取變量。
在當(dāng)前目錄新建 .env
文件并寫入以下內(nèi)容。
# 支持 # 號注釋
MONGO_VERSION=3.6
執(zhí)行 docker-compose up
則會啟動一個 mongo:3.6
鏡像的容器。
3. 參考
(1)Docker Compose https://yeasy.gitbook.io/docker_practice/compose