




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
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資源利用率得到有效提高。近年來,基于Docker的輕量級虛擬化技術(shù)正成為IT技術(shù)熱點(diǎn)之一。與傳統(tǒng)虛擬機(jī)相比,Docker技術(shù)本質(zhì)上是一種LXC引擎。VM和LXC關(guā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使用,并在各個版本的linux系統(tǒng)中得以保留。在linux系統(tǒng)中,系統(tǒng)默認(rèn)的目錄結(jié)構(gòu)都是以“/”,即根(root)開始的。通過使用chroot,系統(tǒng)讀取到的目錄和文件將不在是舊系統(tǒng)根下的而是指定的新位置下的目錄結(jié)構(gòu)和文件,這樣帶來兩個好處:(1)增加系統(tǒng)的安全性,限制用戶權(quán)力。經(jīng)過chroot之后,在新根下將訪問不到舊系統(tǒng)的根目錄結(jié)構(gòu)和文件,這樣就增強(qiáng)了系統(tǒng)的安全性。在
3、登錄(login)前使用chroot,阻止用戶訪問特定目錄。(2)建立一個與原系統(tǒng)隔離的系統(tǒng)目錄結(jié)構(gòu),方便用戶的開發(fā)。使用chroot后,系統(tǒng)讀取的是新根下的目錄和文件,這是一個與原系統(tǒng)根下文件不相關(guān)的目錄結(jié)構(gòu)。在這個新的環(huán)境中,可以用來測試軟件的靜態(tài)編譯以及一些與系統(tǒng)不相關(guān)的獨(dú)立開發(fā)。Docker就是利用chroot功能,實(shí)現(xiàn)每個容器里看到的文件系統(tǒng)都是一個完整的linux系統(tǒng)。下面來看一個簡單shell腳本,將某個進(jìn)程及其子進(jìn)程訪問根目錄限制在“/home/container”目錄,該進(jìn)程及其子進(jìn)程將不能訪問linux系統(tǒng)的其他目錄。先創(chuàng)建目錄/home/container,將bash、l
4、s和pwd三個shell命令及運(yùn)行這三個命令需要的庫復(fù)制到對應(yīng)目錄。腳本如下:執(zhí)行腳本后,在/home下增加了container文件系統(tǒng),如下圖藍(lán)色部分所示:執(zhí)行chroot /home/container /bin/bash后,會啟動一個bash進(jìn)程,這個進(jìn)程及其所有子進(jìn)程對應(yīng)的根目錄就限制在“/home/container”,且對于它們而言,就認(rèn)為是自己的根目錄。執(zhí)行命令結(jié)果如下:由于進(jìn)程的根(對應(yīng)物理機(jī)系統(tǒng)的/home/container)下面只有bash、pwd和ls三個命令,子進(jìn)程不能訪問物理機(jī)的其他命令,所以當(dāng)執(zhí)行clear命令時就會報“command not found”錯。可見
5、,chroot有效地限制了進(jìn)程訪問操作系統(tǒng)文件系統(tǒng)的權(quán)限。2.2、namespaceNamespace是Linux內(nèi)核功能,用來隔離各種系統(tǒng)資源,比如進(jìn)程樹、用戶號、網(wǎng)絡(luò)接口、掛載點(diǎn)等。當(dāng)一臺物理機(jī)同時運(yùn)行多個應(yīng)用時,有些用戶會訪問、修改或關(guān)閉他應(yīng)用的某些資源,這樣就會導(dǎo)致各個應(yīng)用之間互相干擾。通過使用Namespace,系統(tǒng)就可以做到各種資源隔離。namespace建立系統(tǒng)的不同視圖(可以理解為簡易容器),每個namespace內(nèi)用戶看起來,像單獨(dú)的一臺Linux計算機(jī),有自己的init進(jìn)程(PID為1),其他進(jìn)程的PID依次遞增。如圖所示,namespace A和namespace B都有
6、PID為1的init進(jìn)程,子容器的進(jìn)程映射到父容器的進(jìn)程上,父容器可以知道每一個子容器的運(yùn)行狀態(tài),而子容器與子容器之間是隔離的。圖中,進(jìn)程3在父命名空間里面PID 為3,但是在namespace A就是1,也就是說namespace A內(nèi)用戶看到的進(jìn)程3就像 init 進(jìn)程一樣,認(rèn)為這是自己的初始化進(jìn)程,但是從整個操作系統(tǒng)來看,它只是3號進(jìn)程虛擬化出來的一個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)程編號Linux 2.6.24NetworkCLONE_NEWNET網(wǎng)絡(luò)設(shè)備、網(wǎng)絡(luò)棧、端口等Linux 2.6.29UserCLONE_NEWUSER用戶和用戶組Linux 3.8下面利用一個簡單程序,剖析使用namespace進(jìn)行資源隔離的方法。代碼如下:執(zhí)行這段c語言代碼會建立了一個namespace,這個namespace的初始化
8、進(jìn)程是bash,用ps命令查看bash對應(yīng)的進(jìn)程號為1。代碼顯示的3591進(jìn)程號是指這個bash進(jìn)程在物理機(jī)系統(tǒng)的進(jìn)程號。從物理機(jī)Linux系統(tǒng)看,執(zhí)行c語言的進(jìn)程號是3590,namespace中bash的進(jìn)程號是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)行了隔離,這個namespace進(jìn)程就形成了一個容器的最小內(nèi)核。如果需要這個容器具有更多的功能模塊,可以在容器的文件系統(tǒng)(對應(yīng)物理
9、機(jī)/home/container以下目錄)創(chuàng)建對應(yīng)shell命令或者應(yīng)用程序。這樣,這個namespace小程序啟動后,系統(tǒng)就會出現(xiàn)一個功能比較豐富的容器環(huán)境。在完整docker實(shí)際運(yùn)行環(huán)境,系統(tǒng)將各種功能代碼封裝到一個鏡像文件中,再采用aufs掛載的方式提供給容器使用。這樣既滿足功能要求,又提升了發(fā)布和遷移的效率。3、LXC的資源配額采用chroot和namespace,系統(tǒng)實(shí)現(xiàn)了對容器的進(jìn)程、主機(jī)名、文件系統(tǒng)、網(wǎng)絡(luò)等資源隔離,但是容器仍然可以沒有限制地使用所有資源。此時,如果物理機(jī)同時運(yùn)行多個容器,就存在搶占資源,導(dǎo)致物理機(jī)癱瘓的風(fēng)險。所以,要實(shí)現(xiàn)一個強(qiáng)壯的容器,就必須對容器使用的資源進(jìn)行
10、配額管理。cgroups 是Linux內(nèi)核提供限制進(jìn)程資源的一種機(jī)制,可以用于對cpu和內(nèi)存等資源的精細(xì)化控制。開發(fā)者利用cgroups可以限制進(jìn)程資源的使用,比如:cgroups可以將應(yīng)用消耗的計算資源限制某幾個CPU、甚至某個CPU的特定比率。Docker也就使用了cgroups來完成cpu和內(nèi)存等部分的資源控制。下面這段C程序,先打印出運(yùn)行進(jìn)程號,接著的死循環(huán)會消耗大量CPU資源。程序運(yùn)行后,進(jìn)程號是13649,結(jié)果如下:再用top命令,查看系統(tǒng)cpu資源情況發(fā)現(xiàn),13649進(jìn)程消耗了一核CPU的99.8%。通過使用cgroups機(jī)制可以限制上述死循環(huán)程序占用CPU資源的上限。具體操作是
11、在“/cgroup/cpu”目錄新建eatcpugroup目錄,并把要控制的cpu上限值30000(表示30%使用上限)和進(jìn)程號13649加入“cpu.cfs_quota_us”和“tasks”這兩個文件。腳本如下:針對13649進(jìn)程cgroup機(jī)制建立后,13649進(jìn)程CPU消耗了下降到30.6%。除對CPU使用率進(jìn)行限制外,cgroup還具有利用memory子系統(tǒng)限制進(jìn)程的內(nèi)存使用量、利用blkio 子系統(tǒng)限制進(jìn)程的塊設(shè)備讀寫、利用devices 子系統(tǒng)控制進(jìn)程能夠訪問的設(shè)備、利用net_cls子系統(tǒng)限制進(jìn)程的網(wǎng)絡(luò)數(shù)據(jù)包、利用ns子系統(tǒng)限制進(jìn)程使用不同 namespace等功能。4、簡易容
12、器實(shí)現(xiàn)接下來的程序?qū)hroot、namespace和cgroups結(jié)合運(yùn)用,就實(shí)現(xiàn)了一個簡單的容器。上述程序運(yùn)行后,就創(chuàng)建一個簡易容器環(huán)境。這個容器的初始化進(jìn)程是bash,后續(xù)所有子進(jìn)程能夠訪問的文件系統(tǒng)控制在物理機(jī)的/home/container目錄映射的根目錄下,同時利用namespace對子進(jìn)程等進(jìn)行了隔離,并通過cgroup對這個進(jìn)程及其所有子進(jìn)程使用cpu資源進(jìn)行了限制。在這個容器的后臺運(yùn)行剛才消耗cpu的應(yīng)用,進(jìn)程1對應(yīng)bash,它的子進(jìn)程2對應(yīng)eatcpu.out這個程序,具體如下圖所示:從物理機(jī)的linux系統(tǒng)看,democontainer的進(jìn)程號為3289、它的子進(jìn)程bash的進(jìn)程號是3293、bash的子進(jìn)程eatcpu的進(jìn)程號是3294,具體如下圖所示:物理機(jī)和容器之間的進(jìn)程映射關(guān)系如下:雖然eatcpu.out程序非常消耗CPU資源,不進(jìn)行限制時很快就會將CPU資源100%消耗,但是由于cgroup對3289號進(jìn)程(democontainer.out)進(jìn)行了CPU使用率40%的限制,那么進(jìn)程
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年計算機(jī)WPS考試知識檔案試題及答案
- 不同文體的創(chuàng)作技巧試題及答案
- 現(xiàn)代漢語與英語對比的文化差異試題及答案
- WPS文件版本控制2025年考試注意事項試題及答案
- 數(shù)據(jù)治理的標(biāo)準(zhǔn)與流程管理試題及答案
- 2025年計算機(jī)一級Msoffice知識體系試題及答案
- 網(wǎng)絡(luò)安全技術(shù)的應(yīng)用場景與方法試題及答案
- 計算機(jī)一級WPS數(shù)據(jù)導(dǎo)入功能試題及答案
- 測試驅(qū)動開發(fā)考試考題及答案
- 掌握法學(xué)概論全知試題及答案
- 六年級數(shù)學(xué)下冊期末試卷及答案【可打印】
- 起重機(jī)械安裝維修質(zhì)量保證手冊-符合TSG 07-2019特種設(shè)備質(zhì)量保證管理體系
- DL∕Z 860.1-2018 電力自動化通信網(wǎng)絡(luò)和系統(tǒng) 第1部分:概論
- 數(shù)字圖像處理-第12章 圖像編碼
- 三會一課制度
- 2022版義務(wù)教育語文課程標(biāo)準(zhǔn)考試測試卷及答案(共三套)
- GB 1499.1-2024鋼筋混凝土用鋼第1部分:熱軋光圓鋼筋
- 藥物相關(guān)血小板減少診療專家共識(2023版)
- 部編版八年級上冊語文第一單元整體教學(xué)設(shè)計
- 康養(yǎng)旅游項目策劃方案畢業(yè)設(shè)計(2篇)
- SMD車間ESD測試報告
評論
0/150
提交評論