Windows上的原生Linux容器(盆盆的Kubecon课程分享)
您測(cè)試過(guò)Windows上的Linux容器嗎?
這是本周末剛閉幕的Kubecon大會(huì),筆者在課堂上提出的問(wèn)題。
關(guān)于這個(gè)問(wèn)題,大家常有的困惑就是,我們?yōu)槭裁匆赪indows上運(yùn)行Linux容器?您可以到以下地址下載PPT:
PPT下載地址
歡迎關(guān)注我的公眾號(hào):
答案有以下三點(diǎn):
節(jié)省資源?Windows服務(wù)器上能同時(shí)運(yùn)行Windows容器和Linux容器,而不是Windows容器只能在Windows主機(jī)上運(yùn)行,Linux容器只能在Linux主機(jī)上運(yùn)行,造成資源浪費(fèi)。
隔離能力?Windows上的Linux容器采用了Hyper-V容器技術(shù),底層是小型的看不見的虛擬機(jī),所以借用了hypervisor的隔離能力
商業(yè)引擎?Windows服務(wù)器的docker引擎,會(huì)是企業(yè)版的引擎,由微軟和docker提供支持
接下來(lái)讓我們看一下Windows是如何讓W(xué)indows容器和Linux容器水火共融的。這里以一臺(tái)Windows 10機(jī)器為例進(jìn)行介紹,您也可以在Windows Server 2019上測(cè)試。
運(yùn)行docker images,即可看到Windows 10上當(dāng)前有Windows和Linux的容器鏡像。
甚至可以測(cè)試最新的Windows Server 2019 Docker鏡像。其鏡像的pull地址分別為:
mcr.microsoft.com/windows/nanoserver:1809
mcr.microsoft.com/windows/servercore:1809
mcr.microsoft.com/windows:1809
隨便運(yùn)行一下docker run -it?microsoft/nanoserver,即可啟動(dòng)一個(gè)Windows容器。
再運(yùn)行docker run -it?supertest2014/nyan,即可同時(shí)啟動(dòng)一個(gè)Linux容器。
我們可以通過(guò)docker ps命令查看這兩個(gè)容器的信息。
前面說(shuō)過(guò),Linux容器采用了Hyper-V容器的技術(shù),底層是被優(yōu)化過(guò)的小型Linux虛擬機(jī),采用的是docker的LinuxKit(內(nèi)核和引導(dǎo)文件位于C:\Program Files\Linux Containers)。可見非常精簡(jiǎn)。
以下是原理圖。其中綠色的部分就是傳統(tǒng)的Linux容器架構(gòu)原理圖。
看看Windows上的Linux容器增加了哪些組件?首先是運(yùn)行在Hypervisor之上,這樣隔離能力就和虛擬機(jī)一樣高,而不是采用共享內(nèi)核的機(jī)制。其次由于dockerd、containerd等服務(wù)運(yùn)行在主分區(qū)(Host Partition,就是宿主機(jī)),通過(guò)HCS(宿主計(jì)算服務(wù))和LinuxKit虛擬機(jī)上的GCS(來(lái)賓計(jì)算服務(wù))通信,這兩個(gè)組件是基于Hyper-V的VMBus高速內(nèi)存總線!
怎么查看Linux容器的詳細(xì)信息,通過(guò)Hyper-V管理器(GUI、PowerShell或者API)是看不到這臺(tái)微型虛擬機(jī)的任何信息的。
我們需要借助hcsdiag這個(gè)命令,首先運(yùn)行hcsdiag list命令,查看服務(wù)器上的Hyper-V容器信息。
可以看到其上運(yùn)行了兩個(gè)容器,記住其中Linux容器的ID信息。再運(yùn)行以下命令:
hcsdiag console -uvm ec1682e834415788943cd79fa56da656f5ffb689ea16a126c166eaba8812e54b
即可進(jìn)入該微型虛擬機(jī)的命令行,運(yùn)行ps aux,即可查看該虛擬機(jī)的進(jìn)程信息,其中有/bin/sh -c nyancat,這就是Linux容器進(jìn)程(加以命名空間保護(hù)),還有/bin/gcs,這就是GCS組件,還有hv_vmbus_con,這是虛擬機(jī)的硬件驅(qū)動(dòng)。
這臺(tái)微型虛擬機(jī)不但內(nèi)核精簡(jiǎn),本身的硬件配置也精簡(jiǎn),刪除了所有不支持Hyper-V enlightened的設(shè)備。
再運(yùn)行mount,查看該虛擬機(jī)掛載的設(shè)備。可以看到底部有若干/dev/pmem的存儲(chǔ)設(shè)備,只讀模式(ro),這就是Linux容器的基礎(chǔ)鏡像(包含多個(gè)layer的base image),加載到內(nèi)存里。
還有一個(gè)/dev/sda這樣的塊設(shè)備,是可讀寫設(shè)備(rw),這是容器頂部的layer。當(dāng)容器被殺死時(shí),該layer自動(dòng)刪除,也可以commit到鏡像倉(cāng)庫(kù),以實(shí)現(xiàn)快速代碼迭代。
用Process Explorer,可以查看微型虛擬機(jī)的vmwp進(jìn)程,可以看到該進(jìn)程的訪問(wèn)句柄,下圖中紅色框里的sandbox.vhdx,就是Linux容器的頂層可讀寫layer,而綠色框里的多個(gè)layer.vhd文件,則是Linux容器的base image。這和上圖的命令行顯示是一一對(duì)應(yīng)的。
總結(jié)
以上是生活随笔為你收集整理的Windows上的原生Linux容器(盆盆的Kubecon课程分享)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java8新特性: lambda表达式:
- 下一篇: 线程安全: 互斥锁和自旋锁(10种)