最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

【云原生 ? Docker】用故事給老板講Docker核心原理

2023-03-26 00:18 作者:34895505520_bili  | 我要投稿

白話Docker核心原理

Docker是什么?

「Docker使用Google公司推出的Go語(yǔ)言進(jìn)行開(kāi)發(fā)實(shí)現(xiàn),基于操作系統(tǒng)內(nèi)核中Cgroup(資源控制)、Namespace(資源隔離)與OverlayFS(數(shù)據(jù)存儲(chǔ))等技術(shù),實(shí)現(xiàn)了基于操作系統(tǒng)層面的虛擬化技術(shù)?!?/strong>

理解的早就理解了這句話核心本質(zhì),不理解的給他這么一解釋還是云里霧里。那我們先不急于搞懂Docker是什么,說(shuō)到Docker容器,就不得不說(shuō)下虛擬機(jī)(Virtual Machine),Docker容器和虛擬機(jī)又有什么區(qū)別呢?

Docker vs 虛擬機(jī)

虛擬機(jī)對(duì)于我們開(kāi)發(fā)者是個(gè)再熟悉不過(guò)的概念,比如我們經(jīng)常使用VMware Workstation搭建虛擬操作系統(tǒng)部署應(yīng)用,使用JVM虛擬機(jī)運(yùn)行Java應(yīng)用等,如下圖,「通常使用虛擬機(jī)管理器作為中間轉(zhuǎn)換層,可以屏蔽底層操作系統(tǒng)或硬件設(shè)備差異」,比如上層虛擬機(jī)操作系統(tǒng)(Guest OS)執(zhí)行程序或Java程序運(yùn)行等,「這個(gè)中間件轉(zhuǎn)換層就像翻譯家一樣,將上層執(zhí)行的指令解釋翻譯成下層操作系統(tǒng)對(duì)應(yīng)的指令進(jìn)行執(zhí)行」。

正如Java世界中吹噓的"一次編譯,到處運(yùn)行",「虛擬機(jī)本質(zhì)上通過(guò)中間件轉(zhuǎn)換層屏蔽了底層差異,模擬出一個(gè)新環(huán)境,實(shí)現(xiàn)與平臺(tái)無(wú)關(guān),達(dá)到與外界隔離的目的,這就是虛擬機(jī)實(shí)現(xiàn)虛擬化的核心思想」。

從虛擬機(jī)架構(gòu)實(shí)現(xiàn)上可以看出,其存在一個(gè)很大問(wèn)題:所有的指令都必須經(jīng)過(guò)虛擬機(jī)管理器這個(gè)中間轉(zhuǎn)換層翻譯解釋才能在真實(shí)操作系統(tǒng)上運(yùn)行,這就意味著虛擬機(jī)會(huì)存在性能損耗。另外,為了模擬一個(gè)Linux環(huán)境上運(yùn)行的應(yīng)用,需要使用VMware運(yùn)行部署一個(gè)宿主機(jī)(Guest OS),再在宿主機(jī)上運(yùn)行應(yīng)用,宿主機(jī)本身占用好幾個(gè)G的存儲(chǔ)空間、400-500MB+內(nèi)存空間,現(xiàn)在微服務(wù)架構(gòu)動(dòng)不動(dòng)就是10+、100+個(gè)應(yīng)用組件需要部署,那這些組件都需要做隔離部署使用虛擬機(jī)方式無(wú)疑是致命的。

上述說(shuō)的虛擬機(jī)存在性能問(wèn)題和資源浪費(fèi)造成了虛擬機(jī)對(duì)細(xì)粒度的環(huán)境隔離有點(diǎn)力不從心,而這又與當(dāng)前流行的微服務(wù)架構(gòu)場(chǎng)景下,系統(tǒng)被拆分成幾十、上百個(gè)微服務(wù)應(yīng)用組件需要獨(dú)立部署存在沖突。Docker推崇的是一種輕量級(jí)容器的結(jié)構(gòu),即一個(gè)應(yīng)用一個(gè)容器。所以,Docker一出來(lái)就被推向巔峰,那它又是如何搞定虛擬機(jī)隔離存在的問(wèn)題的呢?

Docker容器核心技術(shù)

Docker容器中進(jìn)程是直接運(yùn)行在底層操作系統(tǒng)上,沒(méi)有中間轉(zhuǎn)換層,所以也就不存在性能損耗的問(wèn)題。關(guān)鍵那它是如何做到隔離的呢?

「這里就引出了支撐Docker容器的兩大內(nèi)核技術(shù):Namespace和Cgroups(Control Groups)」。Namespace主要是用來(lái)進(jìn)行「資源隔離」,對(duì)于那些計(jì)算型資源,比如CPU、內(nèi)存、磁盤IO等不能進(jìn)行隔離的資源,這時(shí)就需要采用Cgroups進(jìn)行「資源限制」,防止有些資源消耗較大的容器,將整個(gè)物理機(jī)器的硬件資源(CPU, Memory、磁盤IO等) 占滿,進(jìn)而影響其它進(jìn)程性能。

NamespaceCgroups這兩個(gè)技術(shù)都是Linux內(nèi)核本身支持的功能,Docker如果只使用這兩大技術(shù)也不可能造就出道即巔峰的火熱程度,Docker創(chuàng)新點(diǎn)恰恰是引入鏡像概念,并使用聯(lián)合文件系統(tǒng)(UnionFS)技術(shù)很好的實(shí)現(xiàn)了鏡像分層,這樣就可以將應(yīng)用部署介質(zhì)、依賴環(huán)境配置文件以及操作系統(tǒng)二進(jìn)制文件進(jìn)行分層疊加構(gòu)建出應(yīng)用運(yùn)行時(shí)文件系統(tǒng)環(huán)境。

鏡像包含一個(gè)基礎(chǔ)鏡像(Base Image),這個(gè)一般包含操作系統(tǒng)介質(zhì),比如centosdebian,但是它只包括使用的操作系統(tǒng)二進(jìn)制文件,并沒(méi)有包括內(nèi)核相關(guān),所以,它的體積遠(yuǎn)遠(yuǎn)小于部署整個(gè)操作系統(tǒng)占用的空間,比如一個(gè)centos基礎(chǔ)鏡像大概只有70-80MB。另外,鏡像分層設(shè)計(jì)進(jìn)一步減少存儲(chǔ)占用,比如現(xiàn)在100+應(yīng)用組件都是基于centos基礎(chǔ)鏡像部署,實(shí)際部署時(shí)只需要拉取一份centos基礎(chǔ)鏡像,就像搭積木一樣,將每一層使用的文件進(jìn)行組合疊加,最終構(gòu)建出程序運(yùn)行時(shí)完整的目錄結(jié)構(gòu)。

白話核心技術(shù)關(guān)系

Docker容器技術(shù)火熱的背后,其實(shí)是NamespaceCgroupsUnionFS三大技術(shù)創(chuàng)新的結(jié)合,造就出了Docker這種現(xiàn)象級(jí)產(chǎn)品」。下面用個(gè)比較形象的比喻來(lái)幫助你理解三大技術(shù)關(guān)系:

1、正常程序啟動(dòng)時(shí)直接運(yùn)行在操作系統(tǒng)上,使用Docker啟動(dòng)程序時(shí),也是直接運(yùn)行在操作系統(tǒng)上,但是Docker引擎在啟動(dòng)程序時(shí)會(huì)給程序套一個(gè)立方體殼(見(jiàn)下圖);

2、這個(gè)立方體殼前后左右四個(gè)面使用Namespace資源隔離技術(shù)打造,這樣就給Docker容器中進(jìn)程和其它進(jìn)程隔離開(kāi)來(lái),給容器中進(jìn)程造成一種運(yùn)行在一個(gè)獨(dú)立環(huán)境中的假象(見(jiàn)下圖);

3、這個(gè)立方體殼的上面這個(gè)面使用Cgroups資源限制技術(shù)打造,避免程序壯大生長(zhǎng)出來(lái)?yè)屨计渌M(jìn)程的資源,進(jìn)而影響其它進(jìn)程性能,這樣就給蓋蓋上加上了一個(gè)緊箍咒,再牛逼的程序也會(huì)把你死死的限制?。ㄒ?jiàn)下圖);

4、最后再來(lái)看下這個(gè)立方體殼剩下的最下面這個(gè)面,其采用UnionFS技術(shù)打造,構(gòu)建出容器中進(jìn)程運(yùn)行時(shí)文件系統(tǒng)根基。將操作系統(tǒng)二進(jìn)制指令、依賴配置文件、程序介質(zhì)等通過(guò)鏡像分層疊加構(gòu)建出程序運(yùn)行時(shí)看到的整個(gè)文件系統(tǒng)環(huán)境;比如宿主機(jī)是Debian系統(tǒng),但是基礎(chǔ)鏡像是CentOS環(huán)境,容器中進(jìn)程看到的是CentOS系統(tǒng),而不是Debian系統(tǒng),同時(shí)將yum install安裝的依賴介質(zhì)也通過(guò)鏡像打包進(jìn)來(lái),容器中進(jìn)程就不需要關(guān)注宿主機(jī)上到底有沒(méi)有安裝該依賴介質(zhì)等等,這樣容器中進(jìn)程看到是一個(gè)擁有程序運(yùn)行時(shí)完整介質(zhì),并與宿主機(jī)操作系統(tǒng)隔離開(kāi)的獨(dú)立操作系統(tǒng)(見(jiàn)下圖);

5、所以,程序運(yùn)行在三大核心技術(shù)創(chuàng)造的立方體殼殼中,被蒙蔽雙眼傻乎乎的以為運(yùn)行在一個(gè)獨(dú)立計(jì)算機(jī)環(huán)境中,看不到外界程序運(yùn)行情況,也影響不到外界程序的運(yùn)行。

如何查看Docker進(jìn)程在宿主機(jī)上的PID?

Docker容器中的進(jìn)程是直接運(yùn)行在宿主機(jī)上,可以通過(guò)docker inspect container查看到Docker容器中進(jìn)程在宿主機(jī)上對(duì)應(yīng)的PID信息(見(jiàn)下圖):

宿主機(jī)上ps -ef查看下容器進(jìn)程信息:

因?yàn)?,這里運(yùn)行的是一個(gè)nginx容器,所以宿主機(jī)上看到對(duì)應(yīng)的是nginx主進(jìn)程,同時(shí)該進(jìn)程創(chuàng)建了兩個(gè)nginx worker子進(jìn)程。

Docker容器缺陷

「高性能、輕便是容器相較于虛擬機(jī)最大的優(yōu)勢(shì),容器本質(zhì)上是一種特殊的進(jìn)程?!?/strong>

不過(guò),有利就有弊,基于Namespace的資源隔離和Cgroups的資源限制都不是那么徹底,因?yàn)槿萜髦g底層還是共享使用宿主機(jī)的Linux內(nèi)核,盡管你可以在容器里使用不同版本的操作系統(tǒng)文件,比如CentOS或者Ubuntu,但這并不能改變共享宿主機(jī)內(nèi)核的事實(shí)。這意味著,如果你要在Windows宿主機(jī)上運(yùn)行Linux容器,或者在低版本的Linux宿主機(jī)上運(yùn)行高版本的Linux容器,都是行不通的。

其次,在Linux內(nèi)核中,有很多資源和對(duì)象是不能被Namespace化的,最典型的例子就是:時(shí)間。這就意味著,如果你的容器中的程序修改了時(shí)間,整個(gè)宿主機(jī)的時(shí)間都會(huì)被隨之修改,這顯然不符合用戶的預(yù)期。

另外,跟Namespace的情況類似,Cgroups對(duì)資源的限制能力也有很多不完善的地方,這里最常見(jiàn)的是/proc 文件系統(tǒng)的問(wèn)題。Linux下的/proc目錄存儲(chǔ)的是記錄當(dāng)前內(nèi)核運(yùn)行狀態(tài)的一系列特殊文件,用戶可以通過(guò)訪問(wèn)這些文件,查看系統(tǒng)以及當(dāng)前正在運(yùn)行的進(jìn)程的信息,比如CPU使用情況、內(nèi)存占用率等,這些文件也是top指令查看系統(tǒng)信息的主要數(shù)據(jù)來(lái)源。但是,你如果在容器里執(zhí)行top指令,就會(huì)發(fā)現(xiàn),它顯示的信息居然是宿主機(jī)的CPU和內(nèi)存數(shù)據(jù),而不是當(dāng)前容器的數(shù)據(jù)。造成這個(gè)問(wèn)題的原因就是,Docker引擎在啟動(dòng)進(jìn)程時(shí)直接將宿主機(jī)/proc下很多文件掛載到Docker容器上。

[更多云原生監(jiān)控運(yùn)維,請(qǐng)關(guān)注微信公眾號(hào):Reactor2020]


【云原生 ? Docker】用故事給老板講Docker核心原理的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
平谷区| 昌都县| 洛扎县| 石嘴山市| 来宾市| 金坛市| 永仁县| 湖口县| 彰化市| 长宁县| 涞源县| 喀喇沁旗| 万年县| 潼关县| 望奎县| 简阳市| 通化市| 五常市| 莱州市| 宁远县| 盐津县| 屏边| 泗阳县| 汉川市| 云龙县| 科技| 冕宁县| 凤翔县| 盐池县| 石景山区| 丰镇市| 克拉玛依市| 伊春市| 双鸭山市| 台山市| 东安县| 锦屏县| 呈贡县| 兴仁县| 荣昌县| 远安县|