1. 程式人生 > >微軟釋出Windows Server 2016的最新預覽版,Docker首次亮相

微軟釋出Windows Server 2016的最新預覽版,Docker首次亮相

Windows Server上首次出現Docker的身影

本週早些時候,負責微軟Azure業務的CTO Mark Russinovich在Azure部落格上發表了一篇文章 “Docker、Windows and Trends”。在文章中,Mark簡要地回顧了容器技術的概念以及容器與虛擬機器相比的巨大優勢、Docker的發展、新版本Windows Server對容器的支援、如何使用編排工具,以及Azure Service Fabric服務對微服務架構的支援等等。

這篇文章剛一發布,就有讀者

猜測它很可能是為即將釋出的Windows Server 2016的第3個技術預覽版進行“預熱”。果不其然,僅僅兩天之後,“紅衣教主”Scott Gu就 宣佈Windows Server 2016最新版本的釋出,新版本中不出意料地加入了對Docker技術的支援,即Windows Server Containers的第1個預覽版本。

微軟近年來與Docker的密切合作可謂有目共睹,坊間還一度流出 微軟將收購Docker的傳聞。在去年六月的首屆DockerCon大會上,微軟就展示瞭如何在Azure中建立與維護Docker的體驗。但直至目前為止,Azure上的Docker主機僅能夠執行在Linux虛擬機器上。在Azure上執行Linux,額……聽起來總是有點古怪。不過就在去年十一月,微軟宣佈了在Windows Server上實現容器技術的計劃,承諾為Windows開發者帶來與Linux平臺上相同的Docker應用體驗。如今,隨著Windows Server 2016新版本的釋出,Windows開發者終於也能夠體會到Docker這一利器對於開發以及部署所帶來的巨大好處了。

作為對微軟釋出Windows Server Containers的響應,Docker也在其技術 部落格中表示將在Docker Engine中提供對Windows平臺的支援,並推出了一個針對Windows的Docker Engine的預覽版。而早在今年四月,Docker就推出了一個Windows版本的Docker客戶端工具。對於已經熟悉在Linux平臺上使用Docker的開發者與運維人員來說,可以將他們的經驗無縫地帶到Windows平臺上。

三種部署方式

隨著新版本Windows Server 2016的釋出,微軟也很快地為Visual Studio推出了一項支援Docker部署的

工具,其實在今年的DockerCon大會上,Mark就在第2天的主題演講中為聽眾演示瞭如何使用Visual Studio進行部署的體驗。熟悉Visual Studio的開發者應該可以很快地上手,通過它可以自動在Azure平臺上建立與配置容器主機,隨後建立一個包含應用程式的容器映象,併發布到容器主機中。所有這一切操作都可以直接在IDE中完成,不過這一工具目前只支援最新的Visual Studio 2015版本。

此外,開發者也可以選擇直接在Azure Marketplace中部署一臺已預先配置了容器特性,並且安裝了Docker Engine的Windows Server 2016虛擬機器,可以參考一下這個 快速教程與視訊。當容器主機啟動之後,就可以按照教程中介紹的步驟,通過Docker及PowerShell建立和管理容器。

除了在Azure中部署容器之外,開發者也能夠在本機以通過 Hyper-V建立虛擬機器的方式作為容器的主機,為了簡化配置過程,微軟在GitHub上提交了一些 PowerShell指令碼,使配置過程儘量實現自動化。

兩種型別的容器

在Windows Server 2016中,微軟預計將提供兩種型別的容器,即此次釋出的Windows Server Containers及即將在不久之後的預覽版本中出現的Hyper-V Containers。這兩種型別的視窗可以使用相同的Docker API與客戶端進行部署,並且Windows容器包可以執行在任何一種容器中,因為它們所使用的Windows核心功能是相同的。而由於Linux容器的實現依賴於主機核心的Linux API功能,因此無法在Windows Server主機上執行Linux容器,反之亦然。但可以通過使用相同的Docker客戶端管理這些不同平臺的容器。

那麼這兩種容器的差別何在呢?Windows Server Containers會在主機與多個容器之間共享作業系統,由於它們共享了大量的資料與API,應用程式就有可能在有意或無意之間脫離執行中容器的束縛,或是造成主機與其它容器的拒絕服務。因此這種型別的容器比較適用於執行可信應用程式的場景,這種信任包括作業系統與應用程式,以及多個應用程式之間。也就是說,主機作業系統與應用程式處於同一個可信邊界之內。如果所部署的應用屬於多容器應用、或是組成一個大型應用的一部分、以及來自同一個組合的應用,那麼就可以選擇這種容器。

與之相對的是,在某些情況下,你希望在同一臺主機中為所執行的應用程式設定不同的可信邊界。假設你的應用是一種為多個客戶服務的SaaS應用(例如Salesforce),並允許每個客戶通過編寫自己的程式碼擴充套件應用的功能,這種情況下,你肯定不願意讓某個客戶的自定義程式碼影響到其他的使用者,或是獲取其他使用者的資料。這樣一來,就需要用到Hyper-V Containers,它的做法與傳統的容器化略有不同,每個容器都將獲得Windows核心的一份拷貝,並且將直接為其分配記憶體,對CPU、記憶體與IO等資源進行隔離。這種容器能夠實現高級別的隔離性,其代價是啟動時間將稍稍延長,並且佔用資源較高。

Docker如何移植至Windows Server

來自Docker的高階工程經理Arnaud Porterie也在一篇 文章中提到了Docker對Windows Server的支援。他特別指出,這個版本的Windows Server的Docker還沒有完成全部特性,但多數Docker命令都可以在Windows Server上使用了,例如Dockerfile與docker build命令。

Docker在Linux上的實現充分地利用了Linux中的一些核心特性,例如名稱空間的隔離與cgroups。微軟也以類似的方式為Windows核心加入了一些容器化的基本結構,允許使用者程式碼在一個沙盒環境中執行程序。這一功能只限於最新發布的Windows Server 2016。

在Docker的程式碼中,用於容器執行部分的功能稱為execdriver,它在Linux上的預設實現利用了 libcontainer,並且很快將依賴於 runC的實現。對於Windows容器來說,微軟在其架構中集成了一個特定於Windows系統的execdriver的實現,它將通過 microsoft/hccshim這個包對Host Compute Service中的核心程式碼發起呼叫。