溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Windows與Docker有多少進(jìn)程

發(fā)布時間:2021-12-14 09:54:22 來源:億速云 閱讀:212 作者:iii 欄目:云計算

這篇文章主要介紹“Windows與Docker有多少進(jìn)程”,在日常操作中,相信很多人在Windows與Docker有多少進(jìn)程問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Windows與Docker有多少進(jìn)程”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

Linux和Windows,Docker里各有多少進(jìn)程

在安裝配置Container Host的時候,經(jīng)常報錯Container OS Image下載失敗(沒辦法,墻內(nèi)的緣故)。

什么是Container OS?顧名思義,是從容器角度看到的OS。

Container OS實際是應(yīng)用所依賴的用戶模式(User mode)OS組件,對于Windows容器來說,例如ntdll.dll、kernel32.dll或者coresystem.dll之類的System DLL。主機(jī)上的所有容器共享內(nèi)核模式(Kernel mode)OS組件,對于Windows,就是ntoskrnl.exe,還有驅(qū)動等。

例如對于以下命令,意味著Windows系統(tǒng)從docker映像中獲取Windows Server Core的用戶模式OS組件,并啟動cmd獲得Shell。

docker run -it windowsservercore cmd

Linux也是一理,如果運行以下命令,意味著從docker映像中獲取Ubuntu的用戶模式組件,并且啟動Bash Shell。

docker run -it ubuntu /bin/bash

對于以上兩個容器,Linux容器里的進(jìn)程比較少,可以參考以下截圖:

Windows與Docker有多少進(jìn)程

而Windows容器,則情況略有不同。

在Windows主機(jī)上啟動Process Explorer,可以看到這個Windows容器的進(jìn)程相對多一些:

Windows與Docker有多少進(jìn)程

這是因為在Windows系統(tǒng)中,需要給應(yīng)用提供一些用戶模式的系統(tǒng)服務(wù),例如DNS、DHCP、RPC等服務(wù),這樣從容器的角度來看,容器獲得了自己獨有的服務(wù)(一般是在各自的svchost或者其他服務(wù)宿主進(jìn)程里運行),構(gòu)成了所謂的Container OS。

我們可以用PowerShell命令查看容器內(nèi)部啟動的Windows服務(wù),大概有27個,參考附圖。

Windows與Docker有多少進(jìn)程

很可惜,這個版本的Windows docker里,雖然有遠(yuǎn)程桌面服務(wù),但是目前還不支持遠(yuǎn)程桌面到容器,所以無法使用容器應(yīng)用的圖形化界面。

容器里的應(yīng)用,到底應(yīng)該啟動多少Windows服務(wù)?由于Windows服務(wù)的具體作用是非文檔化的,所以不像Linux可以做到最精簡。但是由于這些服務(wù)幾乎不占用什么額外的資源,對于容器性能沒有影響。

Windows容器的進(jìn)程如何隔離

由于在最新的測試版本里,容器對象的權(quán)限設(shè)置有了改變,只有SYSTEM權(quán)限才能查看。所以要查看Windows容器的進(jìn)程隔離,需要用SYSTEM權(quán)限啟動Winobj。這可以借助Psexec來實現(xiàn):

Psexec -i -d -s winobj.exe

Windows與Docker有多少進(jìn)程

可以看到Windows對象空間里多了一個Containers的節(jié)點,其下有若干個GUID分支,這些GUID代表系統(tǒng)里的容器。其下每個容器有自己獨立的BaseNamedObjects等命名空間,包括互斥信號量、內(nèi)存Section、事件等。
可以用PowerShell查看容器的GUID,參考附圖。

Windows與Docker有多少進(jìn)程

每個容器節(jié)點下,有自己的Session分支,例如該容器,占據(jù)了Windows系統(tǒng)的Session 2。如附圖所示。

Windows與Docker有多少進(jìn)程

這就是為什么,不管用任務(wù)管理器,還是PowerShell,抑或是Process Explorer等工具,我們都在Windows主機(jī)里看到容器里的所有進(jìn)程都會標(biāo)記Session為2。
借助Process Explorer,我們可以看到容器里的進(jìn)程,所打開的Handle,其中就指向先前所看到的Windows容器對象命名空間。

Windows與Docker有多少進(jìn)程

同時還能看到,容器進(jìn)程所在的WindowStation并不是WinSta0,而是Service-0x0-3e7$,3e7的10進(jìn)制等于999,等于九五之尊,這是SYSTEM服務(wù)所在的窗口站。所以容器進(jìn)程無法在Windows桌面上擁有圖形化界面。

Windows與Docker有多少進(jìn)程

還可以查看一個有意義的對象,Windows容器所掛載的主機(jī)目錄,類似于Linux容器的Volume。

Windows與Docker有多少進(jìn)程

Windows容器的文件系統(tǒng)如何隔離

和Linux一樣,Windows容器映像采用分層的文件系統(tǒng),基于映像創(chuàng)建容器后,相當(dāng)于在只讀的分層文件系統(tǒng)上再覆蓋一層可讀寫的文件系統(tǒng)層。如果要修改的文件在最上層的可讀寫層里沒有,則沿著分層的Layer找到目標(biāo)文件后,將其用COW(Copy on write:寫時復(fù)制)復(fù)制到可讀寫層再修改。

Windows與Docker有多少進(jìn)程

讓我們進(jìn)入到Windows主機(jī)的以下目錄:
C:\ProgramData\Microsoft\Windows\Hyper-V\Containers
該目錄下列出所有通過PowerShell命令創(chuàng)建的容器文件。其下有文件夾和文件,都以容器的GUID來命名。

Windows與Docker有多少進(jìn)程

其中的926A300B-ACB7-4B28-9D86-45BF82C1211C.vhdx就是該容器的最上層的可讀寫層,是一個VHDX文件。
記住該可讀寫層并不是一個完整的文件系統(tǒng),它需要和Image的現(xiàn)有文件系統(tǒng)組成Union File System。如果嘗試雙擊該VHDX(只能嘗試掛載停止?fàn)顟B(tài)的容器VHDX),試圖掛載到Windows系統(tǒng),會彈出以下報錯信息,提示該虛擬硬盤無法掛載。

Windows與Docker有多少進(jìn)程

Image的文件系統(tǒng)位于以下路徑(Windows Server Core的Container OS文件):
C:\ProgramData\Microsoft\Windows\Images\CN=Microsoft_WindowsServerCore_10.0.10586.0\Files
如果用Process Explorer查看容器進(jìn)程訪問的Dll,可以看到其訪問的路徑為Container OS文件。

Windows與Docker有多少進(jìn)程

如果是用docker命令創(chuàng)建的進(jìn)程,道理類似,但是其可讀寫層文件系統(tǒng)位于以下路徑:
C:\ProgramData\docker\windowsfilter

Windows與Docker有多少進(jìn)程

Windows容器還有注冊表

和Linux不一樣,Windows容器還需要考慮注冊表的隔離問題。和文件系統(tǒng)命名空間隔離一樣,注冊表命名空間隔離也采用類似Union FS形式。
下面讓我們進(jìn)入PowerShell命令創(chuàng)建的Windows容器文件夾內(nèi)部。
C:\ProgramData\Microsoft\Windows\Hyper-V\Containers\926A300B-ACB7-4B28-9D86-45B

Windows與Docker有多少進(jìn)程

在這個Hives文件夾下方,有很多命名為*_Delta的文件,這是容器所訪問的注冊表配置單元文件。

Windows與Docker有多少進(jìn)程

從命名方式中可以看到,容器的注冊表和文件系統(tǒng)一樣,也采用分層架構(gòu),最上層的是可讀寫的注冊表命名空間。而Image映像也有只讀部分的注冊表空間,路徑如下。
C:\ProgramData\Microsoft\Windows\Images\CN=Microsoft_WindowsServerCore_10.0.10586.0\Hives
在Process Explorer里可以看到可讀寫層、只讀層注冊表合并后所加載的內(nèi)容。

Windows與Docker有多少進(jìn)程

Docker命令所創(chuàng)建的容器,方法類似,位于類似以下路徑:

Windows與Docker有多少進(jìn)程

Windows容器的資源限制

大家知道,Docker可以調(diào)用CGroup技術(shù)來限制Linux容器的CPU、內(nèi)存等資源占用。而在Windows容器里,內(nèi)存資源的限制,則是通過Windows的JO(作業(yè)對象)技術(shù)來實現(xiàn)。
可以參考以下技術(shù)來限定Windows容器的CPU、內(nèi)存和磁盤IO。例如可以將容器的內(nèi)存限定為最大占用為5GB。
https://msdn.microsoft.com/en-us/virtualization/windowscontainers/management/manage_resources?f=255&MSPPError=-2147217396
然后用Process Explorer打開任意一個容器進(jìn)程的屬性對話框,切換到Job標(biāo)簽頁。

Windows與Docker有多少進(jìn)程

可以看到所有容器進(jìn)程共享一個作業(yè)對象,而且該作業(yè)對象的內(nèi)存限額(Job Memory Limit)為5GB。

到此,關(guān)于“Windows與Docker有多少進(jìn)程”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI