下面將實際部署 Compose 文件中定義的應用。可以從我的百度網盤(https://pan.baidu.com/s/1Q0tcQnSqUQ06rfEdH_MBaw 提取碼: a55v)下載所需的文件。
將代碼下載到本地,并部署到新創建的名為 counter-app 的目錄中。
該目錄包含所需的所有文件,可以作為構建上下文。
Docker Compose 會使用目錄名(counter-app)作為項目名稱,這一點在后續的操作中會看到,Docker Compose 會將所有的資源名稱中加上前綴 counter-app_。
進入 counter-app 目錄中,檢查文件是否存在。
$ cd counter-app
$ ls
app.py docker-compose.yml Dockerfile requirements.txt ...
簡要介紹這幾個文件。
? app.py:是應用程序代碼(一個 Python Flask 應用)。
? docker-compose.yml:是 Compose 文件,其中定義了 Docker 如何部署應用。
? Dockerfile:定義了如何構建 web-fe 服務所使用的鏡像。
? requirements.txt:列出了應用所依賴的 Python 包。
app.py 顯然是應用的核心文件,而 docker-compose.yml 文件將應用的所有組件組織起來。
下面使用 Docker Compose 將應用啟動起來。以下所有的命令都是運行在剛才創建的 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
啟動應用將花費幾秒鐘時間,其輸出也非常詳盡。下面我們來講解一下 docker-compose 命令。
常用的啟動一個 Compose 應用(通過 Compose 文件定義的多容器應用稱為“Compose 應用”)的方式就是 docker-compose up 命令。
它會構建所需的鏡像,創建網絡和卷,并啟動容器。
默認情況下,docker-compose up 會查找名為 docker-compose.yml 或 docker-compose.yaml 的 Compose 文件。
如果 Compose 文件是其他文件名,則需要通過 -f 參數來指定。
如下命令會基于名為 prod-equus-bass.yml 的 Compose 文件部署應用。
$ docker-compose -f prod-equus-bass.yml up
使用 -d 參數在后臺啟動應用也是常見的用法,代碼如下。
docker-compose up -d
--OR--
docker-compose -f prod-equus-bass.yml up -d
前面的示例命令在前臺啟動應用(沒有使用 -d 參數),但是使用了 & 將終端窗口返回。
這種用法不太正規,所有的日志還是會直接輸出到我們后續可能會用的終端窗口上。
這樣應用就構建并啟動起來了,可以直接使用 docker 命令來查看 Docker Compose 創建的鏡像、容器、網絡和卷。
$ 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 個在部署過程中構建或拉取的鏡像。
counterapp_web-fe:latest 鏡像源自 docker-compose.yml 文件中的 build: . 指令。
該指令讓 Docker 基于當前目錄下的 Dockerfile 來構建一個新的鏡像。
該鏡像基于 python:3.4-alpine 構建,其中包含 Python Flask Web 應用的程序代碼。更多信息可以通過查看 Dockerfile 的內容進行了解。
? FROM python:3.4-alpine << 基礎鏡像
? ADD . /code << 將app復制到鏡像中
? WORKDIR /code << 設置工作目錄
? RUN pip install -r requirements.txt << 安裝依賴
? CMD ["python", "app.py"] << 設置默認啟動命令
為了方便理解,每一行都添加了注釋。部署時要刪除掉。
請注意,Docker Compose 會將項目名稱(counter-app)和 Compose 文件中定義的資源名稱(web-fe)連起來,作為新構建的鏡像的名稱。
Docker Compose 部署的所有資源的名稱都會遵循這一規范。
由于 Compose 文件的 .Services.redis 項中指定了 image: "redis:alpine",因此會從 Docker Hub 拉取 redis:alpine 鏡像。
如下命令列出了兩個容器。每個容器的名稱都以項目名稱(所在目錄名稱)為前綴。此外,它們還都以一個數字為后綴用于標識容器實例序號,因為 Docker Compose 允許擴縮容。
$ 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 容器中運行的是應用的 Web 前端。其中執行的是 app.py,并且被映射到了 Docker 主機的 5000 端口,稍后會進行連接。
如下的網絡和卷列表顯示了名為 counterapp_counter-net 的網絡和名為 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
應用部署成功后,讀者可以用 Docker 主機的瀏覽器連接 5000 端口來查看應用的運行效果,如下圖所示。
單擊瀏覽器的刷新按鈕,計數會增加。
如果使用 & 啟動應用,那么可以在終端窗口中看到包含 HTTP 響應碼 200 的日志。這表明請求收到了正確的響應,每次加載頁面都會有日志打印出來。
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 -
到此,多容器的應用已經借助 Docker Compose 成功部署了。