介紹過Docker Volume和Docker Network的運作原理和使用方式,以及建置Docker映像檔的Dockerfile撰寫技巧,接下來說明部署多容器架構工具Docker Compose,以及如何編寫相關之部署架構定義檔(docker-compose.yml),並可結合Docker Network和Docker Volume功能,輕鬆地就可以架設出完整的軟體系統架構。
在此系列文章的第一篇「輕量虛擬化改寫IT歷史‧Docker容器技術細說從頭」(http://www.netadmin.com.tw/article_content.aspx?sn=1707030003),點出透過Docker封裝,便可無縫移植到任何平台(Windows在1709版本,已可自動藉由虛擬化來執行Linux架構的容器映像檔),當然就避免掉測試、營運環境要逐一部署檢查的煩人無謂工作,這也是官方所稱的Matrix Hell,如圖1所示。
在使用多容器時,就會有啟動容器應用的先後順序問題,雖然可以透過Script腳本程式依序執行,但仍有腳本程式環境相依的問題,無法達成架構可攜性的理想目標,因此借重Docker Compose工具就可讓一套軟體架構輕鬆移植到其他電腦上,完全無須額外設定,同樣一行指令就可完成。
|
▲圖1 Matrix Hell示意圖。 |
Docker Compose簡介
容器就像積木一樣,透過各種軟體積木組裝成系統架構,一旦使用多個容器時,就面臨到協同調度(Orchestration)的問題,例如部署一個Web服務容器和DB服務容器,同時需要將它們連接起來,且必須先啟動資料庫再執行Web伺服器,而Docker Compose便是針對單機上控制多容器所發展的管理工具。
Docker Compose早先是Fig(http://www.fig.sh)專案,基於Python語言所開發,由Fig兩人團隊在2013年12月發布,後來被Docker官方併購,作者之一Ben Firshman,還創作過JavaScript版的任天堂模擬器(https://jsnes.fir.sh/)。
安裝Docker Compose
Docker Compose支援Linux、Windows和Mac OS平台,且必須安裝好Docker Engine,在Windows和Mac OS平台,安裝Docker for Windows(Docker for Mac)或Docker Toolbox就有內建,若是Linux環境可直接執行「sudo curl -L https://github.com/docker/compose/releases/download/1.17.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose」指令,下載執行檔就可使用,詳細說明請見官方文件(https://docs.docker.com/compose/install/)。
Compose定義檔說明
Docker Compose YAML定義檔是整個Compose的關鍵,其涵蓋的指令關鍵字也相當多,但大部分定義都跟docker run相關參數的意義是相通的,預設的定義檔名稱為docker-compose.yml,格式為YAML形式(https://zh.wikipedia.org/wiki/YAML),資料結構以類似大綱的縮排方式呈現,主要以Key和Value來表示。若某個Key值可定義為陣列形式,則須在鍵值內容前加上短槓(-)和空白字元作為起始,如以下WordPress Compose定義檔內的volumes和ports等。
接下來,便以此WordPress Compose定義檔為範例來說明。首先第1行version是說明此YAML檔所支援的Compose格式版本,第三版之後支援直接部署到Docker Swarm叢集,因此建議直接從第三版學起;第3行services是用來宣告有以下的哪些服務,從這裡可看出,其實docker-compose.yml目的就是定義整個系統架構;第4行便定義了名為db的服務,第5行指定使用mysql:5.7容器映像檔,亦可使用build替代,將會建置其目錄下的Dockerfile。
第6行volumes宣告此容器服務會掛載volume目錄;第7行便定義了掛載到容器內的Docker Volume目錄名稱,其中db_data正對應第25行宣告使用Docker Volume功能,由於是多個選項,故前面須加上短槓和空白字元表示陣列;第8行則定義重新啟動策略,指定為always在伺服器重啟時,可自動啟動此容器服務。
另外,第9行environment說明使用環境變數;第10~13行則是宣告MySQL啟動要設定的環境變數,而此處資料型態可以是陣列或字典(Dictionary),此範例是採用字典形式,故前面無須加上短槓和空白字元,但改用陣列形式亦可;第15行定義WordPress的服務,第16行depends_on是說明此服務具相依性;第17行則表示相依於db服務,也就是等待db容器啟動完成才會啟動WordPress容器。
至於第18行同上,使用wordpress:latest的映像檔;第19行是使用連接埠對應;第20行指定伺服器端80 port和容器內80 port相通;第21行亦定義重新啟動策略;第22~24行宣告WordPress啟動要設定的環境變數,其中WORDPRESS_DB_HOST必須指定為db:3306,db是上方資料庫服務的容器名稱,3306是MySQL的服務連接埠,WORDPRESS_DB_PASSWORD則需要與第13行的MYSQL_PASSWORD環境變數內容一致,才能存取資料庫。最後第25行則宣告使用Docker Volume建立db_data儲存目錄。