十個問題帶你瞭解 Windows Docker

彭愛華發表於2015-07-23

微軟在5月份Build大會上的官方說法,說是這個夏天會放出Windows Server Container的測試版。也就是說,目前我們還無法看到Windows Docker的測試版本,無法直接上手測試。接下來我就大家關心的十大問題進行介紹:

1. Windows Docker和Hyper-V有啥區別?

Hyper-V和VMware/Xen/KVM等類似,都是硬體虛擬化,安全但笨重。

Windows Docker是OS虛擬化技術,具備一定的隔離能力,效能更好、容易移植。

兩者不是互相取代的關係。

注意:Windows Docker並不是我們在Docker 1.6時見到的Windows Docker Client,也不是Boot2docker這個Windows下的linux虛擬機器,而是真正的Windows版本的Docker。其實其正式名稱並不叫Docker,而是叫做Windows Server Container,還有Hyper-V Container,有2個產品,其中Windows Server Container類似於linux Docker,而Hyper-V Container有些類似於clear linux或者Hyper Docker。

這是因為Docker是商標名稱,微軟不能直接拿來使用。

2. Windows Docker和Softgrid(APP-V)/Thinstall等有啥區別?

Docker是OS虛擬化,主要場景是服務端應用,這些容器(應用)之間通過標準的網路介面進行通訊,好像虛擬機器一樣。

Softgrid是應用程式虛擬化,主要用於客戶端應用部署。例如Office,這些應用在同一個會話裡執行,完全就是傳統的應用,彼此之 間可以進行程式間通訊,例如Word可以OLE呼叫Excel的表單等等。不同的程式,看到的檔案系統不會隔離。適用於批量部署客戶端應用。

3. 容器和沙盒是什麼關係?

曾經看到一句很棒的評語,必須分享給諸位:

Sandboxing is focused on just security with code isolation. Containers have some security code isolation, but this is not the only or primary purpose. One way to think about containers is as a layered/quarantined filesystem which makes it quick/easy/lightweight to run an application and also makes the application (in the container) very portable.

從下圖中我們可以看出,在Windows 10裡,IE的繼任者Edge瀏覽器就採用了沙盒技術。

同樣在保護模式下執行的Office文件,也執行在 沙盒裡。如下圖所示。

而容器,則還必須要在移動能力上有所考量,確保讓應用,也能變成按需遞交的動態服務。以前的硬體虛擬化,能將OS、App等變成文件,從而把伺服器資源變成按需遞交的服務,現在Windows Docker和linux一樣,也能變成image,變成文件,變成按需遞交的動態服務。

4. Windows Docker和其他OS虛擬化工具之間是什麼關係,例如很早就聽聞的VPS等?

從技術角度看,底層原理大同小異。看圖吧。

Docker和其他OS虛擬化技術一樣,技術實現大致差不多。關鍵看誰能帶動生態圈,能夠贏得其他廠商的支援。同時Docker的分層檔案 系統實現,也是其特別引人入勝的地方。這個截圖的下載地址在這裡

5. Windows Docker分層檔案系統?

先看看Linux的實現。DaoCloud的大牛孫巨集亮老師指出:假設我們下拉了Ubuntu:14.04映像,並通過命令docker run –it ubuntu:14.04 /bin/bash將其啟動執行。則Docker為其建立的rootfs以及容器可讀寫的檔案系統。參考這張截圖

從容器的視角來看,雖然只有一個邏輯的完整檔案系統,但該檔案系統由“2層”組成,分別為讀寫檔案系統和只讀檔案系統。孫老師的雄文連結在此

Windows Docker採用類似的分層檔案系統。參考下圖。

Windows Docker採用NTFS檔案系統的重解析點技術(reparse point),頂層的沙盒層(sandbox layer)是可讀寫的,只允許該容器自己佔用,而其他層 則是隻讀的。在這張圖中,底層的基礎OS層和中間的應用程式框架層都是隻讀的,而頂層的沙盒層則可讀寫,在 容器的視角看來,它獨佔了完整的檔案系統。

這有點類似於Hyper-V的差異磁碟鏈(頂部的子盤才能讀寫,其上方的所有父盤和Base盤都是隻讀的)。

Windows Docker的分層檔案系統,我是將其理解為類似符號連結(僅僅用來幫助理解,不要真的輕信),當頂層的沙盒層開啟檔案時, 相當於開啟一個符號連結,而嘗試修改時,則COW(Copy on write)。到底採用什麼底層檔案系統技術,如何實現多個容器併發訪問只 讀Layer檔案的效能,如何cache等,目前一概不知道。sorry!

6. Windows Docker的檔案系統隔離

前段時間的熱門話題,除了股票,就要算是某線上旅遊商的悲劇了,坊間甚至傳聞其為資料誤刪!!!

有客戶曾經問到:Docker能否避免這種悲劇?其實Docker和虛擬機器一樣,都替代不了容災和備份的機制。不過Docker確實有檔案系統隔離 的能力。我在Build大會裡看到,演示者在Windows Container裡執行刪除C盤根目錄下所有檔案和登錄檔鍵值,儘管這個容器被毀了 ,但是根本不會影響其他容器,更不會影響主機,這和linux Docker一樣。看圖片吧。

7. IPC隔離機制

在另一位孫老師,孫建波老師的文章裡我們看到,linux Docker採用了IPC隔離機制。而Windows Docker也採用類似的隔離機制。這個機制就是所謂的會話隔離。

那麼Windows裡,哪些技術會用到會話隔離呢,盆盆簡單總結一下:

  • 首先是終端服務,會話就是為了這個技術而發明的。
  • 快速使用者切換,這和終端服務實際上是一樣,只不過快速使用者切換隻會提供最新登入使用者的桌面(shell)。
  • 從Windows Vista開始,系統級程式和服務,執行在會話0裡,這就是為什麼我們無法再用"mstsc /console"命令來登入到伺服器的控制檯會話。
  • 從Windows 8開始,Metro Application(平板專用的應用),也採用會話隔離技術。

也就是說,會話是為了終端服務這種多使用者機制來準備的。

用Sysinternals Suite工具包裡的Winobj這個小工具,可以看到會話隔離的效果。

在圖中可以看到,不同會話裡擁有不同的物件名稱空間,例如不同容器,有自己獨立的視窗站(終端服務,其他場合只有當前登入用 戶才有Winsta視窗站),BaseNamedObjects目錄,包含事件、互斥訊號和記憶體段等物件。不同會話裡的應用,不能夠傳送視窗訊息(Window Message,以防止粉碎攻擊)。

Windows Docker沿用了會話隔離技術,不同容器在同一個Windows主機上訪問同一個命名物件,就不會導致衝突。

在Build大會的演示裡,啟動了2個容器,都是從同一個Windows Server Core映像裡建立出來。在其中一個容器裡執行tasklist命令, 顯示當前的程式資訊,包括會話。

在這個截圖中,我們可以看到該容器執行在會話14裡。

在另外一個容器裡同樣執行tasklist。可以看到該容器執行在會話15裡。

類似於兩個容器,分別通過遠端桌面訪問一樣,拿到不同的會話(session),從而獲得namespace隔離能力。

從兩個截圖裡能看到什麼?其中System和空閒程式是共享的,這說明Docker是共享宿主機的核心。當然程式號都一樣不代表什麼,因 為所有Windows裡,這兩個程式的PID都一樣!而每個容器都有自己的svchost程式、csrss程式和wininit程式等。這些程式都是 per-session的。

8. Windows Docker能顯示圖形化介面嗎?

傳統的Windows應用大多是有GUI的,所以這些應用可能需要通過圖形化方式進行遠端操控。Windows Docker會通過容器的RDP服務連 接上來。

圖中顯示通過RDP服務連線到Process Explorer這個帶GUI的系統程式管理工具。由於RDP實際上就是終端服務,所以Process Explorer這個圖形化程式相當於又執行在一個新的會話裡了!這個說起來有點拗口。

從這張圖裡我們可以看出,由於Process Explorer是在終端會話裡開啟的,所以我們可以在容器的工作管理員裡看到有兩個會話:

  • 會話14是Docker自己的會話,在這裡嘗試啟動Process Exploer,但是啥都看不到,這個是正常的,因為圖形化介面無法在Docker客戶端 裡顯示,Linux也採用類似VNC/RDP等辦法開專門的通道訪問。
  • 而會話15則是通過RDP訪問的會話

9. 建立Windows Docker

和linux Docker,Windows Docker(記住有兩個產品,Windows server container和hyper-v container)完全支援linux Docker的介面和工具集。就好比電視機和投影儀,其內部實現固然大相徑庭,然其和電腦的之間的介面則幾乎完全一致。

建立Windows 容器,和linux一樣,有Docker file,直接Docker build,生成Image。

Docker File的簡單範例:

From Windowsservercore
WORKDIR \
COPY bin\Debug\ \Deapp
CMD \DemoApp\Demoapp.exe

今後微軟的Windows azure雲,可以直接支援Docker,不管是Windows還是linux,都可以直接用最新的visual studio把程式碼簽到azure的linux或者Windows容器裡。當然也可以直接用azure的visual studio online服務。

10. Windows Docker不同版本,以及linux之間異同

首先分享靈雀雲老大左玥老師的PPT。

可以看到session和JO,是Windows Docker的隔離技術,同時JO技術類似於linux裡的CGroup。可以參考chrome的相關技術。chrome就是用到了不少Windows的隔離技術。

再看一張圖片。

從這裡可以看出Windows Docker不同版本和linux之間的異同點。其中Hyper-V Container的安全能力高於Windows Server Container。

Windows Server Container和Hyper-V Container之間的差異,可以參考這個圖片。最大的差別在於,hyper-v container支援多租戶安全能力,同時支援加域。而Windows server container則不能加域,這意味著如果這個應用需要加域的話,則無法用Windows Server Container。

Q& A

問: 從前部分看講解的來看,個人覺得Windows Server Docker主要用到的是Dandbox沙盒技術,對嗎?

答:應該說和Linux Docker一樣,既有沙盒技術,又有分層檔案系統。

問: Windows也有在容器裡面使用的Image了嗎?下載下來之後在liunx的Dockr裡面能用起來嗎?linux的Image在Windows Server Docker裡面能跑起來嗎?

答:Windows Docker和linux不相容。不能將linux image放在Windows裡執行。因為Docker是共享核心的,兩者實現完全不同。

問:支援GUI嗎?

答: 能支援GUI,就和Linux docker一樣。但是由於Docker Client本身不能支援GUI,所以需要用RDP Client連線。

問:Windows的Docker只是用Windows做基礎的,沒有像linux那樣去抹平不同發行版的差異?

答: 由於Docker實質是OS虛擬化技術,所以依賴於OS kernel,Windows和Linux互相不相容。目前的其中一個解決辦法是,從程式碼源頭解決,例如同一個程式碼,既可以簽入到Windows容器,也可以嵌入到linux容器上(跑Linux版本的.NET)。

問:Win PC上是不是不用再像目前安裝Docker那樣先安裝虛擬機器之類的?

答:不是,Windows Docker是原生的Windows版本的Docker機制,和linux Docker等價,不是採用Boot2Docker這樣的虛擬機器。

問:Windows Docker是已經有Windows的image嗎?

答:對,會有Windows sever image,例如我們熟悉的Windows server core,還會有今後的Windows nano server。

問:這些image是不是都不帶GUI?管理起來的話,微軟目前有自己的容器管理平臺了嗎?

答:可以有GUI,但是雲端的環境,傾向於弱化GUI,這就是微軟為什麼要推出完全沒有GUI的Windows Nano Server的原因,Nano Server,不但沒有GUI,連Console都沒有,需要通過PowerShell命令列等遠端管理。另外,Windows Docker支援傳統的Linux Docker介面。

問:Windows Docker有哪些比較典型的應用場景麼?

答:Windows Docker的典型場景,和Linux幾乎一樣,都是實現應用的動態服務化,打斷應用和底層硬體裝置之間的緊密耦合的紐帶。

問:Windows Docker有哪些比較典型的應用場景麼?

答:Windows Docker的典型場景,和Linux幾乎一樣,都是實現應用的動態服務化,打斷應用和底層硬體裝置之間的緊密耦合的紐帶。

相關文章