天天看點

現代“十二要素應用”與Docker

“十二要素應用”為開發saas應用提供了方法上的指導,而docker能夠提供打包依賴,解耦後端服務等特性,使得兩者非常吻合。這篇文章介紹了docker特性怎樣滿足了開發“十二要素應用”的對應要點。

docker非常适合開發“十二要素應用”。

“十二要素應用”為建構saas應用提供了方法論,是由知名paas雲計算平台heroku的創始人adam wiggins提出的。請參考這篇文章。

dockerfile與docker-compose.yml正在成為用代碼定義服務的标準,通過它們可以定義服務的所有内容:依賴、環境、端口、各種程序以及後端服務。

docker鏡像和容器為作業系統提供了保證,使得開發環境和生産環境可以有效地保持一緻。

這篇文章簡單地介紹了docker是怎樣滿足“十二要素應用”的核心要點的。它解釋了用docker開發一個典型的“rails/postgres/redis/web/worker”所應用的技術。

後續文章将通過代碼深入介紹如何應用這些技術。

ii. 依賴—顯示地聲明和隔離依賴關系

docker鏡像基于顯示的dockerfile建構,而docker容器作為獨立的運作環境。

dockerfile提供了顯示聲明基礎作業系統的方法(from), 而且通過運作指令來安裝附加的系統包以及應用的依賴包(run)。

通過這些方法,你可以聲明你需要ubuntu 14.04、ruby 2.2.2、node 0.11,然後一次性安裝。

iii. 配置—在環境中儲存配置

docker容器非常依賴linux的環境變量進行配置。

docker-compose.yml有一個環境變量的哈希表,你可以通過它顯示的定義容器的環境變量。這些預設的或者未定義的值将在運作時從主機中繼承。

另外,還有dokckerfile的env指令以及『docker run –env=[]』和『docker run –env-file=[]』運作選項可以設定環境變量。

通過這些方法,你可以聲明你的應用需要環境變量github_auth_token。

vii. 端口綁定—通過端口綁定來提供服務

docker非常依賴端口綁定。

docker-compose.yml有一個端口陣列,可以通過它顯示的定義“主機:容器”的端口綁定。『docker run –p host:container』讓你可以在運作時定義端口綁定。

通過這些方法,你可以聲明你的應用的網絡伺服器将監聽端口5000,而且你可以通過主機的端口5000擷取服務。

iv. 後端服務—把後端服務當作附加資源

docker容器與其它容器幾乎完全隔離,是以需要通過網絡與後端服務進行通信。

docker-compse.yml有一個連結哈希表,你可以通過它指定你的應用所需要依賴的其他容器服務。‘docker-compose up’指令将首先開啟這些後端服務,然後配置應用容器中網絡連接配接資訊的環境變量。

通過這些方法,你可以聲明你的應用需要postgres 9.4和redis 3.0服務,讓你的應用通過主機名和端口号與他們建立連接配接。

vi. 程序—以一個或者多個無狀态程序運作應用

預設情況下,docker容器是不帶儲存的程序。

docker-compose.yml定義了一系列服務,每一個服務都有自己的鏡像或者建構檔案(dockerfile)以及指令。

通過這些方法,你可以聲明你的應用同時有一個網絡程序和工作程序。

xii. 管理程序—背景管理任務當做一次性程序運作

docker鏡像可以很容易地運作一次性程序。

‘docker run myapp cmd’可以在與你的網絡程序一緻的環境中運作任意指令。

通過這些方法,你可以基于你的postgres資料庫運作互動式的bash或者運作一次性的’rake db:migrate’程序。

現有技術

若沒有docker,os x的開發工具鍊是這樣的:homebrew作為系統依賴包, postgres和redis作為開發服務, ruby的bundler作為跨平台開發依賴,一系列的shell腳本和foreman讓所有工具在本地同時運作起來,以及一個獨立的基于linux的建構服務負責将應用打包到生産環境。

這樣的工作流并沒有錯誤,但是docker提供一個更簡潔的方式。

有了dockerfile和docker-compose.yml檔案,我們将不再需要任何os x系統依賴,服務包或者跨平台的語言依賴。一個簡單的“dicker-compose up”指令可以提供一個完整的linux開發環境,并且能夠輕易地将“十二要素應用”移植到生産機器。

本文作者:劉凱

來源:51cto