Windows Server Containers 支持 Windows 开发者使用 Docker
在過(guò)去幾年里,Docker 和容器已成為全球開(kāi)發(fā)界和企業(yè)最熱門的話題之一。去年秋天發(fā)布的 Windows Server 2016 支持 Windows 開(kāi)發(fā)者使用容器,使得這一熱門話題再次升溫。Windows 和 Docker 是如何走到一起的? 一切始于 2014 年隆重舉辦的普吉特海灣夏令營(yíng),當(dāng)時(shí) Windows Base 團(tuán)隊(duì)啟動(dòng)了一個(gè)新項(xiàng)目,最終推出了 Windows Server Containers。這是代碼背后的故事,讓我們得以瞥見(jiàn) Windows Server 2016 中一項(xiàng)熱門新功能的推出過(guò)程。
容器的歷史和 Docker 的起源
2013 年,容器迅速引起了 Solomon Hykes 的興趣,他當(dāng)時(shí)是平臺(tái)即服務(wù) (PaaS) 創(chuàng)業(yè)公司 DotCloud 的 CTO 和創(chuàng)始人。Hykes 選擇了一組相對(duì)復(fù)雜難懂且難用的 Linux 內(nèi)核功能,并使用他稱為 Docker 的開(kāi)放源代碼工具將它們匯集到一起。他并不是有意成為容器方面的佼佼者,只是為了尋找解決方案來(lái)解決困擾 DotCloud 的問(wèn)題: 開(kāi)發(fā)者如何確保代碼在服務(wù)器上的運(yùn)行方式與其在工作環(huán)境中的一樣??
困擾 DotCloud 等服務(wù)的真正問(wèn)題是由客戶想要部署大量各種各樣的軟件應(yīng)用程序引起的,這些軟件根據(jù)不同的開(kāi)發(fā)流程、修補(bǔ)程序周期和要求用不同的語(yǔ)言(代碼和口頭語(yǔ)言)編寫而成,包含各種依賴項(xiàng)。硬件虛擬化(即虛擬機(jī) (VM))是可用的最佳工具,但對(duì)將軟件從開(kāi)發(fā)者筆記本電腦交付到生產(chǎn)環(huán)境提出了挑戰(zhàn)。要么必須使用開(kāi)發(fā)者的完全配置 VM,但這會(huì)導(dǎo)致擴(kuò)展和管理難以進(jìn)行;要么必須讓部署工具和腳本能夠評(píng)估 VM 并安裝開(kāi)發(fā)者的應(yīng)用程序,但這樣做的靈活性不是很高且不可靠。
Hykes 認(rèn)為 Docker 可以解決此問(wèn)題,現(xiàn)在回想起來(lái),他當(dāng)時(shí)的想法確實(shí)很有意義。不過(guò),他的公司并不是第一家涉足容器的云服務(wù)公司;事實(shí)上是另一家云服務(wù)公司 Google 根據(jù)需要開(kāi)創(chuàng)了整個(gè)概念。2006 年,Google 工程師 Rohit Seth 提交了一個(gè) Linux 內(nèi)核修補(bǔ)程序,其支持借助他稱為 cgroups 功能中的一系列常見(jiàn)資源控制將進(jìn)程匯集到一起。Seth 開(kāi)始對(duì)此修補(bǔ)程序的描述如下: “商品硬件越來(lái)越強(qiáng)大。這樣一來(lái),可以在同一平臺(tái)上運(yùn)行不同的工作負(fù)載,從而更好地利用硬件資源”(bit.ly/2mhatrp)。雖然 cgroups 解決了資源隔離的問(wèn)題,但并沒(méi)有解決分發(fā)不一致的問(wèn)題。正因?yàn)槿绱?#xff0c;Docker 不僅使用 cgroups,還使用另一種 Linux 技術(shù),就是命名空間。
命名空間于 2002 年被引入 Linux 內(nèi)核,提供了一種用于控制進(jìn)程可以查看的資源以及控制調(diào)用哪些資源的方法。命名空間與訪問(wèn)控制大不相同,因?yàn)檫M(jìn)程甚至不知道資源是否存在或是否在使用它們的某個(gè)版本。與此相關(guān)的一個(gè)簡(jiǎn)單例子是進(jìn)程列表:服務(wù)器上可以運(yùn)行 20 個(gè)進(jìn)程,而在命名空間中運(yùn)行的進(jìn)程可能只看到其中五個(gè)進(jìn)程,其余的進(jìn)程均已隱藏。再例如,某進(jìn)程可能會(huì)認(rèn)為它正從根目錄讀取內(nèi)容,而實(shí)際上它是從另一獨(dú)立位置虛擬化而來(lái)。易用的開(kāi)放源代碼產(chǎn)品中結(jié)合了 cgroups、命名空間和寫入時(shí)復(fù)制 (CoW) 文件系統(tǒng)技術(shù),這成為了 Docker 的基礎(chǔ)所在。
到 2013 年中旬,Hykes 及其團(tuán)隊(duì)生成的 Docker 工具集開(kāi)始流行,成為 GitHub 上的熱門趨勢(shì)項(xiàng)目之一,并正式推出了 Docker 品牌。Hykes 的工作重心從 DotCloud 轉(zhuǎn)移到 Docker 上,他最終從 DotCloud 業(yè)務(wù)中獨(dú)立出來(lái),但仍是 Docker Inc. 的 CTO。
Windows Server Containers
在 Docker 受到 Linux 界重視的同一時(shí)期,Windows Base 團(tuán)隊(duì)一直在想方設(shè)法隔離執(zhí)行客戶或第三方代碼的 Microsoft Azure 服務(wù)并提高其效率。代號(hào)為“Drawbridge”的 Microsoft 研究原型提供了一種研究渠道;此項(xiàng)目生成了可利用庫(kù)操作系統(tǒng)的進(jìn)程隔離容器 (bit.ly/2aCOQxP)。遺憾的是,Drawbridge 在可維護(hù)性、性能和應(yīng)用程序兼容性方面存在限制,導(dǎo)致其不適合作為常規(guī)用途解決方案。另一項(xiàng)稱為“服務(wù)器接收器”的更早原型技術(shù)一開(kāi)始好像還是值得研究的。接收器擴(kuò)展了現(xiàn)有的 Windows 作業(yè)對(duì)象方法,此方法可提供進(jìn)程分組和資源控制(與 Linux 中的 cgroups 類似)(bit.ly/2lK1AbI)。服務(wù)器接收器原型新增的是獨(dú)立執(zhí)行環(huán)境,包括文件系統(tǒng)、注冊(cè)表和對(duì)象命名空間(類似于 Linux 中的命名空間)。由于出現(xiàn)了 VM,服務(wù)器接收器原型被擱置多年,但現(xiàn)在被重新定義為 Windows Server Containers 的基礎(chǔ)。
服務(wù)器接收器原型代碼多年無(wú)人問(wèn)津。甚至沒(méi)有進(jìn)行編譯,更別提運(yùn)行了。編寫此原型代碼的初衷是為了證明這項(xiàng)技術(shù)在 Windows 中是可行的,但距離生產(chǎn)還有很大一段距離。Windows Base 團(tuán)隊(duì)面臨的選擇是,從頭開(kāi)始還是嘗試恢復(fù)原型并繼續(xù)研究下去。我們選擇了后者。最初開(kāi)發(fā)此原型時(shí),只安排了一小組的開(kāi)發(fā)者來(lái)證明這項(xiàng)技術(shù)的可行性,但現(xiàn)在是集 Windows 工程團(tuán)隊(duì)的全部力量來(lái)開(kāi)發(fā)此項(xiàng)目。來(lái)自 Windows 的架構(gòu)師和工程師們應(yīng)征而來(lái)助陣。存儲(chǔ)團(tuán)隊(duì)生成了文件系統(tǒng)虛擬化;網(wǎng)絡(luò)團(tuán)隊(duì)生成了網(wǎng)絡(luò)隔離;內(nèi)核團(tuán)隊(duì)生成了內(nèi)存管理和計(jì)劃抽象;等等。
一些大的架構(gòu)性問(wèn)題依然存在;尤其是我們?cè)撊绾翁幚硐到y(tǒng)進(jìn)程? 在 Linux 中,容器通常只運(yùn)行一個(gè)進(jìn)程,用于將內(nèi)核中的系統(tǒng)服務(wù)與主機(jī)和其他容器共享。然而,為了提高可維護(hù)性和安全性,Windows 多年來(lái)一直在努力將代碼從內(nèi)核移到用戶模式進(jìn)程中。這就給我們的團(tuán)隊(duì)帶來(lái)了一個(gè)問(wèn)題: 要么共享所有系統(tǒng)服務(wù)(必須將所有系統(tǒng)服務(wù)更改為能夠發(fā)現(xiàn)容器),要么在每個(gè)容器中生成用戶模式系統(tǒng)服務(wù)的新副本。這是一個(gè)很為難的決定,因?yàn)槲覀儞?dān)心在每個(gè)容器中生成所有用戶模式服務(wù)的新實(shí)例會(huì)對(duì)密度和啟動(dòng)時(shí)間造成影響。另一方面,我們還擔(dān)心在 Windows 中更新所有系統(tǒng)服務(wù)不僅操作起來(lái)十分復(fù)雜,而且還要承擔(dān)持續(xù)成本,無(wú)論是我們還是 Windows 外部開(kāi)發(fā)者。最后,我們綜合了這兩種方法,精選了一組服務(wù)使其能夠發(fā)現(xiàn)容器,但大多數(shù)服務(wù)仍在每個(gè)容器中運(yùn)行。
對(duì)密度造成的影響是最小的,因?yàn)槿萜鞅舜酥g以及與主機(jī)共享只讀內(nèi)存,所以只有專用內(nèi)存是按容器分配的。不過(guò),啟動(dòng)時(shí)間是我們面臨的巨大挑戰(zhàn),我們也多次質(zhì)疑了這項(xiàng)決定;當(dāng)我們?cè)?Build 2015 開(kāi)發(fā)者大會(huì)的主題發(fā)言階段首次展示 Windows Server Containers 時(shí),啟動(dòng)時(shí)間為幾秒鐘,主要是由于系統(tǒng)服務(wù)的啟動(dòng)時(shí)間所致。不過(guò),Windows Server 性能團(tuán)隊(duì)也加入進(jìn)來(lái)。他們進(jìn)行了剖析和分析,并與 Windows 團(tuán)隊(duì)協(xié)作,共同加快服務(wù)運(yùn)行速度,并減少依賴項(xiàng),從而提高并行度。這項(xiàng)工作的成果是,不僅容器可以更快啟動(dòng),實(shí)際上還縮短了 Windows 啟動(dòng)時(shí)間。(如果你的 Xbox 或 Surface 從去年開(kāi)始啟動(dòng)速度更快了,這就要?dú)w功于容器了。) 在不到一年的時(shí)間里,容器啟動(dòng)時(shí)間從大約七八秒縮短為亞秒級(jí),而且縮短啟動(dòng)時(shí)間的趨勢(shì)即使今天也仍在延續(xù)。
Hyper-V 隔離
關(guān)于 Hyper-V 隔離,提出的第一個(gè)問(wèn)題經(jīng)常是:“容器還沒(méi)有提供隔離嗎? 那我還需要 Hyper-V 做什么?” 容器確實(shí)提供隔離,并且在大多數(shù)情況下隔離很可能完全夠用。不過(guò),存在以下風(fēng)險(xiǎn):如果攻擊者能夠入侵內(nèi)核,就可能會(huì)脫離容器,并影響其他容器或主機(jī)。由于內(nèi)核攻擊在 Windows 中相對(duì)常見(jiàn)(每年通常都會(huì)有幾次),因此對(duì)于在共享的基礎(chǔ)結(jié)構(gòu)上使用和執(zhí)行最終用戶或第三方代碼的服務(wù)(如 Azure 自動(dòng)化或 Azure 機(jī)器學(xué)習(xí))而言,風(fēng)險(xiǎn)就太高了,不能只依賴內(nèi)核隔離。生成和運(yùn)行這些類型服務(wù)的團(tuán)隊(duì)要么必須管理所有 VM 的密度和啟動(dòng)成本,要么必須生成不同的安全和隔離技術(shù)。需要的是常規(guī)用途隔離機(jī)制,不僅能夠防御入侵者,還提供多租戶安全性: 即提供 Hyper-V 隔離的 Windows Server Containers。
我們的團(tuán)隊(duì)為推出 Windows Server Containers 而不懈努力,這為生成這些服務(wù)的團(tuán)隊(duì)提供了很好的體驗(yàn)和管理模型。通過(guò)將技術(shù)與經(jīng)過(guò)良好測(cè)試的 Hyper-V 隔離相結(jié)合,我們可以提供所需的安全性。不過(guò),我們需要應(yīng)對(duì) VM 歷來(lái)都會(huì)帶來(lái)的啟動(dòng)時(shí)間和密度挑戰(zhàn)。
與大多數(shù)虛擬化平臺(tái)一樣,Hyper-V 旨在通過(guò)各種操作系統(tǒng)(無(wú)論新舊)來(lái)運(yùn)行來(lái)賓。目標(biāo)是讓行為盡可能與硬件類似。為了實(shí)現(xiàn)這些目標(biāo),大多數(shù)虛擬化平臺(tái)選擇的解決方案都是仿真常見(jiàn)硬件。然而,隨著虛擬化的普及化,操作系統(tǒng)變得“開(kāi)放”(經(jīng)過(guò)具體修改,可作為來(lái)賓 VM 良好運(yùn)行),這樣也就不再需要那么多的仿真。與此有關(guān)的一個(gè)良好示例是 Hyper-V 第 2 代 VM,它為了縮短啟動(dòng)時(shí)間并提升性能而放棄了仿真,但仍實(shí)現(xiàn)了行為與直接在硬件上運(yùn)行來(lái)賓一樣的同一目標(biāo) (bit.ly/2lPpdAg)。
對(duì)于容器,我們的需求和目標(biāo)都不同: 我們不需要運(yùn)行任何舊版操作系統(tǒng),我們明確知道 VM 內(nèi)將要執(zhí)行的工作負(fù)載,就是容器。因此,我們生成了一種新型 VM,即旨在運(yùn)行容器的 VM。為了滿足快速啟動(dòng)的需求,我們生成了克隆技術(shù)。對(duì)于傳統(tǒng) VM 來(lái)說(shuō),這一直都是一項(xiàng)挑戰(zhàn),因?yàn)椴僮飨到y(tǒng)專精于主機(jī)名和標(biāo)識(shí)等方面,所以如果不重啟,就無(wú)法輕松進(jìn)行更改。不過(guò),由于容器有自己的主機(jī)名和標(biāo)識(shí),因此這不再是問(wèn)題。克隆也有助于應(yīng)對(duì)密度挑戰(zhàn),但我們必須深入下去: 我們需要的是內(nèi)存共享。
共享內(nèi)存的方法有兩種。可以查找多個(gè) VM 共用的內(nèi)存,并有效刪除重復(fù)內(nèi)存(盡管大多數(shù)內(nèi)核中的內(nèi)存隨機(jī)化技術(shù)讓這難以實(shí)現(xiàn))。也可以采用內(nèi)核使用的方法,將只讀(公共)內(nèi)存與讀寫(專用)內(nèi)存區(qū)分開(kāi)來(lái)。后一種方法通常要求來(lái)賓 VM 中的內(nèi)存管理程序彼此交互,但這與隔離要求相背。不過(guò),通過(guò)更改 VM 啟動(dòng)和訪問(wèn)文件的方式,我們發(fā)現(xiàn)了一種方法,使得主機(jī)不必信任來(lái)賓,來(lái)賓也不必相互信任。VM 不是從虛擬硬盤啟動(dòng)和訪問(wèn)文件,而是直接從主機(jī)文件系統(tǒng)啟動(dòng)和訪問(wèn)文件。也就是說(shuō),主機(jī)可以提供相同的只讀(公共)內(nèi)存共享功能。這是將密度擴(kuò)大多個(gè)數(shù)量級(jí)的關(guān)鍵所在,以便我們可以在未來(lái)幾年里繼續(xù)擴(kuò)大密度。
我們發(fā)現(xiàn) Hyper-V 隔離具有另一價(jià)值,即通過(guò)為在 Windows 10 計(jì)算機(jī)上生成容器化應(yīng)用程序的開(kāi)發(fā)者對(duì)容器運(yùn)行不同的內(nèi)核,我們?nèi)钥梢赃\(yùn)行服務(wù)器內(nèi)核,以確保這些開(kāi)發(fā)者的應(yīng)用程序在生產(chǎn)環(huán)境和開(kāi)發(fā)計(jì)算機(jī)中的運(yùn)行方式相同。因此,在 Windows 10 周年更新中,我們啟用了提供 Hyper-V 隔離的 Windows Server Containers,并在用于 Windows 的 Docker 中結(jié)合使用 Docker,以便充分利用這一面向開(kāi)發(fā)者的新技術(shù)。
Docker 和 Windows Server Containers
還有一個(gè)問(wèn)題仍未解決,就是用戶該如何與這種新平臺(tái)技術(shù)進(jìn)行交互? 在 Linux 界,Docker 備受贊譽(yù),迅速成為約定俗成的容器管理標(biāo)準(zhǔn)。為什么不讓用戶以同樣的方式使用 Windows Server Containers 呢? 在飛到舊金山初次接觸到 Docker 的那個(gè)秋天,我完全不確定那家公司是否會(huì)想到基于 Windows 的容器,也不確定它是否有興趣在 Windows 基礎(chǔ)之上進(jìn)行生成。讓我感到驚訝的是: Solomon 認(rèn)為 Windows 容器的想法非常棒! 但這家公司是否會(huì)在 Windows 基礎(chǔ)之上進(jìn)行生成呢? 那次談話徹底改變了項(xiàng)目面貌。Solomon 直接回應(yīng)說(shuō):“大家都知道 Docker 是一款開(kāi)放源代碼工具,當(dāng)然可以添加代碼,使之適用于 Windows,我們將會(huì)提供幫助。”然后,我們就這樣做了。從那以后,Hyper-V 團(tuán)隊(duì)的軟件工程師 John Howard 就成為了 Docker 項(xiàng)目的維護(hù)人員,他實(shí)際上已上升到排名第四的全職代碼參與者 (bit.ly/2lAmaZX)。圖 1?展示了容器和 Docker 在 Windows 和 Linux 上的基本體系結(jié)構(gòu)。
?
圖 1:比較容器和 Docker 在 Windows 和 Linux 上的基本體系結(jié)構(gòu)
綜述
四個(gè)月前,在 Microsoft Ignite,我們推出了 Windows Server 2016,并宣布擴(kuò)展了與 Docker 的合作伙伴關(guān)系。也就是說(shuō),Docker 將為 Windows Server 客戶提供其商業(yè)版 Docker Engine,而不額外收取任何費(fèi)用。從那以后,事務(wù)應(yīng)接不暇。Tyco 等客戶一直在使用 Docker 和 Windows Server Containers 來(lái)徹底改變他們生成軟件的方式,并使現(xiàn)有應(yīng)用程序現(xiàn)代化,所有這些工作都是在同一平臺(tái)上完成的 (bit.ly/2dWqIFM)。Visual Studio 2017 完全集成了 Windows 和 Linux 容器工具,包括 F5 調(diào)試;Visual Studio Code 內(nèi)置了 Dockerfile 和撰寫支持。Azure 和 Amazon 的容器服務(wù)都新增了對(duì) Windows Server Containers 的支持,從 Docker Hub 拉取的基于 Windows 的容器映像已超過(guò) 1 百萬(wàn)個(gè)。為了實(shí)現(xiàn)端到端安全性和業(yè)務(wù)流程,Docker 數(shù)據(jù)中心為開(kāi)發(fā)者和系統(tǒng)管理員提供了可隨時(shí)隨地生成、交付和運(yùn)行已分發(fā)應(yīng)用程序的平臺(tái)。借助 Docker,組織可以將應(yīng)用程序交付時(shí)間從幾個(gè)月縮短到幾分鐘、在數(shù)據(jù)中心和云之間順暢地移動(dòng)工作負(fù)載,并讓計(jì)算資源的使用效率提高超過(guò) 20 倍。
在接手容器時(shí),我就知道這將是一個(gè)高壓項(xiàng)目。我知道將要加班到很晚,甚至還要在周末加班,需要付出巨大努力,但這一切都是值得的,因?yàn)榭梢詭椭鷶?shù)以百萬(wàn)計(jì)的開(kāi)發(fā)者更快速地生成更多應(yīng)用。我也知道自己會(huì)樂(lè)在其中,因?yàn)橛袡C(jī)會(huì)真正改變?nèi)藗冊(cè)?Windows 上開(kāi)發(fā)和運(yùn)行應(yīng)用程序的方式。這比我預(yù)想的要更有趣,但同時(shí)付出的努力也超出預(yù)期,這段經(jīng)歷對(duì)我來(lái)說(shuō)是無(wú)價(jià)的。回憶起此項(xiàng)目初期的一個(gè)周末,我正在辦公室加班,從窗戶向外望去,外面夏日炎炎,這時(shí)我在心里對(duì)自己說(shuō):“我相信并希望人們會(huì)使用這款產(chǎn)品…”
Taylor Brown?是 Microsoft Windows 和設(shè)備組的項(xiàng)目管理主要負(fù)責(zé)人。作為 Windows Base 工程團(tuán)隊(duì)的一員,他負(fù)責(zé)制定 Windows Server 開(kāi)發(fā)者策略,尤其是專精于容器技術(shù),包括 Windows Server Containers。Brown 的職業(yè)生涯始于 Windows,最開(kāi)始負(fù)責(zé)研發(fā) Windows 2003 的 1394/Firewire 堆棧,在加入新組建的虛擬機(jī)團(tuán)隊(duì)之前,他致力于 Windows Server 2003 SP1 的 ACPI/電源管理。從那以后,他參與了 Microsoft 發(fā)布的每一項(xiàng) VM 技術(shù)(包括虛擬 PC、虛擬服務(wù)器和每一版 Hyper-V)的開(kāi)發(fā)工作,這讓他成為虛擬化技術(shù)領(lǐng)域的行業(yè)專家。可通過(guò)?taylorb@microsoft.com?與他聯(lián)系。
原文地址:https://msdn.microsoft.com/en-us/magazine/mt797649
.NET社區(qū)新聞,深度好文,微信中搜索dotNET跨平臺(tái)或掃描二維碼關(guān)注
總結(jié)
以上是生活随笔為你收集整理的Windows Server Containers 支持 Windows 开发者使用 Docker的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 第六期.Net开源社群联合分享--除了情
- 下一篇: 康威定律和系统设计——《微服务设计》读书