Docker容器原理與實(shí)現(xiàn)_第1頁(yè)
Docker容器原理與實(shí)現(xiàn)_第2頁(yè)
Docker容器原理與實(shí)現(xiàn)_第3頁(yè)
Docker容器原理與實(shí)現(xiàn)_第4頁(yè)
Docker容器原理與實(shí)現(xiàn)_第5頁(yè)
已閱讀5頁(yè),還剩1頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Docker容器的原理與實(shí)現(xiàn)周成玉【摘要】Linux容器(Linux Container,LXC)是docker的核心技術(shù)之一,LXC利用chroot、namespace和cgroup等技術(shù)實(shí)現(xiàn)資源的隔離和配額,文章剖析了LXC的原理和實(shí)現(xiàn)?!娟P(guān)鍵詞】chroot, namespace, cgroup, LXC1、概述海關(guān)已經(jīng)廣泛使用虛擬機(jī)技術(shù)多年,IT資源利用率得到有效提高。近年來(lái),基于Docker的輕量級(jí)虛擬化技術(shù)正成為IT技術(shù)熱點(diǎn)之一。與傳統(tǒng)虛擬機(jī)相比,Docker技術(shù)本質(zhì)上是一種LXC引擎。VM和LXC關(guān)注的問(wèn)題都是資源的隔離和配額,VM采用CPU、memory、disk等硬件虛擬化技

2、術(shù),LCX則借助了chroot、namespace和cgroups等系統(tǒng)調(diào)用。2、LXC的資源隔離2.1、chrootchroot(change root directory,更改root目錄),最早在1979年的Unix V7使用,并在各個(gè)版本的linux系統(tǒng)中得以保留。在linux系統(tǒng)中,系統(tǒng)默認(rèn)的目錄結(jié)構(gòu)都是以“/”,即根(root)開始的。通過(guò)使用chroot,系統(tǒng)讀取到的目錄和文件將不在是舊系統(tǒng)根下的而是指定的新位置下的目錄結(jié)構(gòu)和文件,這樣帶來(lái)兩個(gè)好處:(1)增加系統(tǒng)的安全性,限制用戶權(quán)力。經(jīng)過(guò)chroot之后,在新根下將訪問(wèn)不到舊系統(tǒng)的根目錄結(jié)構(gòu)和文件,這樣就增強(qiáng)了系統(tǒng)的安全性。在

3、登錄(login)前使用chroot,阻止用戶訪問(wèn)特定目錄。(2)建立一個(gè)與原系統(tǒng)隔離的系統(tǒng)目錄結(jié)構(gòu),方便用戶的開發(fā)。使用chroot后,系統(tǒng)讀取的是新根下的目錄和文件,這是一個(gè)與原系統(tǒng)根下文件不相關(guān)的目錄結(jié)構(gòu)。在這個(gè)新的環(huán)境中,可以用來(lái)測(cè)試軟件的靜態(tài)編譯以及一些與系統(tǒng)不相關(guān)的獨(dú)立開發(fā)。Docker就是利用chroot功能,實(shí)現(xiàn)每個(gè)容器里看到的文件系統(tǒng)都是一個(gè)完整的linux系統(tǒng)。下面來(lái)看一個(gè)簡(jiǎn)單shell腳本,將某個(gè)進(jìn)程及其子進(jìn)程訪問(wèn)根目錄限制在“/home/container”目錄,該進(jìn)程及其子進(jìn)程將不能訪問(wèn)linux系統(tǒng)的其他目錄。先創(chuàng)建目錄/home/container,將bash、l

4、s和pwd三個(gè)shell命令及運(yùn)行這三個(gè)命令需要的庫(kù)復(fù)制到對(duì)應(yīng)目錄。腳本如下:執(zhí)行腳本后,在/home下增加了container文件系統(tǒng),如下圖藍(lán)色部分所示:執(zhí)行chroot /home/container /bin/bash后,會(huì)啟動(dòng)一個(gè)bash進(jìn)程,這個(gè)進(jìn)程及其所有子進(jìn)程對(duì)應(yīng)的根目錄就限制在“/home/container”,且對(duì)于它們而言,就認(rèn)為是自己的根目錄。執(zhí)行命令結(jié)果如下:由于進(jìn)程的根(對(duì)應(yīng)物理機(jī)系統(tǒng)的/home/container)下面只有bash、pwd和ls三個(gè)命令,子進(jìn)程不能訪問(wèn)物理機(jī)的其他命令,所以當(dāng)執(zhí)行clear命令時(shí)就會(huì)報(bào)“command not found”錯(cuò)??梢?jiàn)

5、,chroot有效地限制了進(jìn)程訪問(wèn)操作系統(tǒng)文件系統(tǒng)的權(quán)限。2.2、namespaceNamespace是Linux內(nèi)核功能,用來(lái)隔離各種系統(tǒng)資源,比如進(jìn)程樹、用戶號(hào)、網(wǎng)絡(luò)接口、掛載點(diǎn)等。當(dāng)一臺(tái)物理機(jī)同時(shí)運(yùn)行多個(gè)應(yīng)用時(shí),有些用戶會(huì)訪問(wèn)、修改或關(guān)閉他應(yīng)用的某些資源,這樣就會(huì)導(dǎo)致各個(gè)應(yīng)用之間互相干擾。通過(guò)使用Namespace,系統(tǒng)就可以做到各種資源隔離。namespace建立系統(tǒng)的不同視圖(可以理解為簡(jiǎn)易容器),每個(gè)namespace內(nèi)用戶看起來(lái),像單獨(dú)的一臺(tái)Linux計(jì)算機(jī),有自己的init進(jìn)程(PID為1),其他進(jìn)程的PID依次遞增。如圖所示,namespace A和namespace B都有

6、PID為1的init進(jìn)程,子容器的進(jìn)程映射到父容器的進(jìn)程上,父容器可以知道每一個(gè)子容器的運(yùn)行狀態(tài),而子容器與子容器之間是隔離的。圖中,進(jìn)程3在父命名空間里面PID 為3,但是在namespace A就是1,也就是說(shuō)namespace A內(nèi)用戶看到的進(jìn)程3就像 init 進(jìn)程一樣,認(rèn)為這是自己的初始化進(jìn)程,但是從整個(gè)操作系統(tǒng)來(lái)看,它只是3號(hào)進(jìn)程虛擬化出來(lái)的一個(gè)namespace而已。當(dāng)前Linux一共實(shí)現(xiàn)六種不同類型的namespace,分別是mount、UTS、IPC、PID、network、User等的隔離機(jī)制。各種類型namespace實(shí)現(xiàn)的功能和發(fā)行系統(tǒng)版本關(guān)系如下:Namespace系

7、統(tǒng)調(diào)用參數(shù)隔離內(nèi)容內(nèi)核版本MountCLONE_NEWNS掛載點(diǎn)(文件系統(tǒng))Linux 2.4.19UTSCLONE_NEWUTS主機(jī)名與域名Linux 2.6.19IPCCLONE_NEWIPC進(jìn)程間通信Linux 2.6.19PIDCLONE_NEWPID進(jìn)程編號(hào)Linux 2.6.24NetworkCLONE_NEWNET網(wǎng)絡(luò)設(shè)備、網(wǎng)絡(luò)棧、端口等Linux 2.6.29UserCLONE_NEWUSER用戶和用戶組Linux 3.8下面利用一個(gè)簡(jiǎn)單程序,剖析使用namespace進(jìn)行資源隔離的方法。代碼如下:執(zhí)行這段c語(yǔ)言代碼會(huì)建立了一個(gè)namespace,這個(gè)namespace的初始化

8、進(jìn)程是bash,用ps命令查看bash對(duì)應(yīng)的進(jìn)程號(hào)為1。代碼顯示的3591進(jìn)程號(hào)是指這個(gè)bash進(jìn)程在物理機(jī)系統(tǒng)的進(jìn)程號(hào)。從物理機(jī)Linux系統(tǒng)看,執(zhí)行c語(yǔ)言的進(jìn)程號(hào)是3590,namespace中bash的進(jìn)程號(hào)是3591。從執(zhí)行結(jié)果看,程序?qū)燧d點(diǎn)、主機(jī)名和進(jìn)程等進(jìn)行namespace隔離。程序運(yùn)行后,sethostname將主機(jī)名修改為container,物理機(jī)linux主機(jī)名仍然為centos-1;namespace內(nèi)進(jìn)程與物理機(jī)linux系統(tǒng)之間的進(jìn)程也進(jìn)行了隔離,這個(gè)namespace進(jìn)程就形成了一個(gè)容器的最小內(nèi)核。如果需要這個(gè)容器具有更多的功能模塊,可以在容器的文件系統(tǒng)(對(duì)應(yīng)物理

9、機(jī)/home/container以下目錄)創(chuàng)建對(duì)應(yīng)shell命令或者應(yīng)用程序。這樣,這個(gè)namespace小程序啟動(dòng)后,系統(tǒng)就會(huì)出現(xiàn)一個(gè)功能比較豐富的容器環(huán)境。在完整docker實(shí)際運(yùn)行環(huán)境,系統(tǒng)將各種功能代碼封裝到一個(gè)鏡像文件中,再采用aufs掛載的方式提供給容器使用。這樣既滿足功能要求,又提升了發(fā)布和遷移的效率。3、LXC的資源配額采用chroot和namespace,系統(tǒng)實(shí)現(xiàn)了對(duì)容器的進(jìn)程、主機(jī)名、文件系統(tǒng)、網(wǎng)絡(luò)等資源隔離,但是容器仍然可以沒(méi)有限制地使用所有資源。此時(shí),如果物理機(jī)同時(shí)運(yùn)行多個(gè)容器,就存在搶占資源,導(dǎo)致物理機(jī)癱瘓的風(fēng)險(xiǎn)。所以,要實(shí)現(xiàn)一個(gè)強(qiáng)壯的容器,就必須對(duì)容器使用的資源進(jìn)行

10、配額管理。cgroups 是Linux內(nèi)核提供限制進(jìn)程資源的一種機(jī)制,可以用于對(duì)cpu和內(nèi)存等資源的精細(xì)化控制。開發(fā)者利用cgroups可以限制進(jìn)程資源的使用,比如:cgroups可以將應(yīng)用消耗的計(jì)算資源限制某幾個(gè)CPU、甚至某個(gè)CPU的特定比率。Docker也就使用了cgroups來(lái)完成cpu和內(nèi)存等部分的資源控制。下面這段C程序,先打印出運(yùn)行進(jìn)程號(hào),接著的死循環(huán)會(huì)消耗大量CPU資源。程序運(yùn)行后,進(jìn)程號(hào)是13649,結(jié)果如下:再用top命令,查看系統(tǒng)cpu資源情況發(fā)現(xiàn),13649進(jìn)程消耗了一核CPU的99.8%。通過(guò)使用cgroups機(jī)制可以限制上述死循環(huán)程序占用CPU資源的上限。具體操作是

11、在“/cgroup/cpu”目錄新建eatcpugroup目錄,并把要控制的cpu上限值30000(表示30%使用上限)和進(jìn)程號(hào)13649加入“cpu.cfs_quota_us”和“tasks”這兩個(gè)文件。腳本如下:針對(duì)13649進(jìn)程cgroup機(jī)制建立后,13649進(jìn)程CPU消耗了下降到30.6%。除對(duì)CPU使用率進(jìn)行限制外,cgroup還具有利用memory子系統(tǒng)限制進(jìn)程的內(nèi)存使用量、利用blkio 子系統(tǒng)限制進(jìn)程的塊設(shè)備讀寫、利用devices 子系統(tǒng)控制進(jìn)程能夠訪問(wèn)的設(shè)備、利用net_cls子系統(tǒng)限制進(jìn)程的網(wǎng)絡(luò)數(shù)據(jù)包、利用ns子系統(tǒng)限制進(jìn)程使用不同 namespace等功能。4、簡(jiǎn)易容

12、器實(shí)現(xiàn)接下來(lái)的程序?qū)hroot、namespace和cgroups結(jié)合運(yùn)用,就實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的容器。上述程序運(yùn)行后,就創(chuàng)建一個(gè)簡(jiǎn)易容器環(huán)境。這個(gè)容器的初始化進(jìn)程是bash,后續(xù)所有子進(jìn)程能夠訪問(wèn)的文件系統(tǒng)控制在物理機(jī)的/home/container目錄映射的根目錄下,同時(shí)利用namespace對(duì)子進(jìn)程等進(jìn)行了隔離,并通過(guò)cgroup對(duì)這個(gè)進(jìn)程及其所有子進(jìn)程使用cpu資源進(jìn)行了限制。在這個(gè)容器的后臺(tái)運(yùn)行剛才消耗cpu的應(yīng)用,進(jìn)程1對(duì)應(yīng)bash,它的子進(jìn)程2對(duì)應(yīng)eatcpu.out這個(gè)程序,具體如下圖所示:從物理機(jī)的linux系統(tǒng)看,democontainer的進(jìn)程號(hào)為3289、它的子進(jìn)程bash的進(jìn)程號(hào)是3293、bash的子進(jìn)程eatcpu的進(jìn)程號(hào)是3294,具體如下圖所示:物理機(jī)和容器之間的進(jìn)程映射關(guān)系如下:雖然eatcpu.out程序非常消耗CPU資源,不進(jìn)行限制時(shí)很快就會(huì)將CPU資源100%消耗,但是由于cgroup對(duì)3289號(hào)進(jìn)程(democontainer.out)進(jìn)行了CPU使用率40%的限制,那么進(jìn)程

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論