溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

怎么理解Linux容器

發(fā)布時(shí)間:2021-11-05 16:38:52 來(lái)源:億速云 閱讀:147 作者:iii 欄目:web開(kāi)發(fā)

這篇文章主要介紹“怎么理解Linux容器”,在日常操作中,相信很多人在怎么理解Linux容器問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”怎么理解Linux容器”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

Linux 容器

這篇文章著重來(lái)講一下 Linux 容器,為什么強(qiáng)調(diào) Linux 容器,而不是 Docker ,是因?yàn)?Docker  是基于虛擬化技術(shù)來(lái)實(shí)現(xiàn)的,但是這篇文章涉及到 Linux 容器的核心實(shí)現(xiàn)方面,兩者不同,所以著重強(qiáng)調(diào)一下。

容器其實(shí)是一種沙盒技術(shù)。顧名思義,沙盒就是能夠像一個(gè)集裝箱一樣,把你的應(yīng)用裝起來(lái)。這樣,應(yīng)用與應(yīng)用之間就有了邊界而不會(huì)相互干擾;同時(shí)裝在沙盒里面的應(yīng)用,也可以很方便的被搬來(lái)搬去,這也是  PaaS 想要的最理想的狀態(tài)。但是說(shuō)起來(lái)容易,等到真正實(shí)現(xiàn)起來(lái)的時(shí)候,就會(huì)有難度。因?yàn)槿萜魇沁\(yùn)行在宿主機(jī)上面的,當(dāng)它運(yùn)行起來(lái)的時(shí)候,需要加載到內(nèi)存中,需要  CPU 完成加法操作等等。也就是說(shuō),如果想要實(shí)現(xiàn)真正意義上的容器,就要解決容器和宿主機(jī)真正隔離這樣的問(wèn)題,但現(xiàn)實(shí)中這樣的問(wèn)題還沒(méi)辦法解決。

既然問(wèn)題還沒(méi)解決,那么我們所說(shuō)的容器,是在說(shuō)什么?容器的核心功能又什么?

容器核心功能

在上面已經(jīng)說(shuō)過(guò),容器其實(shí)是一種沙盒技術(shù),應(yīng)用和應(yīng)用之間有“邊界”。所以容器的核心功能,就是通過(guò)約束和修改進(jìn)程的動(dòng)態(tài)表現(xiàn),從而創(chuàng)造出一個(gè)"邊界"。

這個(gè)官方語(yǔ)言可能會(huì)有點(diǎn)兒難懂,咱們換個(gè)說(shuō)法。容器用英語(yǔ)來(lái)說(shuō)就是 Container ,而 Container  的另一個(gè)意思是集裝箱。提到集裝箱的時(shí)候,你的腦海里第一反應(yīng)是不是大船??吭诎哆?,然后好多整齊劃一的箱子可以運(yùn)來(lái)運(yùn)去。為什么這些集裝箱可以很方便的運(yùn)來(lái)運(yùn)去呢?因?yàn)樗鼈兇笮∫恢?,而且是箱子,?duì)吧?所以當(dāng)我們使用  Container 來(lái)形容容器的時(shí)候,就是我們想要讓容器達(dá)到一個(gè)可以打包,符合標(biāo)準(zhǔn)的狀態(tài)。

基于以上,我覺(jué)得咱們可以達(dá)成一個(gè)共識(shí),就是如果想要讓容器幫助我們達(dá)到一個(gè)可以打包,符合標(biāo)準(zhǔn)的狀態(tài)的話(huà),首先要解決的是什么問(wèn)題?就是將容器和容器之間隔離出來(lái),這樣我才能對(duì)這個(gè)容器統(tǒng)一做一個(gè)操作,對(duì)不對(duì)。對(duì)于  Docker 等大多數(shù) Linux 容器來(lái)說(shuō),做到讓容器和容器之間隔離,主要是兩種技術(shù):一種是看起來(lái)是隔離了的技術(shù):Namespace  技術(shù),它是用來(lái)修改進(jìn)程視圖的主要方法,也就是說(shuō)每個(gè) namespace 中的應(yīng)用看到的是不同的 IP  地址、用戶(hù)空間等;一種是用起來(lái)是隔離了的技術(shù):Cgroups 技術(shù),它是用來(lái)制造約束的主要手段,也就是說(shuō),我這臺(tái)服務(wù)器總共有 8G  的內(nèi)存,都給這一個(gè)應(yīng)用的話(huà),其他的應(yīng)用怎么跑起來(lái)呢?所以 Cgroups 技術(shù)就是對(duì)容器來(lái)做一個(gè)限制。

Namespace

Namespace  就是命名空間的意思,如果編程使用的是,面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言,那對(duì)于這個(gè)詞應(yīng)該不是很陌生。一個(gè)團(tuán)隊(duì)在一起寫(xiě)代碼,難免會(huì)有相同的類(lèi),此時(shí)編譯就會(huì)沖突。如果每個(gè)功能都有自己的命名空間,那在不同的空間里面就算類(lèi)名相同,也不會(huì)有啥沖突。寫(xiě)程序如此,在  Linux 上跑程序也是如此。當(dāng)我們?cè)谝慌_(tái) Linux 上跑多個(gè)進(jìn)程時(shí),進(jìn)程有全局的進(jìn)程 ID  ,網(wǎng)絡(luò)也有全局的路由表。如果多個(gè)進(jìn)程使用不同的路由策略,可能會(huì)導(dǎo)致這些進(jìn)程沖突,解決辦法也很簡(jiǎn)單,將這些進(jìn)程放在一個(gè)獨(dú)立的 namespace  里面就可以了嘛。

說(shuō)是這樣說(shuō),但是有一點(diǎn)我希望你能明確知道,進(jìn)程在靜態(tài)狀態(tài)下就是程序,它只是磁盤(pán)上的二進(jìn)制文件罷了。只有當(dāng)它運(yùn)行起來(lái)時(shí),才成為進(jìn)程。所以,當(dāng)我們開(kāi)始運(yùn)行程序時(shí),操作系統(tǒng)都會(huì)為進(jìn)程分配一個(gè)進(jìn)程編號(hào),這個(gè)編號(hào)就是進(jìn)程的唯一標(biāo)識(shí)。假設(shè)我們開(kāi)始運(yùn)行了一個(gè)程序,它的  PID=100 。也就是說(shuō)這個(gè)程序是第 100 個(gè)進(jìn)程,在它前面還有 99 個(gè)進(jìn)程。而現(xiàn)在,如果我們通過(guò) Docker 把這個(gè)程序運(yùn)行在一個(gè)容器當(dāng)中,那么  Docker 就會(huì)在第 100 個(gè)進(jìn)程創(chuàng)建時(shí),給它施一個(gè)"障眼法",讓它永遠(yuǎn)看不到其他 99 個(gè)進(jìn)程,這樣這個(gè)程序就會(huì)誤以為自己是第 1 個(gè)進(jìn)程  這種機(jī)制,其實(shí)就是對(duì)被隔離應(yīng)用的進(jìn)程空間做了手腳,使得這些進(jìn)程只能看到重新計(jì)算過(guò)的進(jìn)程編號(hào),比如上面的第 100 個(gè)進(jìn)程,經(jīng)過(guò) Docker  的"障眼法"之后,誤以為自己是第 1 個(gè)進(jìn)程,但是實(shí)際上在宿主機(jī)的操作系統(tǒng)中,它還是原來(lái)的第 100 個(gè)進(jìn)程。

容器限制( Cgroups )

Linux Cgroups 的全稱(chēng)是 Linux Control Group 。它最主要的作用,就是限制一個(gè)進(jìn)程組能夠使用的資源上限,包括 CPU  ,內(nèi)存,磁盤(pán),網(wǎng)絡(luò)帶寬等。特別簡(jiǎn)單的一句話(huà)就是,你的電腦只有 8G 內(nèi)存,你會(huì)允許一個(gè)進(jìn)程占用你的內(nèi)存到 7G  嘛?一般情況下應(yīng)該是不會(huì)吧,那樣的話(huà),做其他事情不都卡的要死嘛,對(duì)不對(duì)。所以在 Linux 中,提供了一種技術(shù),來(lái)控制進(jìn)程組所能使用的資源。Cgroups  的有很多子系統(tǒng),每一項(xiàng)子系統(tǒng)都有自己獨(dú)有的資源限制能力,比如:

  • blkio :為塊設(shè)備設(shè)定 I/O 限制,一般用于磁盤(pán)等設(shè)備;

  • cpuset :為進(jìn)程分配單獨(dú)的 CPU 核和對(duì)應(yīng)的內(nèi)存節(jié)點(diǎn);

  • memory :為進(jìn)程設(shè)定內(nèi)存使用的限制;

  • cpu :使用調(diào)用程序?yàn)檫M(jìn)程控制 CPU 的訪問(wèn);Linux Cgroups 的設(shè)計(jì)還是比較易用的,它就是一個(gè)子系統(tǒng)目錄加上一組資源限制文件的組合。對(duì)于  Docker 等 Linux 容器項(xiàng)目來(lái)說(shuō),它們只需要在每個(gè)子系統(tǒng)下面,為每個(gè)容器創(chuàng)建一個(gè)控制組(即創(chuàng)建一個(gè)新目錄),然后在啟動(dòng)容器進(jìn)程之后,把這個(gè)進(jìn)程的  PID 填寫(xiě)到對(duì)應(yīng)控制組的 tasks 文件中就可以了。至于在這些控制組下面的資源文件里填什么值,那就交給用戶(hù)執(zhí)行 docker run  時(shí)的參數(shù)來(lái)指定了。

經(jīng)過(guò)以上分析,我們可以了解到,容器這個(gè)聽(tīng)起來(lái)玄而又玄的概念,實(shí)際上它就是操作系統(tǒng)上的一種特殊的進(jìn)程而已。所以,容器本身并沒(méi)有價(jià)值,有價(jià)值的是"容器編排"。當(dāng)我們?cè)谡勅萜鞯臅r(shí)候,其實(shí)我們?cè)谡勅绾胃玫娜ゾ幣湃萜鳌_@也是為什么當(dāng)下  k8s 這么火的原因。

容器與虛擬機(jī)異同

看到這里,你會(huì)不會(huì)有疑問(wèn),容器和虛擬機(jī)之間有什么不同呢?你可能看到過(guò)下面這個(gè)圖片:

怎么理解Linux容器

在這張圖的左邊,畫(huà)出了虛擬機(jī)的工作原理,其中 Hypervisor 的軟件是虛擬機(jī)主要部分,它通過(guò)硬件虛擬化功能,將主機(jī)的 cpu ,內(nèi)存, I/O  設(shè)備等虛擬出來(lái),在這些虛擬的硬件上,安裝了一個(gè)新的操作系統(tǒng),也就是圖中的 GuestOS 。此時(shí),用戶(hù)的應(yīng)用進(jìn)程就可以運(yùn)行在這個(gè)虛擬的機(jī)器中,它能看到的也就只有  GuestOS 的文件和目錄,使用的也是這個(gè)機(jī)器里面的虛擬設(shè)備。這就是為什么虛擬機(jī)能夠?qū)⒉煌膽?yīng)用進(jìn)程相互隔離,因?yàn)樗鼈兯诘南到y(tǒng)本來(lái)就不是同一個(gè)系統(tǒng)。

這張圖的右邊則是容器,它只由應(yīng)用程序本身和它的環(huán)境依賴(lài)(庫(kù)和其他應(yīng)用程序)兩部分組成,并且是直接在宿主機(jī)上運(yùn)行的。當(dāng)你想要啟動(dòng)容器的時(shí)候,根本不需要啟動(dòng)整個(gè)操作系統(tǒng),因?yàn)樗緛?lái)就是在這個(gè)操作系統(tǒng)上的。而且,因?yàn)槿萜髦苯釉谒拗鳈C(jī)上,所有容器都共享這個(gè)底層操作系統(tǒng),沒(méi)有另外新裝操作系統(tǒng),這就使得容器不管是在體積上,還是啟動(dòng)速度方面,都會(huì)更快,開(kāi)銷(xiāo)更小,也更加容易遷移。

還記得講容器的時(shí)候,介紹的 Namespace  技術(shù)嘛,虛擬機(jī)是真實(shí)存在的,你可以直接在自己的電腦上創(chuàng)建一個(gè),但是容器不一樣,它沒(méi)有一個(gè)真正的“容器”運(yùn)行在宿主機(jī)里面, Docker  項(xiàng)目幫助用戶(hù)啟動(dòng)的,還是原來(lái)的應(yīng)用進(jìn)程,只是在創(chuàng)建這些進(jìn)程時(shí),加上了 Namespace 參數(shù)罷了,但是對(duì)于宿主機(jī)來(lái)說(shuō),本質(zhì)還是進(jìn)程罷了。

到此,關(guān)于“怎么理解Linux容器”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI