




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、Docker容器的原理與實現(xiàn)周成玉【摘要】Linux容器(Linux Container,LXC)是docker的核心技術之一,LXC利用chroot、namespace和cgroup等技術實現(xiàn)資源的隔離和配額,文章剖析了LXC的原理和實現(xiàn)。【關鍵詞】chroot, namespace, cgroup, LXC1、概述海關已經廣泛使用虛擬機技術多年,IT資源利用率得到有效提高。近年來,基于Docker的輕量級虛擬化技術正成為IT技術熱點之一。與傳統(tǒng)虛擬機相比,Docker技術本質上是一種LXC引擎。VM和LXC關注的問題都是資源的隔離和配額,VM采用CPU、memory、disk等硬件虛擬化技
2、術,LCX則借助了chroot、namespace和cgroups等系統(tǒng)調用。2、LXC的資源隔離2.1、chrootchroot(change root directory,更改root目錄),最早在1979年的Unix V7使用,并在各個版本的linux系統(tǒng)中得以保留。在linux系統(tǒng)中,系統(tǒng)默認的目錄結構都是以“/”,即根(root)開始的。通過使用chroot,系統(tǒng)讀取到的目錄和文件將不在是舊系統(tǒng)根下的而是指定的新位置下的目錄結構和文件,這樣帶來兩個好處:(1)增加系統(tǒng)的安全性,限制用戶權力。經過chroot之后,在新根下將訪問不到舊系統(tǒng)的根目錄結構和文件,這樣就增強了系統(tǒng)的安全性。在
3、登錄(login)前使用chroot,阻止用戶訪問特定目錄。(2)建立一個與原系統(tǒng)隔離的系統(tǒng)目錄結構,方便用戶的開發(fā)。使用chroot后,系統(tǒng)讀取的是新根下的目錄和文件,這是一個與原系統(tǒng)根下文件不相關的目錄結構。在這個新的環(huán)境中,可以用來測試軟件的靜態(tài)編譯以及一些與系統(tǒng)不相關的獨立開發(fā)。Docker就是利用chroot功能,實現(xiàn)每個容器里看到的文件系統(tǒng)都是一個完整的linux系統(tǒng)。下面來看一個簡單shell腳本,將某個進程及其子進程訪問根目錄限制在“/home/container”目錄,該進程及其子進程將不能訪問linux系統(tǒng)的其他目錄。先創(chuàng)建目錄/home/container,將bash、l
4、s和pwd三個shell命令及運行這三個命令需要的庫復制到對應目錄。腳本如下:執(zhí)行腳本后,在/home下增加了container文件系統(tǒng),如下圖藍色部分所示:執(zhí)行chroot /home/container /bin/bash后,會啟動一個bash進程,這個進程及其所有子進程對應的根目錄就限制在“/home/container”,且對于它們而言,就認為是自己的根目錄。執(zhí)行命令結果如下:由于進程的根(對應物理機系統(tǒng)的/home/container)下面只有bash、pwd和ls三個命令,子進程不能訪問物理機的其他命令,所以當執(zhí)行clear命令時就會報“command not found”錯。可見
5、,chroot有效地限制了進程訪問操作系統(tǒng)文件系統(tǒng)的權限。2.2、namespaceNamespace是Linux內核功能,用來隔離各種系統(tǒng)資源,比如進程樹、用戶號、網絡接口、掛載點等。當一臺物理機同時運行多個應用時,有些用戶會訪問、修改或關閉他應用的某些資源,這樣就會導致各個應用之間互相干擾。通過使用Namespace,系統(tǒng)就可以做到各種資源隔離。namespace建立系統(tǒng)的不同視圖(可以理解為簡易容器),每個namespace內用戶看起來,像單獨的一臺Linux計算機,有自己的init進程(PID為1),其他進程的PID依次遞增。如圖所示,namespace A和namespace B都有
6、PID為1的init進程,子容器的進程映射到父容器的進程上,父容器可以知道每一個子容器的運行狀態(tài),而子容器與子容器之間是隔離的。圖中,進程3在父命名空間里面PID 為3,但是在namespace A就是1,也就是說namespace A內用戶看到的進程3就像 init 進程一樣,認為這是自己的初始化進程,但是從整個操作系統(tǒng)來看,它只是3號進程虛擬化出來的一個namespace而已。當前Linux一共實現(xiàn)六種不同類型的namespace,分別是mount、UTS、IPC、PID、network、User等的隔離機制。各種類型namespace實現(xiàn)的功能和發(fā)行系統(tǒng)版本關系如下:Namespace系
7、統(tǒng)調用參數(shù)隔離內容內核版本MountCLONE_NEWNS掛載點(文件系統(tǒng))Linux 2.4.19UTSCLONE_NEWUTS主機名與域名Linux 2.6.19IPCCLONE_NEWIPC進程間通信Linux 2.6.19PIDCLONE_NEWPID進程編號Linux 2.6.24NetworkCLONE_NEWNET網絡設備、網絡棧、端口等Linux 2.6.29UserCLONE_NEWUSER用戶和用戶組Linux 3.8下面利用一個簡單程序,剖析使用namespace進行資源隔離的方法。代碼如下:執(zhí)行這段c語言代碼會建立了一個namespace,這個namespace的初始化
8、進程是bash,用ps命令查看bash對應的進程號為1。代碼顯示的3591進程號是指這個bash進程在物理機系統(tǒng)的進程號。從物理機Linux系統(tǒng)看,執(zhí)行c語言的進程號是3590,namespace中bash的進程號是3591。從執(zhí)行結果看,程序對掛載點、主機名和進程等進行namespace隔離。程序運行后,sethostname將主機名修改為container,物理機linux主機名仍然為centos-1;namespace內進程與物理機linux系統(tǒng)之間的進程也進行了隔離,這個namespace進程就形成了一個容器的最小內核。如果需要這個容器具有更多的功能模塊,可以在容器的文件系統(tǒng)(對應物理
9、機/home/container以下目錄)創(chuàng)建對應shell命令或者應用程序。這樣,這個namespace小程序啟動后,系統(tǒng)就會出現(xiàn)一個功能比較豐富的容器環(huán)境。在完整docker實際運行環(huán)境,系統(tǒng)將各種功能代碼封裝到一個鏡像文件中,再采用aufs掛載的方式提供給容器使用。這樣既滿足功能要求,又提升了發(fā)布和遷移的效率。3、LXC的資源配額采用chroot和namespace,系統(tǒng)實現(xiàn)了對容器的進程、主機名、文件系統(tǒng)、網絡等資源隔離,但是容器仍然可以沒有限制地使用所有資源。此時,如果物理機同時運行多個容器,就存在搶占資源,導致物理機癱瘓的風險。所以,要實現(xiàn)一個強壯的容器,就必須對容器使用的資源進行
10、配額管理。cgroups 是Linux內核提供限制進程資源的一種機制,可以用于對cpu和內存等資源的精細化控制。開發(fā)者利用cgroups可以限制進程資源的使用,比如:cgroups可以將應用消耗的計算資源限制某幾個CPU、甚至某個CPU的特定比率。Docker也就使用了cgroups來完成cpu和內存等部分的資源控制。下面這段C程序,先打印出運行進程號,接著的死循環(huán)會消耗大量CPU資源。程序運行后,進程號是13649,結果如下:再用top命令,查看系統(tǒng)cpu資源情況發(fā)現(xiàn),13649進程消耗了一核CPU的99.8%。通過使用cgroups機制可以限制上述死循環(huán)程序占用CPU資源的上限。具體操作是
11、在“/cgroup/cpu”目錄新建eatcpugroup目錄,并把要控制的cpu上限值30000(表示30%使用上限)和進程號13649加入“cpu.cfs_quota_us”和“tasks”這兩個文件。腳本如下:針對13649進程cgroup機制建立后,13649進程CPU消耗了下降到30.6%。除對CPU使用率進行限制外,cgroup還具有利用memory子系統(tǒng)限制進程的內存使用量、利用blkio 子系統(tǒng)限制進程的塊設備讀寫、利用devices 子系統(tǒng)控制進程能夠訪問的設備、利用net_cls子系統(tǒng)限制進程的網絡數(shù)據(jù)包、利用ns子系統(tǒng)限制進程使用不同 namespace等功能。4、簡易容
12、器實現(xiàn)接下來的程序將chroot、namespace和cgroups結合運用,就實現(xiàn)了一個簡單的容器。上述程序運行后,就創(chuàng)建一個簡易容器環(huán)境。這個容器的初始化進程是bash,后續(xù)所有子進程能夠訪問的文件系統(tǒng)控制在物理機的/home/container目錄映射的根目錄下,同時利用namespace對子進程等進行了隔離,并通過cgroup對這個進程及其所有子進程使用cpu資源進行了限制。在這個容器的后臺運行剛才消耗cpu的應用,進程1對應bash,它的子進程2對應eatcpu.out這個程序,具體如下圖所示:從物理機的linux系統(tǒng)看,democontainer的進程號為3289、它的子進程bash的進程號是3293、bash的子進程eatcpu的進程號是3294,具體如下圖所示:物理機和容器之間的進程映射關系如下:雖然eatcpu.out程序非常消耗CPU資源,不進行限制時很快就會將CPU資源100%消耗,但是由于cgroup對3289號進程(democontainer.out)進行了CPU使用率40%的限制,那么進程
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- T/CBMCA 058-2024道路用鋼渣磚
- T/CECS 10396-2024鋁模混凝土用界面處理劑
- 盤扣架租賃合同4篇
- 專業(yè)標準化題庫及答案
- 上海市考編小學數(shù)學試題
- 上海安全b證考試題庫及答案
- 版權登記合同轉讓協(xié)議5篇
- 解除三方協(xié)議范文5篇
- 理論聯(lián)系實際談一談如何維護政治安全?參考答案1
- 民間借貸合同范本(借款人為個人)4篇
- 2025年職業(yè)技能競賽(計算機程序員賽項)參考試題(附答案)
- 合伙人商業(yè)保密協(xié)議書9篇
- 湖北省武漢市2025屆高中畢業(yè)生四月調研考試語文試卷及答案(武漢四調)
- 2025年全國中小學生百科知識競賽題庫及答案(480題)
- 測控技術培訓課件
- 2025年度專業(yè)技術人員繼續(xù)教育公需科目考試題(附答案)
- 2025屆天津市十二區(qū)重點學校高三下學期畢業(yè)聯(lián)考(一)英語試題(含答案)
- 毽球知到智慧樹章節(jié)測試課后答案2024年秋武漢職業(yè)技術學院
- 轉科申請書 醫(yī)院
- 社會工作行政(第三版)課件全套 時立榮 第1-11章 社會服務機構- 社會工作行政的挑戰(zhàn)、變革與數(shù)字化發(fā)展
- 密級內部公開園林企信通項目用戶手冊企業(yè)用戶
評論
0/150
提交評論