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