您測試過Windows上的Linux容器嗎?
docker
這是本週末剛閉幕的Kubecon大會,筆者在課堂上提出的問題。
windows
關於這個問題,你們常有的困惑就是,咱們爲何要在Windows上運行Linux容器?您能夠到如下地址下載PPT:服務器
PPT下載地址架構
歡迎關注個人公衆號:app
答案有如下三點:ide
節省資源 Windows服務器上能同時運行Windows容器和Linux容器,而不是Windows容器只能在Windows主機上運行,Linux容器只能在Linux主機上運行,形成資源浪費。測試
隔離能力 Windows上的Linux容器採用了Hyper-V容器技術,底層是小型的看不見的虛擬機,因此借用了hypervisor的隔離能力優化
商業引擎 Windows服務器的docker引擎,會是企業版的引擎,由微軟和docker提供支持spa
接下來讓咱們看一下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。這和上圖的命令行顯示是一一對應的。