水火交融-Windows上的Linux容器

原本因爲容器是共享操做系統內核的,因此在Windows系統上是不能運行Linux容器的,反之亦然。如今主流的docker編排工具基本上都能支持Windows和Linux混合部署。例如Kubernetes,下圖所示Kubernetes羣集就有Windows節點。
docker


若是是在Windows環境裏運行Windows容器,則能夠看到若干運行在同一個會話裏的進程,這些就是共享同一個容器的進程。下圖所示的進程都運行在會話25。json


Windows的容器聯合掛載文件系統,相似Linux容器的AUFS等,採用分層的鏡像層(Image Layer),最頂層的Layer可讀可寫,叫作sandbox layer,是一個sandbox.vhdx文件。多層的Base Image和sandbox.vhdx,在容器內部看來,是一個統一的、聯合的文件系統ubuntu


而在Windows裏運行Linux容器,則採用Hyper-V容器的功能,這樣每一個容器都有本身的獨立內核(採用docker的LinuxKit),Hyper-V容器的安全性會更高,由於這是Hypervisor級別的隔離。緩存


要在Windows 10裏啓用這個,最簡單的方法(請確保更新到Build 17205或者之後版本),就是到如下地址下載安裝最新的docker for Windows(請到網上搜索,並選擇下載edge分支)。安全

https://download.docker.com/win/edge/Docker%20for%20Windows%20Installer.exeide


而後確保選擇Enabe Linux container on Windows。根據屏幕提示完成必須的步驟便可。工具


當運行如下命令時,便可在Windows 10裏建立Linux容器:ui

docker run -it ubuntu
spa


前面說過,這裏的Linux容器是Hyper-V容器,其實質是啓動了一個最小化的Linux虛擬機,其內核和引導文件位於C:\Program Files\Linux Containers,其下有兩個文件,bootx64.efi和initrd。操作系統


而後到本地的鏡像緩存裏嘗試獲取ubuntu鏡像(沒有的話就到docker hub裏pull下來),而且自動建立Linux容器,就Windows容器同樣,其頂層的可讀可寫鏡像層也叫作sandbox.vhdx。


若是在Bash命令行提示符下輸入cat /etc/issue,便可看到Linux容器的OS版本號爲Ubuntu 16.04.3 LTS。


若是用Process Explorer查看,這個Hyper-V容器在宿主機上的進程是vmwp.exe,這就是Hyper-V虛擬機的進程。容器裏的進程都運行在這個最小化的Hyper-V虛擬機裏,在宿主機上,咱們看不到這個Ubuntu容器裏的進程。


查看該vmwp進程的打開句柄,能夠看到相似如下的複雜路徑,以下圖所示:

\device\STORVSP\GUID\{guid}\C:\programdata\Docker\lcow\lcow\aaa5f623879acf5818bffbeca7d88b62d4f262e957d2c4de99591c3b04144df1\sandbox.vhdx"



其中的sandbox.vhdx(底部的紅色方框),就是Ubuntu容器的頂層可讀可寫的鏡像層,全部修改的內容都會保存在這個層裏(經過commit便可固化下來),以實現代碼的快速迭代。從圖中能夠看出,該sandbox.vhdx是經過Hyper-V虛擬機的VMBus上的SMB共享來訪問的!


而綠色方框的部分,就是Ubuntu鏡像的多個Base Image層,這些Base Image由不一樣的layer.vhd文件組成。這些Base Image和頂層的sandbox.vhdx,會經過聯合掛載文件系統,在容器內部表現爲單一的完整文件系統。


若是進入sandbox.vhdx的父目錄,也就是如下

C:\programdata\Docker\lcow\lcow\aaa5f623879acf5818bffbeca7d88b62d4f262e957d2c4de99591c3b04144df1\


其中的aaa5f623879acf5818bffbeca7d88b62d4f262e957d2c4de99591c3b04144df1就是該ubuntu容器的容器ID。


該父目錄下有個layerchain.json文件,內容以下:

["C:\\ProgramData\\Docker\\lcow\\lcow\\64852ed176c71c1c978edeca7c3a2d36dd3469fd885562757fbb8d415f091aa2","C:\\ProgramData\\Docker\\lcow\\lcow\\0ad7e65e29f70df2d5061c134fdc705df4ac5a8f53707d0b5982994b5e5da234","C:\\ProgramData\\Docker\\lcow\\lcow\\346fdaa754a283a20b177d0e80f5a57e876cd5ab300cdc30ba46e65d98985313","C:\\ProgramData\\Docker\\lcow\\lcow\\edacd457ab8cae69dc2b6afb30a71be6aabc4d68ea5d6c25abcea4b4487db19f","C:\\ProgramData\\Docker\\lcow\\lcow\\46851d43fee26a5d13ab3fa5262b3a2600ff71677ce3f14645e09b4f72cc4b6a"]


該layerchain.json文件顯示的就是sandbox.vhdx文件所依賴的容器Base Image的路徑,一共有5個文件,正好和前面截圖的綠色方框的5個文件相匹配。


而這就是Windows的威力,從此能夠設想一下,底層的容器羣集能夠都是Windows Server 2016系統,既能夠運行Windows容器,又是Linux容器,並且還支持docker的商業版,從操做系統到docker,都有商業化保障!


沒有參加大會的朋友,不用擔憂,盆盆已經把原版的PPT以及相關的演示視頻上傳到網上,您能夠點擊下方的閱讀原文,就能下載。

相關文章
相關標籤/搜索