自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

【博文推薦】Windows Docker第一時(shí)間揭秘!

云計(jì)算
這是盆盆談微軟兩會(huì)(Build/Iginte)系列之一。文章引用孫建波老師關(guān)于Linux內(nèi)核的6大命名空間隔離,看Windows Docker如何實(shí)現(xiàn)類似隔離,同時(shí)又有哪些不同。文章素材取自Build和Ignite大會(huì)視頻,但主要展示盆盆自己的分析和研究,還望大家指正為謝。

【編者的話】這是盆盆談微軟兩會(huì)(Build/Iginte)系列之一。文章引用孫建波老師關(guān)于Linux內(nèi)核的6大命名空間隔離,看Windows Docker如何實(shí)現(xiàn)類似隔離,同時(shí)又有哪些不同。文章素材取自Build和Ignite大會(huì)視頻,但主要展示盆盆自己的分析和研究,還望大家指正為謝。

  本博文出自51CTO博客華來四盆盆博主,有任何問題請(qǐng)進(jìn)入博主頁面互動(dòng)討論!
博文地址:http://markwin.blog.51cto.com/148406/1649973

今天在微信群里聽一位兄弟提到,Docker能將DevOps(意即"開發(fā)"和"運(yùn)維")整合在一起,暗合王陽明先生的“知行合一”之教,這真是一種有趣的說法。

話說從頭,盆盆在《Windows Dcoker深入原理分析》里曾經(jīng)提到Build大會(huì)后,您可以在華來四公眾號(hào)里回復(fù)docker8,閱讀這篇文章(可以在微信里搜索并關(guān)注公眾號(hào):sysinternal),會(huì)第一時(shí)間給大家介紹Windows Docker技術(shù)。

還沒看過Build在線視頻的朋友,您可以泡杯咖啡,帶上耳機(jī),靜靜地欣賞以下由Taylor Brown主講的Windows Docker講座,我們的文章就以此為藍(lán)本。這里需要注意的是,以下的論述,大多是盆盆根據(jù)Taylor的demo效果所做的推論,并不是Taylor本人的陳述,所以并不一定正確。如有問題,還望大家多

多指點(diǎn)哈。

http://channel9.msdn.com/Events/Build/2015/2-704

容器即隔離

拿大家熟悉的Linux Docker來看,其涉及到Linux內(nèi)核所提供的Namespace隔離技術(shù)和資源控制的CGroup技術(shù)。

這里推薦大家閱讀浙大SEL研究生孫建波老師的文章《Docker背后的內(nèi)核知識(shí)——Namespace資源隔離》:

http://www.infoq.com/cn/articles/docker-kernel-knowledge-namespace-resource-isolation?from=timeline&isappinstalled=0

孫建波老師提到了一張表格,其中列出了Linux內(nèi)核所支持的6種隔離:曰主機(jī)名、曰IPC、曰進(jìn)程ID、曰網(wǎng)絡(luò)、曰文件系統(tǒng)、曰賬號(hào)。

 

Windows Docker第一時(shí)間揭秘

盡管Windows內(nèi)核實(shí)現(xiàn)和Linux不同,但是兩者還是有不少可比擬處。所以盆盆根據(jù)Build大會(huì)上Mark Russinovich這位大神以及Taylor Brown的講座,來?xiàng)l分縷析。

文件系統(tǒng)隔離

先來看看浙大SEL另一位大牛孫宏亮老師的文章《Docker源碼分析(九):Docker鏡像 》。這篇文章清晰地描述了Linux Docker的文件系統(tǒng)隔離,多層的可疊加文件系統(tǒng)。

http://blog.daocloud.io/docker-source-code-analysis-part9/

孫宏亮老師指出:假設(shè)我們下拉了Ubuntu:14.04映像,并通過命令docker run –it ubuntu:14.04 /bin/bash將其啟動(dòng)運(yùn)行。則Docker為其創(chuàng)建的rootfs以及容器可讀寫的文件系統(tǒng)參見下圖。從容器的視角來看,雖然只有一個(gè)邏輯的完整文件系統(tǒng),但該文件系統(tǒng)由“2層”組成,分別為讀寫文件系統(tǒng)和只讀文件系統(tǒng)(按只讀層還可以再邏輯分層,所以極大地節(jié)省磁盤空間)。

 

Windows Docker第一時(shí)間揭秘

Windows Docker同樣如此,頂層的沙盒層(sandbox layer)是可讀寫的,只允許該容器自己占用,而其他層則是只讀的,可供不同容器共享。在下圖中,底層的基礎(chǔ)OS層和中間的應(yīng)用程序框架層都是只讀的,而頂層的沙盒層則可讀寫,在容器的視角看來,它獨(dú)占了完整的OS。這有點(diǎn)類似于Hyper-V的差異磁盤鏈(頂部的子盤才能讀寫,其上方的所有父盤和 Base盤都是只讀的)。

 

Windows Docker第一時(shí)間揭秘

為了說明文件系統(tǒng)隔離的魔力,Taylor得意地在Windows Container里執(zhí)行刪除C盤根目錄下所有文件和注冊(cè)表鍵值,盡管這個(gè)容器被毀了,但是根本不會(huì)影響其他容器,更不會(huì)影響主機(jī)。

 

Windows Docker第一時(shí)間揭秘

盆盆猜測,在容器的視角里,如果只是讀取一個(gè)文件,該文件在最頂端的沙盒層里只有重解析點(diǎn)(reparse point);只有在修改該文件時(shí),才會(huì)用copy-on-writer的方法從下方的只讀層中把文件內(nèi)容復(fù)制到可讀寫的沙盒層。

#p#

創(chuàng)建Windows Container

視頻里演示了一個(gè)很棒的demo。有一段簡單的代碼,在console里顯示“This is a pretty cool app”。

 

Windows Docker第一時(shí)間揭秘

這是用來構(gòu)建Windows Docker映像的Dockerfile。這個(gè)文件由以下4行命令組成:

第1行:表明該映像基于windowsservercore這個(gè)Base映像,可以將其理解為rootfs

第2行:表示工作目錄是C盤根目錄

第3行:將應(yīng)用目錄復(fù)制到容器映像里

 

第4行:啟動(dòng)該應(yīng)用程序

Windows Docker第一時(shí)間揭秘

很快用docker build命令將其構(gòu)建為容器映像,Tag是1。從命令結(jié)果中可以看到Dockerfile里的每個(gè)命令都被執(zhí)行,在執(zhí)行第4個(gè)命令時(shí),會(huì)生成一個(gè)臨時(shí)的容器。

Windows Docker第一時(shí)間揭秘

 

Docker映像構(gòu)建完成后,只需運(yùn)行docker run命令即可快速啟動(dòng)該映像,并成功顯示"This is a pretty cool app..."。

 

Windows Docker第一時(shí)間揭秘

通過使用docker history命令,我們可以查看容器映像的構(gòu)建歷史,這甚至可以用來逆向生成Dockerfile。例如視頻里演示了sysinternals這個(gè)映像的構(gòu)建歷史。從中我們可以看到:首先記錄維護(hù)人員是誰;然后指定工作目錄是C盤根目錄;再者是將sysinternals suite這個(gè)工具軟件目錄拷貝到容器映像里;然后設(shè)定容器的運(yùn)行賬戶;最后設(shè)置啟動(dòng)Ipconfig以便顯示容器的IP地址。

 

Windows Docker第一時(shí)間揭秘

#p#

IPC隔離

和Linux Docker Container一樣,Windows Server Container也采用IPC隔離機(jī)制。這實(shí)際上是利用Windows自己的session隔離機(jī)制。

會(huì)話(session)隔離機(jī)制,最初是用在Windows終端服務(wù)和快速用戶切換中。但是從Windows Vista開始,Windows也采用這種技術(shù)對(duì)系統(tǒng)會(huì)話進(jìn)行隔離,Windows系統(tǒng)的服務(wù)和進(jìn)程會(huì)占用原來的控制臺(tái)會(huì)話(會(huì)話0),而后續(xù)的用戶會(huì)依次使用會(huì)話1、會(huì)話2等等。

從《Windows Internals》里我們可以學(xué)習(xí)到,不同會(huì)話里的應(yīng)用,不能夠發(fā)送窗口消息(Window Message,以防止粉碎攻擊)。不同會(huì)話里擁有不同的對(duì)象命名空間,例如不同容器,有自己獨(dú)立的BaseNamedObjects目錄,包含事件、互斥信號(hào)和內(nèi)存段等對(duì)象。這樣不同容器在同一個(gè)Windows主機(jī)上訪問同一個(gè)命名對(duì)象,就不會(huì)導(dǎo)致沖突。以下的WinObj截圖雖然不是取自 Windows Docker系統(tǒng),但是道理是一樣的。

 

Windows Docker第一時(shí)間揭秘

有興趣的朋友可以參考盆盆在9年前發(fā)表在ITECN博客上的文章,介紹會(huì)話隔離技術(shù):

http://blogs.itecn.net/blogs/winvista/archive/2006/06/09/SrvSession0.aspx

視頻里演示了Docker容器的會(huì)話隔離能力,Taylor啟動(dòng)了兩個(gè)容器,都是從同一個(gè)windowsservercore映像里創(chuàng)建出來。其中一個(gè)容器,可以運(yùn)行Tasklist命令,看到該容器運(yùn)行在會(huì)話14中。而且還能看到兩個(gè)系統(tǒng)進(jìn)程,一個(gè)是System進(jìn)程,代表操作系統(tǒng)本身,另一個(gè)是空閑進(jìn)程,這兩個(gè)進(jìn)程都運(yùn)行在會(huì)話0里。

 

Windows Docker第一時(shí)間揭秘

在同一個(gè)映像所創(chuàng)建的另一個(gè)容器里,我們可以看到該容器運(yùn)行在會(huì)話15中,同樣可以看到System和空閑進(jìn)程。

Windows Docker第一時(shí)間揭秘

Taylor的解釋是由于容器是共享 Windows Kernel的,所以容易可以看到System進(jìn)程的PID是一樣的,都是4。其實(shí)在所有Windows主機(jī)上,System進(jìn)程的PID都是4。

 

網(wǎng)絡(luò)隔離+圖形化訪問

和Linux容器一樣,Windows容器也可以有自己的獨(dú)立網(wǎng)絡(luò)配置。

 

Windows Docker第一時(shí)間揭秘

 

由于傳統(tǒng)的Windows應(yīng)用大多是有GUI的,所以這些應(yīng)用可能需要通過圖形化方式進(jìn)行遠(yuǎn)程操控。

視頻里Taylor舉了一個(gè)sysinternals容器的例子。有趣的是,這個(gè)demo本來是Mark Russsinovich的保留曲目,可惜Keynote的時(shí)間十分寶貴,最Mark沒能有足夠的時(shí)間去演示。

Taylor演示啟動(dòng)Sysinternals Suite里的經(jīng)典工具Process Explorer,由于該工具帶GUI,所以雖然進(jìn)程已經(jīng)在容器里啟動(dòng),但是在Docker Client里無法直接遠(yuǎn)程顯示。

如何才能正常顯示呢?Taylor用了一個(gè)CC命令,直接連接到該容器的IP地址。從demo里我們可以看出,實(shí)際上這個(gè)CC命令連接到容器的RDP服務(wù)上,這樣就相當(dāng)于直接通過終端服務(wù)連接到容器里的會(huì)話里。

 

Windows Docker第一時(shí)間揭秘

盆盆在《Windows Dcoker深入原理分析》里曾經(jīng)提到Windows Docker的前身DrawBridge在其沙盒里實(shí)現(xiàn)了RDP服務(wù)(請(qǐng)?jiān)谌A來四公眾號(hào)里回復(fù)docker8,閱讀這篇文章),Windows Docker的原理應(yīng)該類似。

 

Windows Docker第一時(shí)間揭秘

Linux Docker也能訪問圖形化界面,在以下的這篇文章《在 Docker 中運(yùn)行 OpenOffice》里介紹,只需在Dockerfiles里添加安裝X Server的命令,就能借助VNC客戶端連接到OpenOffice圖形化界面。

http://linux.cn/article-5305-weibo.html

#p#

PID隔離

在Linux容器里,容器里的PID有自己的獨(dú)立命名空間。從演示的情況來看,Windows容器的PID隔離方法看上去略有不同。

在前面IPC隔離一節(jié),我們可以通過Tasklist命令確認(rèn)不同的容器,其CSRSS、Lsass、SVCHOST等系統(tǒng)進(jìn)程的PID有所不同,可見彼此之間是完全隔離的。

那么從宿主機(jī)的角度來看呢?

我們可以看Process Explorer的例子(該例子是在Ignite大會(huì)上由Taylor所演示的),由于Process Explorer是在終端會(huì)話里打開的,所以我們可以在容器的任務(wù)管理器里看到有兩個(gè)會(huì)話

  1. 14是Docker客戶端訪問的會(huì)話
  2. 而15則是通過RDP訪問的會(huì)話

可以看到Process Explorer的進(jìn)程有兩個(gè)版本。顯然,會(huì)話14是Taylor在Docker客戶端里運(yùn)行的結(jié)果(但是我們無法看到圖形化界面),而會(huì)話15則是RDP訪問的結(jié)果。

兩者的運(yùn)行賬戶不一樣,RDP登錄的運(yùn)行身份為Administrator(應(yīng)該和Docker History一致),而會(huì)話14則是System賬戶。

以下是容器里的任務(wù)管理器。

 

Windows Docker第一時(shí)間揭秘

這個(gè)任務(wù)管理器是從容器的角度來看的,我們可以記下其中的若干SVCHOST進(jìn)程的PID。接下來我們打開宿主機(jī)的任務(wù)管理器,從全局的角度來查看??梢园l(fā)現(xiàn),從宿主機(jī)的角度來看,能看到每個(gè)容器里的進(jìn)程,其PID和容器里面的版本是一樣的。

Windows Docker第一時(shí)間揭秘

用戶賬戶隔離

Linux內(nèi)核擁有賬戶隔離能力,可以讓容器里的進(jìn)程以root身份運(yùn)行,但是在宿主機(jī)上,該賬戶實(shí)際上是普通用戶權(quán)限。

在 Taylor的這個(gè)演示中,我們也能“察覺”到一些蛛絲馬跡。在PID隔離一節(jié)的兩個(gè)任務(wù)管理器截圖里,容器里的版本可以看到Process Explorer的運(yùn)行賬戶為Administrator,但是從宿主機(jī)上查看,該賬戶為空。所以Windows容器有可能也實(shí)現(xiàn)了類似的賬戶隔離技術(shù)。

計(jì)算機(jī)名和域名隔離

Windows容器擁有自己的計(jì)算機(jī)名和域名隔離能力,這樣在網(wǎng)絡(luò)上,Windows容器看上去類似于一臺(tái)獨(dú)立的虛擬機(jī)。

不過由于共享內(nèi)核,所以Windows容器目前應(yīng)該不支持活動(dòng)目錄,畢竟同一臺(tái)宿主機(jī)上所有容器應(yīng)該都具有同一個(gè)SID,這樣就無法加域(無法驗(yàn)證計(jì)算機(jī)賬戶)。

盆盆推測,到了Windows容器時(shí)代,類似于活動(dòng)目錄這類比較笨重的驗(yàn)證協(xié)議可能會(huì)逐漸退出歷史舞臺(tái)。畢竟活動(dòng)目錄需要開放那么多端口,需要借助ADFS等手段才能穿透Internet。

不過Windows容器的驗(yàn)證并不會(huì)存在問題,Azure AD和證書等都是很合適的辦法。

容器的優(yōu)勢

容器非常適合開發(fā)的快速迭代、快速回滾。Taylor做了一個(gè)簡單的演示,對(duì)前面所述的代碼進(jìn)行修改,調(diào)用私有的msvcr120.dll文件里的_snwprintf函數(shù)。

 

Windows Docker第一時(shí)間揭秘

但是在docker build的時(shí)候,Taylor沒有修改Dockerfile,沒有像Mark之前的demo那樣把私有的msvcr120.dll拷貝到容器映像中,生成新的映像Layer。

 

Windows Docker第一時(shí)間揭秘

結(jié)果由于容器的目標(biāo)宿主機(jī)上沒有安裝Visual Studio,所以新Build的容器運(yùn)行失敗,提醒缺少msvcr120.dll文件。

 

解決辦法很簡單,要么修復(fù)這個(gè)Bug,要么根據(jù)先前的映像快速生成新的容器,這只需要花費(fèi)幾秒鐘時(shí)間!

Windows Docker第一時(shí)間揭秘

解決這個(gè)問題很簡單,可以根據(jù)先前的映像快速生成新的容器,這大概只需要幾秒鐘時(shí)間。這樣就可以有充足的時(shí)間去調(diào)試修改了。在Build大會(huì)的Keynote上,Mark Russinovich演示了用Visual Studio把同一個(gè)電商網(wǎng)站的代碼簽入到Windows容器和Linux容器里,并且可以用Visual Studio來調(diào)試Linux容器里的代碼。

在Build大會(huì)的Keynote上,Mark Russinovich演示了用Visual Studio把同一個(gè)電商網(wǎng)站的代碼簽入到Windows容器和Linux容器里,并且可以用Visual Studio來調(diào)試Linux容器里的代碼。


 

責(zé)任編輯:Ophira 來源: 51CTO
相關(guān)推薦

2021-10-05 15:23:12

Windows 11Windows微軟

2012-03-16 11:27:47

網(wǎng)易閱讀

2011-02-14 09:44:16

2010-07-05 09:31:02

思科Cius

2013-02-23 08:17:43

2010-02-02 15:40:42

2015-07-14 12:34:05

2012-06-02 07:49:58

2015-11-16 15:09:50

2013-06-27 13:29:46

云推送消息推送移動(dòng)開發(fā)

2013-12-09 10:09:09

開源 PC開源英特爾

2012-07-24 23:41:05

2010-01-22 10:09:54

2023-11-30 14:21:34

2013-09-11 18:12:10

2016-11-21 17:41:49

網(wǎng)絡(luò)宕機(jī)網(wǎng)絡(luò)性能

2018-07-04 06:42:10

2018-08-03 14:17:12

CPU顯卡AMD

2023-10-25 16:56:51

新華三
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)