關(guān)于其各種容器(container)選項(xiàng),微軟公司并沒(méi)有提供很好的文檔介紹。故而在本文中,我將為您介紹當(dāng)您所在企業(yè)組織開(kāi)始對(duì)其進(jìn)行部署時(shí)需要考慮哪些東西。
今年一月份,我為Computerworld網(wǎng)站撰寫(xiě)了一篇關(guān)于Windows Server 2016技術(shù)預(yù)覽測(cè)評(píng)的文章。我在這篇文章中提到了Windows Server最新的對(duì)于Hyper-V容器的支持已被添加到其對(duì)于Docker樣式容器的支持。
然而,兩個(gè)容器選項(xiàng)的存在卻導(dǎo)致了很多的問(wèn)題。一款Docker容器與新的Hyper-V容器之間的區(qū)別到底是什么?在哪些情況下,您企業(yè)想要使用其中的一款容器解決方案而非另一款?是否有單獨(dú)的方法來(lái)部署這些容器解決方案呢?
關(guān)于這兩種容器選項(xiàng),微軟公司并沒(méi)有提供非常詳盡的文檔介紹。而對(duì)于Windows Server平臺(tái)而言,容器本身又是很新的。鑒于上述這兩方面的因素,我想要專(zhuān)門(mén)就Windows Server 2016在當(dāng)前發(fā)布的預(yù)覽版中究竟提供了什么具體的容器解決方案,或承諾將在該軟件的RTM(Release to Manufacturing)版本發(fā)布日期(很有可能是在2016年下半年)之前所提供的,做一個(gè)整體性的介紹。
然而,就目前而言,您企業(yè)組織最好的辦法便是仔細(xì)閱讀有關(guān)不同容器選項(xiàng)的相關(guān)資料,并盡可能的推遲部署。我們?nèi)匀贿€處在Windows Server容器進(jìn)程的早期,故而仍然有很多細(xì)節(jié)問(wèn)題有待解決。
概述
當(dāng)前,在Windows Server 2016中有兩種類(lèi)型的容器:Windows Server容器和Hyper-V容器。兩者都僅適用于Windows Server;例如,兩者都不可以混合和匹配Linux或Unix。
對(duì)于像我這樣懶惰的管理者來(lái)說(shuō),不妨就讓我們開(kāi)門(mén)見(jiàn)山的從重要的問(wèn)題開(kāi)始吧:兩種類(lèi)型的容器中是否存在一種容器要比另一種容器更難以部署呢?答案是否定的。
容器類(lèi)型執(zhí)行不同,并在系統(tǒng)管理程序中,擁有不同級(jí)別的隔離和信任程度。但在其核心,這是一個(gè)由所有者的物理機(jī)所做出的部署時(shí)間決策——主機(jī)所有者決定哪種類(lèi)型的容器將被使用,其就像在一個(gè)向?qū)С绦驒z查正確的單選按鈕一樣簡(jiǎn)單。您只需在創(chuàng)建時(shí)從兩種容器中選擇一種。該決策將影響到Windows Server 2016這一操作系統(tǒng)本身(虛擬機(jī)管理程序,這一切的底層的東西,運(yùn)行在其之上的硅芯片和物理硬件設(shè)備)——在每種容器中隔離和執(zhí)行工作負(fù)載。
那么,既然您現(xiàn)在已經(jīng)知道了:部署任何一種容器選項(xiàng)給您企業(yè)所帶來(lái)的工作量都是相同的,您又要怎樣聰明地在兩者之間作出決定呢?本質(zhì)上,其要?dú)w結(jié)為信任:如果您信任運(yùn)行在容器中的代碼,那么您會(huì)選擇一款Windows Server容器(即:傳統(tǒng)的Docker式)。而如果您不信任代碼,或者無(wú)法驗(yàn)證代碼,又或者這些代碼不是來(lái)自您自己企業(yè)組織內(nèi)部的開(kāi)發(fā)人員,那么,一款Hyper-V容器則是您所應(yīng)該選擇的。下面,就讓我們來(lái)詳細(xì)的看看每種容器選項(xiàng)吧。
Windows Server容器
Windows Server容器實(shí)際上只是Docker開(kāi)源容器項(xiàng)目的一部分,所以如果您企業(yè)組織考慮部署一款Docker式的容器,您會(huì)考慮一款Windows Server容器。這些容器本質(zhì)上是一種新型的虛擬機(jī),在某些方面比傳統(tǒng)的虛擬機(jī)的隔離性要小——因?yàn)樵诤芏嗲闆r下,在主機(jī)上運(yùn)行的所有容器都是共享的。在這些共享的項(xiàng)目中,包括了操作系統(tǒng)文件、目錄和運(yùn)行服務(wù)。這樣做是為了提高效率,因?yàn)槿绻谥鳈C(jī)上運(yùn)行三種不同的容器,所有相同版本的Windows Server將作為客戶(hù),您在任何給定的時(shí)間都只需要一個(gè)C:Windows 目錄副本。
這種共享仍然從可能運(yùn)行在主機(jī)上的任何給定的應(yīng)用程序分離容器——但其也降低了管理費(fèi)用,使容器更輕量級(jí)。使得您企業(yè)組織能夠因?yàn)檫@種共享而讓每臺(tái)運(yùn)行容器的服務(wù)器獲得更多的空間,而不像傳統(tǒng)的虛擬機(jī),其更加孤立且不共享任何東西——因而往往有更多的重復(fù)。當(dāng)您企業(yè)組織的主機(jī)和客戶(hù)機(jī)都運(yùn)行了相同的操作系統(tǒng),以便能夠充分利用這一共享時(shí),您通常也會(huì)使用Windows Server容器;這樣,您就不能在Windows Server 2016主機(jī)上運(yùn)行一款Ubuntu Server容器。(對(duì)于這種類(lèi)型的工作負(fù)載,您將使用傳統(tǒng)的虛擬機(jī)。容器將不適合這種情況。您會(huì)使用虛擬機(jī),其自2008年以來(lái)就已經(jīng)支持Windows了。)
不管怎樣,現(xiàn)在由Windows Server容器支持的兩種容器圖像操作系統(tǒng)是Server Core(不帶圖形用戶(hù)界面的Windows)和Windows Nano Server,從根本上重構(gòu)了適合于面向小微服務(wù)角色的微服務(wù)器。(更多的是關(guān)于微服務(wù)。)
那么,Docker將如何適應(yīng)所有這一切呢? Docker提供了一個(gè)“管理層”,如果您愿意,API和引擎將管理容器——其已經(jīng)迅速成為行業(yè)標(biāo)準(zhǔn),而究其原因則很可能是因?yàn)镈ocker本身是開(kāi)源的,并得到了廣泛的應(yīng)用。而互聯(lián)網(wǎng)上的任何人都可以使用的Docker Hub則是一款真正市場(chǎng)風(fēng)格的存儲(chǔ)庫(kù),所有的應(yīng)用程序都運(yùn)行在Docker式的容器中。
Docker還提供了一款框架,開(kāi)發(fā)人員們可以用來(lái)更接近其代碼的實(shí)際操作,并建立他們的代碼運(yùn)行所需要的整個(gè)環(huán)境容器。開(kāi)發(fā)人員們基本上是建立容器的圖像,然后再很容易的運(yùn)到操作,而且基本上其是作為客戶(hù)機(jī)運(yùn)行在主機(jī)上。更新和代碼修復(fù)可以以相同的方式被快速和容易地處理。
這些容器圖像甚至可以在整個(gè)應(yīng)用程序的很小一部分上工作,這組成了解決方案,并使得其更容易在一個(gè)面向微服務(wù)的環(huán)境中工作。從一個(gè)全局的角度來(lái)看,借助容器的工作使得開(kāi)發(fā)人員們能夠編寫(xiě)出良好的代碼,進(jìn)而更好的在他們的環(huán)境中工作運(yùn)行。開(kāi)發(fā)人員可以不用再編寫(xiě)那種在他們自己的開(kāi)發(fā)機(jī)器上工作運(yùn)行良好,但部署到生產(chǎn)軟件上就完全沒(méi)有作用的代碼了——因?yàn)槎攥F(xiàn)在是一樣的了,而代碼必須在兩個(gè)地方都能工作運(yùn)行。這也降低了操作運(yùn)行人員和IT人員之間的摩擦——在原始服務(wù)器環(huán)境狀態(tài)的IT和開(kāi)發(fā)人員期望獲得某些配置,但往往缺乏能力或理由改變生產(chǎn)環(huán)境,以適應(yīng)他們的期望。
這些Docker式的Windows Server容器意味著一定程度的信任——要么是您已經(jīng)從Docker Hub下載了一款受信任的應(yīng)用程序,要么是您企業(yè)組織內(nèi)部的開(kāi)發(fā)人員或合同開(kāi)發(fā)人員為您提供了運(yùn)行您所信任的代碼的容器。對(duì)于那些在容器中擁有可信代碼的應(yīng)用程序,Windows Server容器是被推薦且適當(dāng)?shù)?。操作系統(tǒng)文件的共享和投影不應(yīng)成為受信任代碼的問(wèn)題。
但是,當(dāng)不受完全信任的代碼或應(yīng)用程序需要更多一點(diǎn)的安全,更多一點(diǎn)的隔離時(shí),會(huì)發(fā)生什么呢?
Hyper-V容器
當(dāng)您企業(yè)組織開(kāi)始考察Hyper-V容器時(shí),您會(huì)發(fā)現(xiàn),其通過(guò)靈活性、圖像和易于重新部署Docker式Windows Server容器的格式,以及Docker API和我在上文中所討論的管理工具,將隔離的模型和傳統(tǒng)虛擬機(jī)的抽象進(jìn)行了結(jié)合。
微軟Azure的首席技術(shù)官M(fèi)ark Russinovich去年在一篇博客中寫(xiě)道:Hyper-V容器“將應(yīng)用程序與擔(dān)保相關(guān)的傳統(tǒng)虛擬化隔離,但卻是借助方便的、圖像格式和Windows Server 容器管理模型,包括Docker引擎的支持。”這里的區(qū)別就在于隔離級(jí)別水平:Hyper-V容器不直接與主機(jī)共享操作系統(tǒng)文件、進(jìn)程和服務(wù)。相反, Windows Server將每個(gè)小容器圖像包裹在一臺(tái)功耗非常低的虛擬機(jī)中,從而實(shí)現(xiàn)一款Docker式的Windows Server容器所不具備的抽象和信任邊界。
然而,該虛擬機(jī)對(duì)于所有意圖和目的的管理員是透明的。容器圖像本身運(yùn)行Windows Server能夠理解:事實(shí)上,容器圖像和不定期運(yùn)行在不受限制的硅芯片上,從而能夠充分利用對(duì)于來(lái)自這種意識(shí)操作系統(tǒng)的優(yōu)化。但是,即使這些容器圖像更加隔離孤立,他們的部署與Windows Server容器也沒(méi)有任何不同。您仍然可以使用Docker API。您仍然使用Docker客戶(hù)端。您只需選中一個(gè)不同的盒子,而容器圖像本身都以相同的方式建立和交付,不論您想用哪些隔離模式來(lái)運(yùn)行它們。
這種方法的缺點(diǎn)是:會(huì)帶來(lái)更多的管理費(fèi)用開(kāi)銷(xiāo)。由于額外的隔離,更多的代碼和進(jìn)程被復(fù)制。事實(shí)上,即使封裝了一款Hyper-V容器的輕量級(jí)的虛擬機(jī)很小,但其的確增加了運(yùn)行一個(gè)容器圖像的成本。所以當(dāng)您可以把一款功能強(qiáng)大的主機(jī)塞滿(mǎn)Docker樣式的Windows Server容器時(shí),Hyper-V容器將被限制在較少數(shù)量的容器,其它所有的硬件都一樣。
再次強(qiáng)調(diào),這些容器圖像將只支持Windows Server。即使有隔離,但容器圖像和主機(jī)操作系統(tǒng)之間仍然有共同的共享性。所以如果您企業(yè)組織的容器圖像運(yùn)行了Linux,另一種風(fēng)格的Unix,BSD或任何其他可替代的操作系統(tǒng),對(duì)您企業(yè)而言,這些新的Windows Server 2016的功能都將無(wú)關(guān)緊要。
最重要的一點(diǎn)是:第三方代碼、市場(chǎng)代碼、或任何不被您企業(yè)組織的任何一個(gè)部分完全信任的代碼都應(yīng)該在Hyper-V容器中運(yùn)行。這些同時(shí)也是多租戶(hù)公有云和其他類(lèi)似環(huán)境用戶(hù)的最佳選擇。除了容量能力,您企業(yè)什么也不會(huì)失去,但您卻因?yàn)楦庸铝⒍@得了安全優(yōu)勢(shì)。
Docker容器
現(xiàn)在為了證明其一直是任何技術(shù)最困難的部分,請(qǐng)?jiān)试S我介紹Docker容器。在上文中,我提到了Windows Server容器是Docker開(kāi)源項(xiàng)目的一部分。Docker容器有別于Windows Server 容器。 Windows Server 容器可以使用所有Docker的基礎(chǔ)技術(shù),但現(xiàn)有的用于管理Docker容器的Docker工具集(至少在當(dāng)前這個(gè)版本中)與Windows Server容器并不兼容,也不與Windows Server容器管理工具兼容。
Docker容器都是其自身特定的事情,而Windows Server容器就像Docker 容器一樣又能力共享和隔離——而這也就是我為什么將其稱(chēng)之為Docker樣式的Windows Server容器的原因所在了——他們不是Docker容器本身。這在未來(lái)可能會(huì)改變,特別是在一個(gè)服務(wù)包或下一個(gè)版本的Windows Server中。但現(xiàn)在,即使這三種容器的類(lèi)型可能都是相似的,但仍然有著不同的概念。Windows Server當(dāng)前只支持兩種容器。
當(dāng)今的技術(shù)狀況
眼下,在Windows Server 2016中支持的容器涉及到非常多的正在進(jìn)行中工作。有很多部分都移到了容器中:消除對(duì)主機(jī)和操作系統(tǒng)文件,以及特定的版本和補(bǔ)丁級(jí)別的依賴(lài);實(shí)現(xiàn)恰當(dāng)?shù)母綦x,并確保沒(méi)有任何代碼能夠破壞安全和信任邊界;使得開(kāi)發(fā)人員能夠獲得合適的工具和自動(dòng)化水平,進(jìn)而使得開(kāi)發(fā)人員們能夠在他們首選的集成開(kāi)發(fā)環(huán)境(IDE)中與容器工作,并能夠?qū)⑺麄兊膽?yīng)用程序直接導(dǎo)入到容器;確保容器可以在公共云中無(wú)縫的上下移動(dòng);等等。
在所有這些情況中,仍然存在致命的工作錯(cuò)誤和bug。如果容器對(duì)于您企業(yè)服務(wù)產(chǎn)品的路線發(fā)展藍(lán)圖是至關(guān)重要的話(huà),那么您可能希望現(xiàn)在就開(kāi)始測(cè)試Windows Server容器和Hyper-V容器的功能,特別是檢查PowerShell命令對(duì)于容器是否可用,以及是否可以在Windows Server 2016主機(jī)上管理它們。
但是,如果容器是一個(gè)不錯(cuò)的選擇,但對(duì)于您所在的企業(yè)組織又不是一個(gè)必須的選擇的話(huà),那么我的建議是推遲嘗試任何事情,同時(shí)使用技術(shù)預(yù)覽版4進(jìn)行最基本的探索研究。目前仍然存在太多的不確定因素——包括前面提到的致命的錯(cuò)誤和bug——以便能夠真正獲得一個(gè)統(tǒng)一的掌握。
對(duì)于Windows平臺(tái)而言,容器的支持將是相當(dāng)令人興奮的。而關(guān)于其他方面,還有更多值得介紹的內(nèi)容。
關(guān)于作者
本文作者喬納森·哈塞爾負(fù)責(zé)運(yùn)行著82 Ventures公司,82 Ventures公司是一家總部設(shè)在北卡羅來(lái)納州夏洛特的技術(shù)寫(xiě)作和咨詢(xún)公司。