下面將實(shí)際部署 Compose 文件中定義的應(yīng)用??梢詮奈业陌俣染W(wǎng)盤(pán)(https://pan.baidu.com/s/1Q0tcQnSqUQ06rfEdH_MBaw 提取碼: a55v)下載所需的文件。
將代碼下載到本地,并部署到新創(chuàng)建的名為 counter-app 的目錄中。
該目錄包含所需的所有文件,可以作為構(gòu)建上下文。
Docker Compose 會(huì)使用目錄名(counter-app)作為項(xiàng)目名稱(chēng),這一點(diǎn)在后續(xù)的操作中會(huì)看到,Docker Compose 會(huì)將所有的資源名稱(chēng)中加上前綴 counter-app_。
進(jìn)入 counter-app 目錄中,檢查文件是否存在。
$ cd counter-app
$ ls
app.py docker-compose.yml Dockerfile requirements.txt ...
簡(jiǎn)要介紹這幾個(gè)文件。
? app.py:是應(yīng)用程序代碼(一個(gè) Python Flask 應(yīng)用)。
? docker-compose.yml:是 Compose 文件,其中定義了 Docker 如何部署應(yīng)用。
? Dockerfile:定義了如何構(gòu)建 web-fe 服務(wù)所使用的鏡像。
? requirements.txt:列出了應(yīng)用所依賴(lài)的 Python 包。
app.py 顯然是應(yīng)用的核心文件,而 docker-compose.yml 文件將應(yīng)用的所有組件組織起來(lái)。
下面使用 Docker Compose 將應(yīng)用啟動(dòng)起來(lái)。以下所有的命令都是運(yùn)行在剛才創(chuàng)建的 counter-app 目錄下的。
$ docker-compose up &
[1] 1635
Creating network "counterapp_counter-net" with the default driver
Creating volume "counterapp_counter-vol" with default driver
Pulling redis (redis:alpine)...
alpine: Pulling from library/redis
1160f4abea84: Pull complete
a8c53d69ca3a: Pull complete
<Snip>
web-fe_1 | * Debugger PIN: 313-791-729
啟動(dòng)應(yīng)用將花費(fèi)幾秒鐘時(shí)間,其輸出也非常詳盡。下面我們來(lái)講解一下 docker-compose 命令。
常用的啟動(dòng)一個(gè) Compose 應(yīng)用(通過(guò) Compose 文件定義的多容器應(yīng)用稱(chēng)為“Compose 應(yīng)用”)的方式就是 docker-compose up 命令。
它會(huì)構(gòu)建所需的鏡像,創(chuàng)建網(wǎng)絡(luò)和卷,并啟動(dòng)容器。
默認(rèn)情況下,docker-compose up 會(huì)查找名為 docker-compose.yml 或 docker-compose.yaml 的 Compose 文件。
如果 Compose 文件是其他文件名,則需要通過(guò) -f 參數(shù)來(lái)指定。
如下命令會(huì)基于名為 prod-equus-bass.yml 的 Compose 文件部署應(yīng)用。
$ docker-compose -f prod-equus-bass.yml up
使用 -d 參數(shù)在后臺(tái)啟動(dòng)應(yīng)用也是常見(jiàn)的用法,代碼如下。
docker-compose up -d
--OR--
docker-compose -f prod-equus-bass.yml up -d
前面的示例命令在前臺(tái)啟動(dòng)應(yīng)用(沒(méi)有使用 -d 參數(shù)),但是使用了 & 將終端窗口返回。
這種用法不太正規(guī),所有的日志還是會(huì)直接輸出到我們后續(xù)可能會(huì)用的終端窗口上。
這樣應(yīng)用就構(gòu)建并啟動(dòng)起來(lái)了,可以直接使用 docker 命令來(lái)查看 Docker Compose 創(chuàng)建的鏡像、容器、網(wǎng)絡(luò)和卷。
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
counterapp_web-fe latest 96..6ff9e 3 minutes ago 95.9MB
python 3.4-alpine 01..17a02 2 weeks ago 85.5MB
redis alpine ed..c83de 5 weeks ago 26.9MB
可以看到有 3 個(gè)在部署過(guò)程中構(gòu)建或拉取的鏡像。
counterapp_web-fe:latest 鏡像源自 docker-compose.yml 文件中的 build: . 指令。
該指令讓 Docker 基于當(dāng)前目錄下的 Dockerfile 來(lái)構(gòu)建一個(gè)新的鏡像。
該鏡像基于 python:3.4-alpine 構(gòu)建,其中包含 Python Flask Web 應(yīng)用的程序代碼。更多信息可以通過(guò)查看 Dockerfile 的內(nèi)容進(jìn)行了解。
? FROM python:3.4-alpine << 基礎(chǔ)鏡像
? ADD . /code << 將app復(fù)制到鏡像中
? WORKDIR /code << 設(shè)置工作目錄
? RUN pip install -r requirements.txt << 安裝依賴(lài)
? CMD ["python", "app.py"] << 設(shè)置默認(rèn)啟動(dòng)命令
為了方便理解,每一行都添加了注釋。部署時(shí)要?jiǎng)h除掉。
請(qǐng)注意,Docker Compose 會(huì)將項(xiàng)目名稱(chēng)(counter-app)和 Compose 文件中定義的資源名稱(chēng)(web-fe)連起來(lái),作為新構(gòu)建的鏡像的名稱(chēng)。
Docker Compose 部署的所有資源的名稱(chēng)都會(huì)遵循這一規(guī)范。
由于 Compose 文件的 .Services.redis 項(xiàng)中指定了 image: "redis:alpine",因此會(huì)從 Docker Hub 拉取 redis:alpine 鏡像。
如下命令列出了兩個(gè)容器。每個(gè)容器的名稱(chēng)都以項(xiàng)目名稱(chēng)(所在目錄名稱(chēng))為前綴。此外,它們還都以一個(gè)數(shù)字為后綴用于標(biāo)識(shí)容器實(shí)例序號(hào),因?yàn)?Docker Compose 允許擴(kuò)縮容。
$ docker container ls
ID COMMAND STATUS PORTS NAMES
12.. "python app.py" Up 2 min 0.0.0.0:5000->5000/tcp counterapp_web-fe_1
57.. "docker-entry.." Up 2 min 6379/tcp counterapp_redis_1
counterapp_web-fe 容器中運(yùn)行的是應(yīng)用的 Web 前端。其中執(zhí)行的是 app.py,并且被映射到了 Docker 主機(jī)的 5000 端口,稍后會(huì)進(jìn)行連接。
如下的網(wǎng)絡(luò)和卷列表顯示了名為 counterapp_counter-net 的網(wǎng)絡(luò)和名為 counterapp_counter-vol 的卷。
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
1bd949995471 bridge bridge local
40df784e00fe counterapp_counter-net bridge local
f2199f3cf275 host host local
67c31a035a3c none null local
$ docker volume ls
DRIVER VOLUME NAME
<Snip>
local counterapp_counter-vol
應(yīng)用部署成功后,讀者可以用 Docker 主機(jī)的瀏覽器連接 5000 端口來(lái)查看應(yīng)用的運(yùn)行效果,如下圖所示。

單擊瀏覽器的刷新按鈕,計(jì)數(shù)會(huì)增加。
如果使用 & 啟動(dòng)應(yīng)用,那么可以在終端窗口中看到包含 HTTP 響應(yīng)碼 200 的日志。這表明請(qǐng)求收到了正確的響應(yīng),每次加載頁(yè)面都會(huì)有日志打印出來(lái)。
web-fe_1 | 172.18.0.1 - - [09/Jan/2018 11:13:21] "GET / HTTP/1.1" 200 -
web-fe_1 | 172.18.0.1 - - [09/Jan/2018 11:13:33] "GET / HTTP/1.1" 200 -
到此,多容器的應(yīng)用已經(jīng)借助 Docker Compose 成功部署了。