【實踐】12.DOCKER之Docker Compose

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 什么是 Docker Compose Docker Compose 是 Docker 官方編排(Orchestra...
    索倫x閱讀 1,511評論 0 11
  • 學(xué)習(xí)完整課程請移步 互聯(lián)網(wǎng) Java 全棧工程師 命令對象與格式 對于 Compose 來說,大部分命令的對象既可...
    擼帝閱讀 1,571評論 0 6
  • Compose簡介 Compose項目是Docker官方的開源項目,負(fù)責(zé)實現(xiàn)對Docker容器集群的快速編排。其代...
    薛堯筆記閱讀 1,223評論 2 1
  • 一、安裝 查看github上的docker-compose發(fā)行版本的地址:https://github.com/d...
    houxin閱讀 3,018評論 0 4
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月,有人笑有人哭,有人歡樂有人憂愁,有人驚喜有人失落,有的覺得收獲滿滿有...
    陌忘宇閱讀 8,587評論 28 53