Docker的幾個實戰經驗分享
云棧科技是一家提供容器解決方案(csphere)的創業公司,其創始人王利俊是之前新浪SAE PaaS平臺的負責人,在3月29日的QClub Docker大會上,王利俊分享了題為《Docker在生產環境的挑戰以及應對》的演講,本文根據其演講內容整理而成。
未來的趨勢是PaaS還是CaaS
PaaS從2008年萬眾矚目到2012年遭受質疑,再到現在很多PaaS企業業務發展都不盡如人意(甚至有的已經關閉),留下的也是在苦苦支撐。 究其本質原因,是由于PaaS在滿足客戶需求方面存在很多障礙。沒有規范,不成PaaS。PaaS的關鍵是約束和規范,但是規范是一把雙刃劍,它一方面使 得應用開發更加整齊,應用管理和維護更加簡單;但是另一方面客戶的需求千變萬化,我們很難用一套規范去滿足所有的業務需求。因此通用的PaaS平臺就處于 兩難的境地。未來PaaS的趨勢一定是垂直化,比如面向游戲的PaaS、面向某類智能硬件的PaaS。
隨著以Docker為代表的容器技術的成熟,CaaS(容器即服務)的概念也逐漸被接受。未來的趨勢是PaaS還是CaaS,這取決于未來市場是對 PaaS還是對容器更加接受。現在的市場對Linux非常認可,使用率也很高,如果容器可以像Linux一樣流行,那肯定是CaaS更有市場。反之,則是 PaaS更加流行。
鏡像管理
鏡像是Docker管理最基礎的部分,同時也是Docker最大的亮點。鏡像管理涉及到鏡像的制作、更新、存儲、分發、權限等多個方面。
鏡像制作方面,應該堅持三個原則,第一是堅持鏡像總是從Dockerfile生成。這樣做最大的好處是可以通過Dockerfile“閱讀”鏡像, 在后續的協作、升級維護等方面會帶來巨大的便利。第二是鏡像之間應該避免依賴過深,建議為三層,這三層分別是基礎的操作系統鏡像、中間件鏡像和應用鏡像。 第三是堅持所有鏡像都應該有對應的Git倉庫,以方便后續的更新。
鏡像的更新需要一個自動化的流程,這可以通過SCM和CI系統自動觸發實現。具體的流程如下圖所示。開發者首先將代碼和Dockerfile提交到 Git倉庫,然后Git通過webhook方式觸發Jenkins的主動獲取代碼和Dockerfile文件,Jenkins再通過Docker相關的插 件生成鏡像并推送鏡像到私有的Registry。這樣,在服務器上就可以通過拉取新的鏡像部署容器。
關于Registry,可能會涉及三方面的問題,一個是單點問題,對應的解決方案可以考慮DRBD、分布式存儲以及云存儲。二是Regitry的性 能問題,目前可用的解決方案是通過HTTP反向代理緩存來加速Layer的下載。三是Registry用戶權限,Nginx LUA可以提供一個簡單快速的實現方案。
發布管理
和傳統的發布流程相比,Docker最大的好處是不需要考慮外部依賴,利用容器的自包含的特點,我們可以將發布回滾流程標準化和產品化。而傳統的發 布和回滾,需要casebycase去針對不同應用做升級回滾的方案。要做到基于Docker的發布,鏡像的生成必須堅持自動化,否則會發現升級比傳統的 方法更麻煩。因此在現實中我們也發現很多企業將代碼目錄放到主機目錄映射到容器內,這樣做破壞了Docker的自包含特性,解決的辦法是堅持應用鏡像更新 自動化。
日志管理
由于容器是無狀態的,所以存儲在容器內的日志會隨著容器的銷毀而消失。stdout/stderr類型的日志,可通過logspout轉發到 syslog中心來收集。打印到文件的支持,比如accesslog,需要將日志存儲到外部的Volume,并在Docker主機上使用logstash 收集轉發。
配置管理
容器里沒有CM agent,無法接收CM指令。CM運行到Host上也無法管理容器中的文件,如果手工修改容器內的配置,那新創建的容器仍然是舊的。配置大體上分為兩種 類型,一種是服務之間的連接信息,這種配置建議考慮使用服務發現系統,也可以使用一些更加傳統的方法,比如通過環境變量來協調作開發和生產環境的配置差 異。一種是一般的配置文件參數,配置文件和Dockerfile應該一起存儲到一個Git倉庫,修改后自動build更新鏡像。
網絡管理
目前Docker支持的網絡包括Host網絡、NAT網絡、物理網橋和網絡虛擬化。Host網絡中容器和主機共享網絡命名空間,不同容器需要做好端 口規劃,防止端口沖突。Nat網絡是基于四層代理以及NAT技術,依賴portmap,進出都需要轉發,性能低,主機上需要做好端口規劃,容易搞混。物理 網橋方案,和傳統虛擬機的網橋沒有區別,適合容器數量有限且相對靜止的場景。網絡虛擬化是基于隧道的overlay網絡,目前開源方案有 SocketPlane、Weave、Flannel,適合數量大,動態創建銷毀容器的場景。
來自:http://www.infoq.com/cn/news/2015/04/several-docker-practice