再次糾正概念:Docker不是輕量級容器。它由管理輕量級容器的引擎、客戶端和AUFS文件系統三部分組成。輕量級容器(Lightweight Container)在UNIX/Linux領域經歷了十多年的發展,并在最近5年突飛猛進。
輕量級容器技術發展歷程
在分析Docker的生態系統之前,我們首先回顧輕量級容器技術的發展路線圖。
2000年,BSD Jail:Jail以多種方式改進和增強了BSD類操作系統中用于進程隔離的chroot環境。Jail不僅對文件系統訪問實現隔離,還把用戶、BSD的網絡子系統及一些其他系統資源在內核中進行隔離。
2005年,Solaris Containers:Solaris Containers的實現包括兩部分:Solaris Zones和System Resource Controls。Zones實現了命名空間隔離和安全訪問控制。在non-global zone中的進程既不能看見該zone之外的進程,也不能與之通信。System Resource Controls實現了資源管理功能。
2005年,OpenVZ:OpenVZ是GPLv2協議下的開源軟件,是基于Linux平臺的操作系統級服務器資源隔離解決方案。OpenVZ采用SWsoft的Virutozzo軟件產品的內核,Virutozzo是SWsoft公司提供的商業解決方案。
以上這些都是容器技術的先驅,Container真正開始普及,由以下幾個標志性事件推動。
2007年,從2.6.4版本開始,cgroups正式進入Linux內核。
2008年,LXC 0.10出現,簡化了容器的創建和管理。
2011年,Linux開發者就容器技術的統一規范達成共識。
2012年,Cloud Foundry選擇使用WARDEN Container來承載PaaS應用。
2013年,Google發布開源容器管理工具lmctfy (Let Me Contain That For You)。
2013年是容器和周邊技術高歌猛進的一年,這其中以Docker的流行為代表,以下兩家公司和他們的產品具有標志意義。
2013年,Docker version 0.10:Docker是PaaS提供商dotCloud(最近已經正式改名為Docker Inc.)開源的一個基于LXC的高級容器引擎,源代碼托管在GitHub上,基于Go語言并遵從Apache 2.0協議開源。Docker的出現極大簡化了容器的創建和管理,分層式的AUFS實現了Docker鏡像。
2013年,CoreOS:這家在硅谷某個車庫里成立的創業公司發布了專門為大規模服務器部署定制的Linux精簡系統,目的是為運行以輕量級容器為載體的應用提供一個高度優化的底層系統。
2014年,大量圍繞Docker和CoreOS的創業公司、新近開源的軟件項目、大型企業和互聯網公司的加入,使輕量級容器技術的浪潮更上一層樓。
正如定義所言,Docker是“Container Engine”,它是一個把cgroup、namespace等容器底層技術抽象的一個引擎,為用戶提供了創建和管理容器的便捷界面(包括命令行和API)。
概念明晰了,我們先從技術棧的維度來看Docker和它的生態系統,把從Linux到Docker做四個層面的分層。
Linux操作系統。完整的Linux內核,履行操作的使命:管理硬件,調度任務,提供用戶界面和服務等。
容器的內核實現。這主要包括Linux內核中的cgroup、namespace等,它們為容器(用戶進程)的資源隔離性提供了內核層面的保障。
輕量級容器的基礎工具。通過LXC這樣的工具可以完成容器創建、啟動等基本操作,但使用LXC需要熟知容器內核實現原理。這對于普通用戶來說有一定難度,并且LXC在不同Linux發行版不一致。
容器管理引擎。Docker是這一層的主角。Docker由Docker engine和Docker client組成。Docker engine將神秘的cgroup、復雜的LXC統統隱藏起來,使用簡單的命令即可完成容器的運行和管理。它的另一個獨特之處在于AUFS的運用,Copy on write模式的分層文件系統使容器的鏡像可以像搭積木一樣靈活創建和修改,并在網絡上實現增量分發。Docker client,特別是它的API,為在Docker之上的生態系統發展提供了可能性。
Docker的出現和標準化,為以輕量級容器為核心的生態系統提供了爆發式增長的機會。我們從以下幾個角度來看Docker的生態系統。
Docker和容器宿主
前文提到的Docker Inc.和CoreOS已經賺足眼球,投資者接踵而至,大規模融資此起彼伏。企業級廠商如紅帽、Ubuntu等不甘寂寞,紛紛亮明旗幟,選擇站隊。
6月在舊金山舉行的DockerCon 2014展示了Docker對未來的雄心壯志。在Docker engine逐漸穩定并標準化的背景下,Docker的未來目標是為互聯網基礎架構制定新的標準。最近開源的libcontainer、libchan和libswarm三個項目,吹響了這場戰役的沖鋒號。
在新版本Docker engine中,由Go語言開發的libcontainer庫已取代LXC。我認為,它更大的目的是反向定義容器的實現標準,將底層實現(也許可以完全不用cgroup甚至Linux)都抽象化到libcontainer的接口。
libchan類庫,以標準接口的方式解決容器的互聯互通,實現跨平臺,能更好支持分布式系統和并發編程。
libswarm是另一個很簡單的類庫,但它將實質性地推動互聯網應用架構的創新。它抽象了應用部署和集群管理的細節,為應用程序賦予了跨云平臺和互聯網級彈性。
CoreOS的口號“A new way to think about servers”,這句話闡明了他們對改造互聯網服務器的目標。CoreOS通過最小化的定制版Linux系統為容器運行提供載體。我曾一度認為CoreOS的發展方向是與硬件更緊密結合,推出基于ARM的版本,甚至集成進入服務器固件。
然而CoreOS以實際行動證明了我的判斷錯誤:2014年8月14日,傳來了CoreOS收購Quay.IO并推出CoreOS Enterprise Registry服務的新聞。
顯然,CoreOS并不滿足于服務器層的工作,其目標定位在為企業用戶提供完整的容器技術服務棧,提供管理大型容器集群的整體解決方案。在這個類別中生存的是標準定義者,它們是整個Docker生態系統的基礎。
鏡像存儲和容器托管
這包括容器的鏡像存儲和CaaS(Container as a Service)類的容器運行托管,有代表性的公司是StackDock、Orchard、Tutum、Quay.IO、Baremetal.IO等。
這幾家幾乎全都是創業公司,他們圍繞輕量級容器的整個生命周期來設計自己的產品,有的聚焦容器鏡像描述文件(Dockerfile)向導化生成和構建過程的優化(如StackDock),有的提供包括SSD在內的高性能托管環境(如StackDock和Tutum),有的在監控和彈性擴展方面做足文章(如Tutum),也有像Baremetal.IO這樣針對企業級整體解決方案的公司。
容器的鏡像存儲和運行托管是Docker生態體系中非常接近最終用戶的一層。這個類別中的公司也許并沒有高深莫測的技術,也不是標準的定義者,但通過它們與細分市場中客戶的長期溝通合作,積累了大量Docker商用化的經驗和實踐。這一層最近有兩個并購案例:Docker收購Orchard/Fig團隊和CoreOS收購Quay.IO。是不是有點像大魚吃小魚?我們來仔細看看這兩家被“吃掉”的公司。
Orchard Laboratories(好邪乎的名字,其實只有兩名員工)開發并維護一個名為Fig的開源工具。Fig被稱為“by far the easiest way to orchestrate the deployment of multi-container applications”,也被冠以“the perfect Docker companion for developers”。簡單地說,Fig以Docker為基礎,用容器貫穿整個軟件開發流程,快速實現隔離開發環境。Fig讓用戶編寫一個簡單的fig.yml文件列出應用需要的所有Docker容器,以及它們是如何連接在一起的。編寫好fig.yml以后,只需要加上-d參數,應用就能開始上線運行了。這意味著從此開發、測試、運行環境得到統一,容器成為軟件發布的新載體。前文提到過Docker的目標是為互聯網基礎架構制定新的標準,Fig的加入使面向開發者和開發流程這個環節得到極大增強。
Quay.IO,這個團隊為用戶提供私有的Docker鏡像倉庫(Image Repository)托管服務。通過這次收購,CoreOS增強了CoreOS Enterprise Registry服務。Quay.IO也只有兩名員工。
8月20日,傳來了Tutum.co獲得260萬美元前期投資的新聞,他們是這個領域的大公司(有七名員工),作為CaaS平臺提供商,目前有1500個開發者使用其服務。
基于Docker的微PaaS
鏡像存儲(靜態)和容器托管(動態)都是以容器為單位的。下面我們將要講述以應用為單位,以容器為底層技術實現的微PaaS。
這幾年隨著Microsoft Azure、Cloud Foundry的普及(我有幸分別參與了這兩個產品在中國市場的早期推廣工作),PaaS的概念已經深入人心。傳統意義上PaaS實例一般都與一個特定的IaaS平臺綁定,提供部署接口、負載平衡、服務綁定等,然而Docker世界中產生的微PaaS,在此基礎上進一步創新。這個領域比較有代表性的是Flynn和Deis.IO,它們都是開源項目。
Flynn分為Layer 0和Layer 1兩層。Layer 0主要做底層硬件和云平臺的抽象,分布式配置、任務調度、服務發現等基礎工作,它為上層的容器運行環境提供了一個抽象的資源平臺。Flynn可以快速部署在AWS上,今后也可擴展到其他公有云和私有云。Layer 1主要服務于應用,是PaaS功能的具體實現層,它提供了基本的管理API和客戶端,實現了Git Receiver、Heroku Buildpacks、Routing和Datastore等PaaS核心功能。Layer 1本身和它所管理的應用,都以容器為載體。
Deis.IO,它的一個亮點是用CoreOS承擔底層資源管理的任務。在部署Deis PaaS環境時,首先安裝的Controller會創建一個CoreOS系統,然后在其之上以容器的方式運行Deis的所有組件。對CoreOS的支持是一個非常聰明的選擇,目前CoreOS已可以運行在多個公有云平臺、虛擬機和物理機環境下,這為Deis提供了與生俱來的跨云平臺能力。
Flynn和Deis的共同特點,是對復雜和大規模分布式應用的原生支持。Heroku創始人Adam Wiggins曾發布著名的“十二要素應用宣言(The Twelve-Factor App)”,這個宣言定義了以服務方式和通過互聯網交付的軟件應該遵循的十二個要素。Flynn和Deis都是十二要素的忠實擁護者,它們的微PaaS平臺與Heroku有極好的兼容性。
微PaaS創業公司層出不窮,競爭十分激烈,但也許走到最后的只是少數。在這一輪容器技術熱潮中,微PaaS正在影響軟件開發和運維流程,改變軟件的交付方式,把十二要素類互聯網應用架構標準化。
Orchestration、Management和Moni-t-oring
圍繞Docker API做Web UI的門檻相對較低,受到了大家的追捧,這一類主要有DockerUI、Shipyard、maDocker等。它們無一例外都調用Docker API和其他類庫,把對容器的管理和監控呈現在Web頁面中,這在某種程度上降低了企業網管對這些新技術的恐懼。
這一領域有三個不得不提的高富帥項目:Google Kubernetes、Cloud Foundry的BOSH和Diego。
Kubernetes是構建在Docker之上的容器集群管理系統,Google在2014年6月將這個項目開源。它可以為用戶提供跨平臺的處理能力,不但能夠在Google的基礎架構中運行,同時可以訪問其他的云計算服務器,如AWS,甚至是私有云。
這個系統一經開源,就得到了IBM、紅帽、微軟、Docker、Mesosphere、CoreOS和SaltStack等廠商的支持:微軟將確保Kubernetes能夠在其Azure云中作為基于Linux的虛擬機系統容器并正常運作;紅帽則將其引入了自己的云產品;IBM的計劃是為Kubernetes與Docker貢獻代碼;CoreOS將在其操作系統發行版中為Kubernetes提供支持;SaltStack正努力簡化Kubernetes運行在其他環境下的部署流程;而Mesosphere則打算將這項技術加入到自己的Mesos同名開源項目當中。Google一呼百應的大將之風展露無遺。
Cloud Foundry的BOSH是部署和運維工具,它通過類似操作系統驅動程序的CPI(Cloud Provider Interface)來實現對多種異構云平臺的支持和抽象,以近乎優雅的方式管理VM模板【注:在Cloud Foundry術語中稱為干細胞(stemcell)】、軟件發布(release)和部署配置腳本文件。最近BOSH推出了一個試驗性質的項目BOSH Release for Docker。
Cloud Foundry在它的DEA(Droplet Execution Agent)中使用基于Warden的容器技術來做PaaS的應用隔離。最新的Diego(Go語言版DEA)項目目標是讓Cloud Foundry在跨運行時環境方面更具有擴展性,這些運行時環境就包括Docker,也可能會原生支持Windows Server。
網絡層的增強和解決方案
容器之間如何互聯互通?Docker引擎中的內聯網絡能否滿足企業級別網絡的需求?當容器像今天的虛擬機一樣在企業環境大規模部署時,復雜的網絡需求如網絡配置管理、安全監控、流量QoS、網絡隔離等一定會出現。
在虛擬化的世界里,這些需求催生了龐大的網絡虛擬化(SDN)產業,在容器的環境中,是否有同樣的挑戰和機會?在這個領域中,目前受關注較多的是Skydock和VNS3開源項目,但整體上還都處在萌芽起步階段。
誰是容器技術的最終用戶
上面列出了很多公司和產品,誰將是容器技術的最終用戶呢?我認為會在以下幾個領域取得突破。
互聯網公司
互聯網公司的開發運維環境復雜,應用多采用分布式架構,后臺使用服務的種類繁多,這些都是Docker最擅長解決的問題。據統計,國內外已有一定數量的互聯網公司將Docker集成到內部的開發測試流程,并以Docker為載體發布應用。GROUPON曾在社區分享他們使用Docker與Jenkins結合做持續集成的案例,國內例如七牛等新興互聯網公司也開始應用Docker。
傳統ISV
在整個SDLC(Systems Development Life Cycle)環節中引入Docker,特別是增強以容器為核心的持續集成和持續交付,最終將容器作為軟件向云平臺交付的實體。這方面目前并沒有產品化的整體解決方案,國外如Shippable,國內如Coding等創業公司在向這個方向努力。
移動開發
這是軟件開發最熱門的領域,圍繞社交、移動、游戲的MBaaS(Mobile Backend as a Service)已有不少成型的產品。Docker,微PaaS如何與移動應用開發相結合,是另一個值得關注的領域。
除此以外,Docker生態系統在大數據等領域也發展了若干開源工具和項目,這里不一一贅述。
以上是Docker生態系統的一個快照,這個領域的發展可謂一日千里,標準化、開源開放、創業公司、大企業支持、風險投資等特征形成了一個滾雪球的模式,將助推這一輪技術革新到更高的一個臺階。