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