現(xiàn)代“十二要素應(yīng)用”與Docker
“十二要素應(yīng)用”為開(kāi)發(fā)SaaS應(yīng)用提供了方法上的指導(dǎo),而Docker能夠提供打包依賴,解耦后端服務(wù)等特性,使得兩者非常吻合。這篇文章介紹了Docker特性怎樣滿足了開(kāi)發(fā)“十二要素應(yīng)用”的對(duì)應(yīng)要點(diǎn)。
Docker非常適合開(kāi)發(fā)“十二要素應(yīng)用”。
“十二要素應(yīng)用”為構(gòu)建SaaS應(yīng)用提供了方法論,是由知名PaaS云計(jì)算平臺(tái)Heroku的創(chuàng)始人Adam Wiggins提出的。請(qǐng)參考這篇文章。
Dockerfile與docker-compose.yml正在成為用代碼定義服務(wù)的標(biāo)準(zhǔn),通過(guò)它們可以定義服務(wù)的所有內(nèi)容:依賴、環(huán)境、端口、各種進(jìn)程以及后端服務(wù)。
Docker鏡像和容器為操作系統(tǒng)提供了保證,使得開(kāi)發(fā)環(huán)境和生產(chǎn)環(huán)境可以有效地保持一致。
這篇文章簡(jiǎn)單地介紹了Docker是怎樣滿足“十二要素應(yīng)用”的核心要點(diǎn)的。它解釋了用Docker開(kāi)發(fā)一個(gè)典型的“Rails/Postgres/Redis/web/worker”所應(yīng)用的技術(shù)。
后續(xù)文章將通過(guò)代碼深入介紹如何應(yīng)用這些技術(shù)。
II. 依賴—顯示地聲明和隔離依賴關(guān)系
Docker鏡像基于顯示的Dockerfile構(gòu)建,而Docker容器作為獨(dú)立的運(yùn)行環(huán)境。
Dockerfile提供了顯示聲明基礎(chǔ)操作系統(tǒng)的方法(FROM), 而且通過(guò)運(yùn)行命令來(lái)安裝附加的系統(tǒng)包以及應(yīng)用的依賴包(RUN)。
通過(guò)這些方法,你可以聲明你需要ubuntu 14.04、Ruby 2.2.2、Node 0.11,然后一次性安裝。
III. 配置—在環(huán)境中儲(chǔ)存配置
Docker容器非常依賴Linux的環(huán)境變量進(jìn)行配置。
docker-compose.yml有一個(gè)環(huán)境變量的哈希表,你可以通過(guò)它顯示的定義容器的環(huán)境變量。這些默認(rèn)的或者未定義的值將在運(yùn)行時(shí)從主機(jī)中繼承。
另外,還有Dokckerfile的ENV命令以及『docker run –env=[]』和『docker run –env-file=[]』運(yùn)行選項(xiàng)可以設(shè)置環(huán)境變量。
通過(guò)這些方法,你可以聲明你的應(yīng)用需要環(huán)境變量GITHUB_AUTH_TOKEN。
VII. 端口綁定—通過(guò)端口綁定來(lái)提供服務(wù)
Docker非常依賴端口綁定。
docker-compose.yml有一個(gè)端口陣列,可以通過(guò)它顯示的定義“主機(jī):容器”的端口綁定。『docker run –p HOST:CONTAINER』讓你可以在運(yùn)行時(shí)定義端口綁定。
通過(guò)這些方法,你可以聲明你的應(yīng)用的網(wǎng)絡(luò)服務(wù)器將監(jiān)聽(tīng)端口5000,而且你可以通過(guò)主機(jī)的端口5000獲取服務(wù)。
IV. 后端服務(wù)—把后端服務(wù)當(dāng)作附加資源
Docker容器與其它容器幾乎完全隔離,所以需要通過(guò)網(wǎng)絡(luò)與后端服務(wù)進(jìn)行通信。
docker-compse.yml有一個(gè)鏈接哈希表,你可以通過(guò)它指定你的應(yīng)用所需要依賴的其他容器服務(wù)。‘docker-compose up’命令將首先開(kāi)啟這些后端服務(wù),然后配置應(yīng)用容器中網(wǎng)絡(luò)連接信息的環(huán)境變量。
通過(guò)這些方法,你可以聲明你的應(yīng)用需要Postgres 9.4和Redis 3.0服務(wù),讓你的應(yīng)用通過(guò)主機(jī)名和端口號(hào)與他們建立連接。
VI. 進(jìn)程—以一個(gè)或者多個(gè)無(wú)狀態(tài)進(jìn)程運(yùn)行應(yīng)用
默認(rèn)情況下,Docker容器是不帶儲(chǔ)存的進(jìn)程。
docker-compose.yml定義了一系列服務(wù),每一個(gè)服務(wù)都有自己的鏡像或者構(gòu)建文件(Dockerfile)以及命令。
通過(guò)這些方法,你可以聲明你的應(yīng)用同時(shí)有一個(gè)網(wǎng)絡(luò)進(jìn)程和工作進(jìn)程。
XII. 管理進(jìn)程—后臺(tái)管理任務(wù)當(dāng)做一次性進(jìn)程運(yùn)行
Docker鏡像可以很容易地運(yùn)行一次性進(jìn)程。
‘docker run myapp CMD’可以在與你的網(wǎng)絡(luò)進(jìn)程一致的環(huán)境中運(yùn)行任意命令。
通過(guò)這些方法,你可以基于你的Postgres數(shù)據(jù)庫(kù)運(yùn)行交互式的bash或者運(yùn)行一次性的’rake db:migrate’進(jìn)程。
現(xiàn)有技術(shù)
若沒(méi)有Docker,OS X的開(kāi)發(fā)工具鏈?zhǔn)沁@樣的:Homebrew作為系統(tǒng)依賴包, Postgres和Redis作為開(kāi)發(fā)服務(wù), Ruby的Bundler作為跨平臺(tái)開(kāi)發(fā)依賴,一系列的Shell腳本和foreman讓所有工具在本地同時(shí)運(yùn)行起來(lái),以及一個(gè)獨(dú)立的基于Linux的構(gòu)建服務(wù)負(fù)責(zé)將應(yīng)用打包到生產(chǎn)環(huán)境。
這樣的工作流并沒(méi)有錯(cuò)誤,但是Docker提供一個(gè)更簡(jiǎn)潔的方式。
有了Dockerfile和docker-compose.yml文件,我們將不再需要任何OS X系統(tǒng)依賴,服務(wù)包或者跨平臺(tái)的語(yǔ)言依賴。一個(gè)簡(jiǎn)單的“dicker-compose up”命令可以提供一個(gè)完整的Linux開(kāi)發(fā)環(huán)境,并且能夠輕易地將“十二要素應(yīng)用”移植到生產(chǎn)機(jī)器。