Windows上的原生Linux容器(盆盆的Kubecon課程分享)

Copy (2) of IMG_1562.jpg

您測試過Windows上的Linux容器嗎?


這是本週末剛閉幕的Kubecon大會,筆者在課堂上提出的問題。


關於這個問題,大家常有的困惑就是,我們爲什麼要在Windows上運行Linux容器?(以下是我的PPT截圖)

IMG_1564.jpg


答案有以下三點:

  • 節省資源 Windows服務器上能同時運行Windows容器和Linux容器,而不是Windows容器只能在Windows主機上運行,Linux容器只能在Linux主機上運行,造成資源浪費。

  • 隔離能力 Windows上的Linux容器採用了Hyper-V容器技術,底層是小型的看不見的虛擬機,所以借用了hypervisor的隔離能力

  • 商業引擎 Windows服務器的docker引擎,會是企業版的引擎,由微軟和docker提供支持


接下來讓我們看一下Windows是如何讓Windows容器和Linux容器水火共融的。這裏以一臺Windows 10機器爲例進行介紹,您也可以在Windows Server 2019上測試。


運行docker images,即可看到Windows 10上當前有Windows和Linux的容器鏡像。


甚至可以測試最新的Windows Server 2019 Docker鏡像。其鏡像的pull地址分別爲:

mcr.microsoft.com/windows/nanoserver:1809

mcr.microsoft.com/windows/servercore:1809

mcr.microsoft.com/windows:1809


隨便運行一下docker run -it microsoft/nanoserver,即可啓動一個Windows容器。


再運行docker run -it supertest2014/nyan,即可同時啓動一個Linux容器。


我們可以通過docker ps命令查看這兩個容器的信息。


前面說過,Linux容器採用了Hyper-V容器的技術,底層是被優化過的小型Linux虛擬機,採用的是docker的LinuxKit(內核和引導文件位於C:\Program Files\Linux Containers)。可見非常精簡。


以下是原理圖。其中綠色的部分就是傳統的Linux容器架構原理圖。


看看Windows上的Linux容器增加了哪些組件?首先是運行在Hypervisor之上,這樣隔離能力就和虛擬機一樣高,而不是採用共享內核的機制。其次由於dockerd、containerd等服務運行在主分區(Host Partition,就是宿主機),通過HCS(宿主計算服務)和LinuxKit虛擬機上的GCS(來賓計算服務)通信,這兩個組件是基於Hyper-V的VMBus高速內存總線!


怎麼查看Linux容器的詳細信息,通過Hyper-V管理器(GUI、PowerShell或者API)是看不到這臺微型虛擬機的任何信息的。


我們需要藉助hcsdiag這個命令,首先運行hcsdiag list命令,查看服務器上的Hyper-V容器信息。


可以看到其上運行了兩個容器,記住其中Linux容器的ID信息。再運行以下命令:

hcsdiag console -uvm ec1682e834415788943cd79fa56da656f5ffb689ea16a126c166eaba8812e54b


即可進入該微型虛擬機的命令行,運行ps aux,即可查看該虛擬機的進程信息,其中有/bin/sh -c nyancat,這就是Linux容器進程(加以命名空間保護),還有/bin/gcs,這就是GCS組件,還有hv_vmbus_con,這是虛擬機的硬件驅動。


這臺微型虛擬機不但內核精簡,本身的硬件配置也精簡,刪除了所有不支持Hyper-V enlightened的設備。


再運行mount,查看該虛擬機掛載的設備。可以看到底部有若干/dev/pmem的存儲設備,只讀模式(ro),這就是Linux容器的基礎鏡像(包含多個layer的base image),加載到內存裏。


還有一個/dev/sda這樣的塊設備,是可讀寫設備(rw),這是容器頂部的layer。當容器被殺死時,該layer自動刪除,也可以commit到鏡像倉庫,以實現快速代碼迭代。


用Process Explorer,可以查看微型虛擬機的vmwp進程,可以看到該進程的訪問句柄,下圖中紅色框裏的sandbox.vhdx,就是Linux容器的頂層可讀寫layer,而綠色框裏的多個layer.vhd文件,則是Linux容器的base image。這和上圖的命令行顯示是一一對應的。

Copy of IMG_1567.jpg

Copy of IMG_1568.jpg


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章