Docker核心技術(shù)理解(一)

云計(jì)算 Docker的出現(xiàn)是近十年軟件工程領(lǐng)域的革命,Docker的技術(shù)完全可以重鑄整個(gè)軟件開(kāi)發(fā)測(cè)試運(yùn)維等軟件部署的各個(gè)方面。 以前的虛擬化技術(shù)如VMware,OpenStack一般都是重量級(jí)的虛擬化,以VMware為例,首先的需要VMware這套軟件,在這基礎(chǔ)之上安裝具體的操作系統(tǒng)(比如ubantu鏡像1G左右),實(shí)際對(duì)內(nèi)存的損耗是特別大,因?yàn)槊總€(gè)操作系統(tǒng)的都有一個(gè)概念:“常駐內(nèi)存”, 不管你是否運(yùn)行什么軟件,只要系統(tǒng)運(yùn)行著,都會(huì)消耗著一部分內(nèi)存;就如在分布式的集群中,對(duì)于系統(tǒng)資源而言也是很大的消耗。 下面就是以docker為代表的container技術(shù)的框架簡(jiǎn)圖:
從上面可以看出Docker是以linux內(nèi)核(kernel)中的特性為支撐來(lái)完成虛擬化的,具體來(lái)說(shuō),如在Linux中有namespace,cgroups等,利用這些內(nèi)容可以實(shí)現(xiàn)空間隔離,內(nèi)存、CPU的隔離,以及計(jì)算資源的分配控制和記錄,也就是說(shuō)我們可以構(gòu)建不同的用戶(hù)空間(userspace)。 實(shí)際上我們?cè)趯?xiě)程序的時(shí)候,比如說(shuō)server或者database,他們運(yùn)行的時(shí)候只關(guān)心userspace 用戶(hù)空間的,所以當(dāng)我們基于namespace,cgroups的時(shí)候,我們就可以在一臺(tái)服務(wù)器上,依靠多進(jìn)程的方式來(lái)實(shí)現(xiàn)分布式,每個(gè)進(jìn)程就相當(dāng)于一個(gè)機(jī)器, 對(duì)應(yīng)用程序來(lái)說(shuō)是完全透明的,就應(yīng)用程序本生感知不到這是通過(guò)Docker虛擬化技術(shù)虛擬出來(lái)的一臺(tái)機(jī)器,他跟在真是機(jī)器上是一樣。 我們基于Docker技術(shù)就可以以進(jìn)程的方式,來(lái)做操作系統(tǒng)的用戶(hù)空間,而且他的開(kāi)銷(xiāo)幾乎可以忽略不計(jì),我們?cè)谝慌_(tái)機(jī)器上運(yùn)行多臺(tái)機(jī)器的實(shí)例的時(shí)候,是可以榨干硬件的潛能的,包括內(nèi)存CPU、IO等等。從生產(chǎn)力的角度講,以Docker為代表的container技術(shù)把虛擬化的輕量級(jí)性以及云計(jì)算,或者說(shuō)是計(jì)算中心對(duì)資源(我們對(duì)硬件基本都是投入)投入而使用的價(jià)值是發(fā)揮到極致的,所有我們有足夠的理由選擇docker。 傳統(tǒng)虛擬化技術(shù)與Docker虛擬化技術(shù)的核心區(qū)別: 創(chuàng)建速度方面:前者速度很慢(一般在分鐘級(jí))而后者速度非??欤ㄒ话阍诿爰?jí))。 系統(tǒng)性能方面:前者通過(guò)對(duì)硬件層的模擬,增加了系統(tǒng)調(diào)用鏈路環(huán)節(jié),有性能損耗,而后者共享內(nèi)核,幾乎沒(méi)有損耗。 資源消耗方面:前者消耗很大如有常駐內(nèi)存等,而后者消耗很小,一臺(tái)機(jī)器可以輕松創(chuàng)建多個(gè)Container。 操作系統(tǒng)覆蓋:支持Linux,Windows,mac等,后者目前僅Kernel所支持的OS,如Linux,ubantu,CentOS(借助工具除外)。 docker是目前容器虛擬化技術(shù)最成功的代表,它創(chuàng)建速度非???,如我們很多時(shí)候要?jiǎng)?chuàng)建100臺(tái),以前基于VMware的傳統(tǒng)虛擬化技術(shù)的時(shí)候,會(huì)非常麻煩,而且非常耗時(shí)間,但是如果基于docker的話(huà),你就配置幾個(gè)參數(shù)就行,就可以從已有的一個(gè)節(jié)點(diǎn)的實(shí)例,變成10個(gè)或100個(gè)。 傳統(tǒng)虛擬化是對(duì)硬件的模擬,就像Java C語(yǔ)言一樣,增加了硬件層的模擬,就相當(dāng)于每一次調(diào)用的時(shí)候,要通過(guò)虛擬機(jī),虛擬機(jī)又要轉(zhuǎn)過(guò)來(lái)通過(guò)內(nèi)核調(diào)用硬件,而docker中直接調(diào)用硬件,幾乎沒(méi)有性能損耗。 資源消耗方面,傳統(tǒng)化技術(shù),第一點(diǎn),裝一個(gè)系統(tǒng)至少也得1G左右的大小, 第二點(diǎn),即使不運(yùn)行任何的服務(wù),他都有常駐內(nèi)存,而docker對(duì)于資源的消耗特別小,一臺(tái)主機(jī)可以輕松創(chuàng)建多個(gè)container(一般一個(gè)普通pc 8G 16G),假如你在container里邊運(yùn)行的服務(wù)不是很復(fù)雜的話(huà),可以在很輕松的一臺(tái)pc上構(gòu)建20臺(tái)到50臺(tái)這樣的虛機(jī)(節(jié)點(diǎn))在其他系統(tǒng)上建立開(kāi)發(fā)環(huán)境,如Windows,mac可以借助一個(gè)工具Boot2Docker,但是建議ubantu,centOS。 一直強(qiáng)調(diào)的一個(gè)觀點(diǎn)是:以docker為代表的container技術(shù) 是對(duì)內(nèi)核中的cgroups,namespace等內(nèi)容的使用,如看下圖: 當(dāng)我們保證獨(dú)立的基礎(chǔ)上,Linux的namespace就幫助我們完成了不同的namespace隔離出來(lái)的效果就是一個(gè)桃花源;從有應(yīng)用的視角看,就是一個(gè)完整的操作系統(tǒng),從另外一個(gè)角度來(lái)看,既然我們?cè)谝慌_(tái)機(jī)器上有很多的container,而每一個(gè)container都會(huì)使用memory和CPU,那就涉及到內(nèi)核中資源的限制(cgroups),總結(jié):Linux內(nèi)核基于namespace的隔離機(jī)制,以及 cgroups的資源控制機(jī)制來(lái)管理container 其實(shí)止于資源控制而言,cgroups 在實(shí)際運(yùn)行的時(shí)候回創(chuàng)建多個(gè)cgroups,也就是子進(jìn)程(subsystems),就會(huì)形成一個(gè)樹(shù)(看上圖),每個(gè)subsystem就會(huì)關(guān)聯(lián)到樹(shù)狀結(jié)構(gòu)上,例如圖上的CPU,memory其實(shí)就是一個(gè)subsystem,它會(huì)關(guān)聯(lián)到某種具體的cgroups實(shí)例上。一個(gè)subsystem其實(shí)就是代表一項(xiàng)資源的,除了這兩項(xiàng),還有IO,上面包含了一個(gè)父cgroups和兩個(gè)子cgroups(共3個(gè)),關(guān)聯(lián)的時(shí)候會(huì)關(guān)聯(lián)兩個(gè)subsystem(CPU、memory),這兩項(xiàng)資源會(huì)通過(guò) cgroups具體的實(shí)例來(lái)與具體的 task連接,從內(nèi)核的角度看用戶(hù)空間,一個(gè)task就相當(dāng)進(jìn)程,我們的CPU、memory、IO就通過(guò)cgroups來(lái)控制具體進(jìn)程,來(lái)實(shí)現(xiàn)管理,一個(gè)時(shí)期的task進(jìn)程就是一個(gè)container實(shí)例,他可以加入到我們這個(gè)樹(shù)狀結(jié)構(gòu)上的一個(gè)cgroups,cgroups就會(huì)限制我們的container的資源。當(dāng)然,cgroups和我們具體的container資源的關(guān)系實(shí)際上是一種多對(duì)多的關(guān)系,因?yàn)槲覀兊倪M(jìn)程本身需使用很多資源,一個(gè)cgroups可以連接到很多task,而一個(gè)task也可以連接到多個(gè)cgroups,但是在一個(gè)樹(shù)狀結(jié)構(gòu)里邊我們只能加入一個(gè)cgroups,只于我們?nèi)萜鞫?,我們開(kāi)始創(chuàng)建的時(shí)候,UsegeCPU可能有一個(gè)CPUset,這個(gè)cgroups,然后會(huì)將具體container 的pid寫(xiě)入我們的 CPUset具體的task中去,這樣我們的container或者這個(gè)進(jìn)程就會(huì)加入到這個(gè)cgroups池里邊,。一個(gè)具體的container可能會(huì)加入到多個(gè)cgroups,因?yàn)閯倓偽覀冎徽劦降氖荂PUset,實(shí)際上也有IO,memory,這是內(nèi)核里面的內(nèi)容。 當(dāng)我們?cè)趦?nèi)核之上有很多用戶(hù)空間的時(shí)候,就一定會(huì)涉及到用戶(hù)空間根目錄以及文件結(jié)構(gòu)樹(shù)是什么,由于我們是基于一個(gè)具體的設(shè)備,真實(shí)的根目錄只有一個(gè),所有的container都是掛載到真實(shí)物理跟目錄下的子目錄,而掛載上去后的樹(shù)狀結(jié)構(gòu)完全由你自己設(shè)計(jì)。 chroot隔離出來(lái)的虛擬的文件系統(tǒng)會(huì)掛載到真實(shí)的文件系統(tǒng)之上,在container的角度看,對(duì)于像Apache這些應(yīng)用程序服務(wù)器看到的子目錄,其實(shí)就是他進(jìn)程的根目錄, Linux一個(gè)卓越的貢獻(xiàn)就是一切皆目錄。

本文標(biāo)題:Docker核心技術(shù)理解(一)
鏈接地址:http://muchs.cn/article6/cjhiog.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、網(wǎng)站設(shè)計(jì)網(wǎng)站收錄、關(guān)鍵詞優(yōu)化、App設(shè)計(jì)、ChatGPT

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)