數(shù)十年專注企業(yè)數(shù)字化轉(zhuǎn)型、智能化升級(jí)、企業(yè)上云解決方案服務(wù)商
工單提交 實(shí)名認(rèn)證 騰佑科技咨詢熱線咨詢熱線: 400-996-8756
百度云服務(wù)中心騰佑科技公司
云服務(wù)器活動(dòng) 服務(wù)器租用 服務(wù)器托管 機(jī)柜租賃 帶寬租賃
  • 最新資訊
  • 熱門資訊
  • 最熱資訊
智能建站

微服務(wù)架構(gòu)之「 容器技術(shù) 」

發(fā)布時(shí)間:2022-06-28 作者:admin

簡(jiǎn)述:現(xiàn)在一聊到容器技術(shù),大家就默認(rèn)是指 docker 了。但事實(shí)上,在 Docker 出現(xiàn)之前,PaaS社區(qū)早就有容器技術(shù)了,以 Cloud Foundry、OpenShift 為代表的就是當(dāng)時(shí)的主流。那為啥最終還是 Docker 火起來(lái)了呢?因?yàn)閭鹘y(tǒng)的PaaS技術(shù)雖然也可以一鍵將本地應(yīng)用部署到云上,并

現(xiàn)在一聊到容器技術(shù),大家就默認(rèn)是指 docker 了。但事實(shí)上,在 Docker 出現(xiàn)之前,PaaS社區(qū)早就有容器技術(shù)了,以 Cloud Foundry、OpenShift 為代表的就是當(dāng)時(shí)的主流。

那為啥最終還是 Docker 火起來(lái)了呢?

因?yàn)閭鹘y(tǒng)的PaaS技術(shù)雖然也可以一鍵將本地應(yīng)用部署到云上,并且也是采用隔離環(huán)境(容器)的形式去部署,但是其兼容性非常的不好。因?yàn)槠渲饕砭褪菍⒈镜貞?yīng)用程序和啟停腳本一同打包,然后上傳到云服務(wù)器上,然后再在云服務(wù)器里通過(guò)腳本啟動(dòng)這個(gè)應(yīng)用程序。

這樣的做法,看起來(lái)很理想。但是在實(shí)際情況下,由于本地與云端的環(huán)境差異,導(dǎo)致上傳到云端的應(yīng)用經(jīng)常各種報(bào)錯(cuò)、運(yùn)行不起來(lái),需要各種修改配置和參數(shù)來(lái)做兼容。甚至在項(xiàng)目迭代過(guò)程中不同的版本代碼都需要重新去做適配,非常耗費(fèi)精力。

然而 Docker 卻通過(guò)一個(gè)小創(chuàng)新完美的解決了這個(gè)問(wèn)題。在 Docker 的方案中,它不僅打包了本地應(yīng)用程序,而且還將本地環(huán)境(操作系統(tǒng)的一部分)也打包了,組成一個(gè)叫做「 Docker鏡像 」的文件包。所以這個(gè)「 Docker鏡像 」就包含了應(yīng)用運(yùn)行所需的全部依賴,我們可以直接基于這個(gè)「 Docker鏡像 」在本地進(jìn)行開(kāi)發(fā)與測(cè)試,完成之后,再直接將這個(gè)「 Docker鏡像 」一鍵上傳到云端運(yùn)行即可。

Docker 實(shí)現(xiàn)了本地與云端的環(huán)境完全一致,做到了真正的一次開(kāi)發(fā)隨處運(yùn)行。

一、容器到底是什么?

容器到底是什么呢?也許對(duì)于容器不太了解,但我們對(duì)虛擬機(jī)熟悉啊,那么我們就先來(lái)看一下容器與虛擬機(jī)的對(duì)比區(qū)別:

上圖的左側(cè)是虛擬機(jī)的原理,右側(cè)是docker容器的原理。

虛擬機(jī)是在宿主機(jī)上基于 Hypervisor 軟件虛擬出一套操作系統(tǒng)所需的硬件設(shè)備,再在這些虛擬硬件上安裝操作系統(tǒng) Guest OS,然后不同的應(yīng)用程序就可以運(yùn)行在不同的 Guest OS 上,應(yīng)用之間也就相互獨(dú)立、資源隔離了,但是由于需要 Hypervisor 來(lái)創(chuàng)建虛擬機(jī),且每個(gè)虛擬機(jī)里需要完整的運(yùn)行一套操作系統(tǒng) Guest OS,因此這個(gè)方式會(huì)帶來(lái)很多額外資源的開(kāi)銷。

而 Docker容器 中卻沒(méi)有 Hypervisor 這一層,雖然它需要在宿主機(jī)中運(yùn)行 Docker Engine,但它的原理卻完全不同于 Hypervisor,它并沒(méi)有虛擬出硬件設(shè)備,更沒(méi)有獨(dú)立部署全套的操作系統(tǒng) Guest OS。

Docker容器沒(méi)有那么復(fù)雜的實(shí)現(xiàn)原理,它其實(shí)就是一個(gè)普通進(jìn)程而已,只不過(guò)它是一種經(jīng)過(guò)特殊處理過(guò)的普通進(jìn)程。

我們啟動(dòng)容器的時(shí)候(docker run …),Docker Engine 只不過(guò)是啟動(dòng)了一個(gè)進(jìn)程,這個(gè)進(jìn)程就運(yùn)行著我們?nèi)萜骼锏膽?yīng)用。但 Docker Engine 對(duì)這個(gè)進(jìn)程做了一些特殊處理,通過(guò)這些特殊處理之后,這個(gè)進(jìn)程所看到的外部環(huán)境就不再是宿主機(jī)的那個(gè)環(huán)境了(它看不到宿主機(jī)中的其它進(jìn)程了,以為自己是當(dāng)前操作系統(tǒng)唯一一個(gè)進(jìn)程),并且 Docker Engine 還對(duì)這個(gè)進(jìn)程所使用得資源進(jìn)行了限制,防止它對(duì)宿主機(jī)資源的無(wú)限使用。

那 Docker Engine 具體是做了哪些特殊處理才有這么神奇的效果呢?

二、容器是如何做到資源隔離和限制的?

Docker容器對(duì)這個(gè)進(jìn)程的隔離主要采用2個(gè)技術(shù)點(diǎn):

Namespace 技術(shù)Cgroups 技術(shù)

弄清楚了這兩個(gè)技術(shù)點(diǎn)對(duì)理解容器的原理非常重要,它們是容器技術(shù)的核心。

下面來(lái)詳細(xì)解釋一下:

Namespace 技術(shù)

Namespace 并不是一個(gè)什么新技術(shù),它是Linux操作系統(tǒng)默認(rèn)提供的API,包括 PID Namespace、Mount Namespace、IPC Namespace、Network Namespace等等。

以 PID Namespace 舉例,它的功能是可以讓我們?cè)趧?chuàng)建進(jìn)程的時(shí)候,告訴Linux系統(tǒng),我們要?jiǎng)?chuàng)建的進(jìn)程需要一個(gè)新的獨(dú)立的進(jìn)程空間,并且這個(gè)進(jìn)程在這個(gè)新的進(jìn)程空間里的PID=1,也就是說(shuō)這個(gè)進(jìn)程只看得到這個(gè)新進(jìn)程空間里的東西,看不到外面宿主機(jī)環(huán)境里的東西,也看不到其它進(jìn)程(不過(guò)這只是一個(gè)虛擬空間,事實(shí)上這個(gè)進(jìn)程在宿主機(jī)里PID該是啥還是啥,沒(méi)有變化,只不過(guò)在這個(gè)進(jìn)程空間里,該進(jìn)程以為自己的PID=1)。

打個(gè)比方,就像是一個(gè)班級(jí),每個(gè)人在這個(gè)班里都有一個(gè)編號(hào),班里有90人,然后來(lái)了一位新同學(xué),那他在班里的編號(hào)就是91,可是老師為了給這位同學(xué)特別照顧,所以在班里開(kāi)辟了一塊獨(dú)立的看不到外面的小隔間,并告訴這個(gè)同學(xué)他的編號(hào)是1,由于這位同學(xué)在這個(gè)小空間里隔離著,所以他真的以為自己就是班上的第一位同學(xué)且編號(hào)為1,當(dāng)然了,事實(shí)上這位同學(xué)在班上的編號(hào)依然是91。

另外,Network Namespace 的技術(shù)原理也是類似的,讓這個(gè)進(jìn)程只能看到當(dāng)前Namespace空間里的網(wǎng)絡(luò)設(shè)備,看不到宿主機(jī)真實(shí)情況。同理,其它 Mount、IPC等 Namespace 也是這樣。

Namespace 技術(shù)其實(shí)就是修改了應(yīng)用進(jìn)程的視覺(jué)范圍,但應(yīng)用進(jìn)程的本質(zhì)卻沒(méi)有變化。

不過(guò),Docker容器里雖然帶有一部分操作系統(tǒng)(文件系統(tǒng)相關(guān)),但它并沒(méi)有內(nèi)核,因此多個(gè)容器之間是共用宿主機(jī)的操作系統(tǒng)內(nèi)核的。這一點(diǎn)與虛擬機(jī)的原理是完全不一樣的。

Cgroups 技術(shù)

Cgroup 全稱是 Control Group,其功能就是限制進(jìn)程組所使用的最大資源(這些資源可以是 CPU、內(nèi)存、磁盤等等)。

既然 Namespace 技術(shù) 只能改變一下進(jìn)程組的視覺(jué)范圍,并不能真實(shí)的對(duì)資源做出限制。那么為了防止容器(進(jìn)程)之間互相搶資源,甚至某個(gè)容器把宿主機(jī)資源全部用完導(dǎo)致其它容器也宕掉的情況發(fā)生。因此,必須采用 Cgroup 技術(shù)對(duì)容器的資源進(jìn)行限制。

Cgroup 技術(shù)也是Linux默認(rèn)提供的功能,在Linux系統(tǒng)的 /sys/fs/cgroup 下面有一些子目錄 cpu、memory等,Cgroup技術(shù)提供的功能就是可以基于這些目錄實(shí)現(xiàn)對(duì)這些資源進(jìn)行限制。

例如:在 /sys/fs/cgroup/cpu 下面創(chuàng)建一個(gè) dockerContainer 子目錄,系統(tǒng)就會(huì)自動(dòng)在這個(gè)新建的目錄下面生成一些配置文件,這些配置文件就是用來(lái)控制資源使用量的。例如可以在這些配置文件里面設(shè)置某個(gè)進(jìn)程ID對(duì)CPU的最大使用率。

Cgroup 對(duì)其它內(nèi)存、磁盤等資源也是采用同樣原理做限制。

三、容器的鏡像是什么?

一個(gè)基礎(chǔ)的容器鏡像其實(shí)就是一個(gè) rootfs,它包含操作系統(tǒng)的文件系統(tǒng)(文件和目錄),但并不包含操作系統(tǒng)的內(nèi)核。

rootfs 是在容器里根目錄上掛載的一個(gè)全新的文件系統(tǒng),此文件系統(tǒng)與宿主機(jī)的文件系統(tǒng)無(wú)關(guān),是一個(gè)完全獨(dú)立的,用于給容器進(jìn)行提供環(huán)境的文件系統(tǒng)。

對(duì)于一個(gè)Docker容器而言,需要基于 pivot_root 指令,將容器內(nèi)的系統(tǒng)根目錄切換到rootfs上,這樣,有了這個(gè) rootfs,容器就能夠?yàn)檫M(jìn)程構(gòu)建出一個(gè)完整的文件系統(tǒng),且實(shí)現(xiàn)了與宿主機(jī)的環(huán)境隔離,也正是有了rootfs,才能實(shí)現(xiàn)基于容器的本地應(yīng)用與云端應(yīng)用運(yùn)行環(huán)境的一致。

另外,為了方便鏡像的復(fù)用,Docker 在鏡像中引入了層(Layer)的概念,可以將不同的鏡像一層一層的迭在一起。這樣,如果我們要做一個(gè)新的鏡像,就可以基于之前已經(jīng)做好的某個(gè)鏡像的基礎(chǔ)上繼續(xù)做。

如上圖,這個(gè)例子中最底層是操作系統(tǒng)引導(dǎo),往上一層就是基礎(chǔ)鏡像層(Linux的文件系統(tǒng)),再往上就是我們需要的各種應(yīng)用鏡像,Docker 會(huì)把這些鏡像聯(lián)合掛載在一個(gè)掛載點(diǎn)上,這些鏡像層都是只讀的。只有最上面的容器層是可讀可寫(xiě)的。

這種分層的方案其實(shí)是基于 聯(lián)合文件系統(tǒng)UnionFS(Union File System)的技術(shù)實(shí)現(xiàn)的。它可以將不同的目錄全部掛載在同一個(gè)目錄下。舉個(gè)例子,假如有文件夾 test1 和 test2 ,這兩個(gè)文件夾里面的文件 有相同的,也有不同的。然后我們可以采用聯(lián)合掛載的方式,將這兩個(gè)文件夾掛載到 test3 上,那么 test3 目錄里就有了 test1 和 test2 的所有文件(相同的文件有去重,不同的文件都保留)。

這個(gè)原理應(yīng)用在Docker鏡像中,比如有2個(gè)同學(xué),同學(xué)A已經(jīng)做好了一個(gè)基于Linux的Java環(huán)境的鏡像,同學(xué)S想搭建一個(gè)Java Web環(huán)境,那么他就不必再去做Java環(huán)境的鏡像了,可以直接基于同學(xué)A的鏡像在上面增加Tomcat后生成新鏡像即可。

以上,就是對(duì)微服務(wù)架構(gòu)之「 容器技術(shù) 」的一些思考。

點(diǎn)擊展開(kāi)全文

騰佑科技(www.mubashirfilms.com)成立于2009年,總部位于河南鄭州,是一家集互聯(lián)網(wǎng)基礎(chǔ)設(shè)施及軟硬件于一體化的高新技術(shù)企業(yè),具有IDC/ISP/ICP/云牌照、雙軟等資質(zhì),并擁有多個(gè)國(guó)家版權(quán)局認(rèn)證。公司自成立以來(lái),一直致力于發(fā)展互聯(lián)網(wǎng)IDC數(shù)據(jù)中心DataCenter、云計(jì)算Cloud、大數(shù)據(jù)BigDate、人工智能AI、內(nèi)容加速CDN、互聯(lián)網(wǎng)安全、軟件定制開(kāi)發(fā)等產(chǎn)品服務(wù)及行業(yè)客戶技術(shù)一體化智能解決方案;2018年成為百度智能云AI河南服務(wù)中心。

售前咨詢熱線:400-996-8756

備案提交:0371-89913068

售后客服:0371-89913000

熱門活動(dòng)

百度云服務(wù)中心
  • 熱門資訊
  • 隨便看看