云計(jì)算
作者| 阿里巴巴高級開發(fā)工程師 傅偉
創(chuàng)新互聯(lián)公司長期為成百上千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為云浮企業(yè)提供專業(yè)的成都網(wǎng)站建設(shè)、成都網(wǎng)站制作,云浮網(wǎng)站改版等技術(shù)服務(wù)。擁有十載豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。一、容器與鏡像 什么是容器?在介紹容器的具體概念之前,先簡單回顧一下操作系統(tǒng)是如何管理進(jìn)程的。
首先,當(dāng)我們登錄到操作系統(tǒng)之后,可以通過?ps?等操作看到各式各樣的進(jìn)程,這些進(jìn)程包括系統(tǒng)自帶的服務(wù)和用戶的應(yīng)用進(jìn)程。那么,這些進(jìn)程都有什么樣的特點(diǎn)?
第一,這些進(jìn)程可以相互看到、相互通信; 第二,它們使用的是同一個(gè)文件系統(tǒng),可以對同一個(gè)文件進(jìn)行讀寫操作; 第三,這些進(jìn)程會使用相同的系統(tǒng)資源。這樣的三個(gè)特點(diǎn)會帶來什么問題呢?
因?yàn)檫@些進(jìn)程能夠相互看到并且進(jìn)行通信,高級權(quán)限的進(jìn)程可以破壞其他進(jìn)程; 因?yàn)樗鼈兪褂玫氖峭粋€(gè)文件系統(tǒng),因此會帶來兩個(gè)問題:這些進(jìn)程可以對于已有的數(shù)據(jù)進(jìn)行增刪改查,具有高級權(quán)限的進(jìn)程可能會將其他進(jìn)程的數(shù)據(jù)刪除掉,破壞掉其他進(jìn)程的正常運(yùn)行;此外,進(jìn)程與進(jìn)程之間的依賴可能會存在沖突,如此一來就會給運(yùn)維帶來很大的壓力; 因?yàn)檫@些進(jìn)程使用的是同一個(gè)宿主機(jī)的資源,應(yīng)用之間可能會存在資源搶占的問題,當(dāng)一個(gè)應(yīng)用需要消耗大量?CPU?和內(nèi)存資源的時(shí)候,就可能會破壞其他應(yīng)用的運(yùn)行,導(dǎo)致其他應(yīng)用無法正常地提供服務(wù)。針對上述的三個(gè)問題,如何為進(jìn)程提供一個(gè)獨(dú)立的運(yùn)行環(huán)境呢?
針對不同進(jìn)程使用同一個(gè)文件系統(tǒng)所造成的問題而言,Linux?和?Unix?操作系統(tǒng)可以通過?chroot 系統(tǒng)調(diào)用將子目錄變成根目錄,達(dá)到視圖級別的隔離;進(jìn)程在?chroot?的幫助下可以具有獨(dú)立的文件系統(tǒng),對于這樣的文件系統(tǒng)進(jìn)行增刪改查不會影響到其他進(jìn)程; 因?yàn)檫M(jìn)程之間相互可見并且可以相互通信,使用 Namespace?技術(shù)來實(shí)現(xiàn)進(jìn)程在資源的視圖上進(jìn)行隔離。在?chroot?和 Namespace?的幫助下,進(jìn)程就能夠運(yùn)行在一個(gè)獨(dú)立的環(huán)境下了; 但在獨(dú)立的環(huán)境下,進(jìn)程所使用的還是同一個(gè)操作系統(tǒng)的資源,一些進(jìn)程可能會侵蝕掉整個(gè)系統(tǒng)的資源。為了減少進(jìn)程彼此之間的影響,可以通過 Cgroup?來限制其資源使用率,設(shè)置其能夠使用的?CPU?以及內(nèi)存量。那么,應(yīng)該如何定義這樣的進(jìn)程集合呢?
其實(shí),容器就是一個(gè)視圖隔離、資源可限制、獨(dú)立文件系統(tǒng)的進(jìn)程集合。所謂“視圖隔離”就是能夠看到部分進(jìn)程以及具有獨(dú)立的主機(jī)名等;控制資源使用率則是可以對于內(nèi)存大小以及?CPU?使用個(gè)數(shù)等進(jìn)行限制。容器就是一個(gè)進(jìn)程集合,它將系統(tǒng)的其他資源隔離開來,具有自己獨(dú)立的資源視圖。
容器具有一個(gè)獨(dú)立的文件系統(tǒng),因?yàn)槭褂玫氖窍到y(tǒng)的資源,所以在獨(dú)立的文件系統(tǒng)內(nèi)不需要具備內(nèi)核相關(guān)的代碼或者工具,我們只需要提供容器所需的二進(jìn)制文件、配置文件以及依賴即可。只要容器運(yùn)行時(shí)所需的文件集合都能夠具備,那么這個(gè)容器就能夠運(yùn)行起來。
什么是鏡像?綜上所述,我們將這些容器運(yùn)行時(shí)所需要的所有的文件集合稱之為容器鏡像。
那么,一般都是通過什么樣的方式來構(gòu)建鏡像的呢?通常情況下,我們會采用?Dockerfile?來構(gòu)建鏡像,這是因?yàn)?Dockerfile?提供了非常便利的語法糖,能夠幫助我們很好地描述構(gòu)建的每個(gè)步驟。當(dāng)然,每個(gè)構(gòu)建步驟都會對已有的文件系統(tǒng)進(jìn)行操作,這樣就會帶來文件系統(tǒng)內(nèi)容的變化,我們將這些變化稱之為?changeset。當(dāng)我們把構(gòu)建步驟所產(chǎn)生的變化依次作用到一個(gè)空文件夾上,就能夠得到一個(gè)完整的鏡像。
?
changeset?的分層以及復(fù)用特點(diǎn)能夠帶來幾點(diǎn)優(yōu)勢:
如下圖所示的?Dockerfile?適用于描述如何構(gòu)建?golang?應(yīng)用的。
如圖所示:
FROM 行表示以下的構(gòu)建步驟基于什么鏡像進(jìn)行構(gòu)建,正如前面所提到的,鏡像是可以復(fù)用的; WORKDIR 行表示會把接下來的構(gòu)建步驟都在哪一個(gè)相應(yīng)的具體目錄下進(jìn)行,其起到的作用類似于?Shell?里面的?cd; COPY 行表示的是可以將宿主機(jī)上的文件拷貝到容器鏡像內(nèi); RUN 行表示在具體的文件系統(tǒng)內(nèi)執(zhí)行相應(yīng)的動作。當(dāng)我們運(yùn)行完畢之后就可以得到一個(gè)應(yīng)用了; CMD?行表示使用鏡像時(shí)的默認(rèn)程序名字。當(dāng)有了?Dockerfile?之后,就可以通過?docker build?命令構(gòu)建出所需要的應(yīng)用。構(gòu)建出的結(jié)果存儲在本地,一般情況下,鏡像構(gòu)建會在打包機(jī)或者其他的隔離環(huán)境下完成。
那么,這些鏡像如何運(yùn)行在生產(chǎn)環(huán)境或者測試環(huán)境上呢?這時(shí)候就需要一個(gè)中轉(zhuǎn)站或者中心存儲,我們稱之為?docker registry,也就是鏡像倉庫,其負(fù)責(zé)存儲所有產(chǎn)生的鏡像數(shù)據(jù)。我們只需要通過?docker push?就能夠?qū)⒈镜冂R像推動到鏡像倉庫中,這樣一來,就能夠在生產(chǎn)環(huán)境上或者測試環(huán)境上將相應(yīng)的數(shù)據(jù)下載下來并運(yùn)行了。
如何運(yùn)行容器?運(yùn)行一個(gè)容器一般情況下分為三步:
第一步:從鏡像倉庫中將相應(yīng)的鏡像下載下來; 第二步:當(dāng)鏡像下載完成之后就可以通過?docker images?來查看本地鏡像,這里會給出一個(gè)完整的列表,我們可以在列表中選中想要的鏡像; 第三步:當(dāng)選中鏡像之后,就可以通過?docker run?來運(yùn)行這個(gè)鏡像得到想要的容器,當(dāng)然可以通過多次運(yùn)行得到多個(gè)容器。一個(gè)鏡像就相當(dāng)于是一個(gè)模板,一個(gè)容器就像是一個(gè)具體的運(yùn)行實(shí)例,因此鏡像就具有了一次構(gòu)建、到處運(yùn)行的特點(diǎn)。 小結(jié)簡單回顧一下,容器就是和系統(tǒng)其它部分隔離開來的進(jìn)程集合,這里的其他部分包括進(jìn)程、網(wǎng)絡(luò)資源以及文件系統(tǒng)等。而鏡像就是容器所需要的所有文件集合,其具備一次構(gòu)建、到處運(yùn)行的特點(diǎn)。
?
容器是一組具有隔離特性的進(jìn)程集合,在使用?docker run?的時(shí)候會選擇一個(gè)鏡像來提供獨(dú)立的文件系統(tǒng)并指定相應(yīng)的運(yùn)行程序。這里指定的運(yùn)行程序稱之為?initial?進(jìn)程,這個(gè)?initial?進(jìn)程啟動的時(shí)候,容器也會隨之啟動,當(dāng)?initial?進(jìn)程退出的時(shí)候,容器也會隨之退出。
因此,可以認(rèn)為容器的生命周期和?initial?進(jìn)程的生命周期是一致的。當(dāng)然,因?yàn)槿萜鲀?nèi)不只有這樣的一個(gè)?initial?進(jìn)程,initial?進(jìn)程本身也可以產(chǎn)生其他的子進(jìn)程或者通過?docker exec?產(chǎn)生出來的運(yùn)維操作,也屬于?initial?進(jìn)程管理的范圍內(nèi)。當(dāng)?initial?進(jìn)程退出的時(shí)候,所有的子進(jìn)程也會隨之退出,這樣也是為了防止資源的泄漏。
?
但是這樣的做法也會存在一些問題,首先應(yīng)用里面的程序往往是有狀態(tài)的,其可能會產(chǎn)生一些重要的數(shù)據(jù),當(dāng)一個(gè)容器退出被刪除之后,數(shù)據(jù)也就會丟失了,這對于應(yīng)用方而言是不能接受的,所以需要將容器所產(chǎn)生出來的重要數(shù)據(jù)持久化下來。容器能夠直接將數(shù)據(jù)持久化到指定的目錄上,這個(gè)目錄就稱之為數(shù)據(jù)卷。
數(shù)據(jù)卷有一些特點(diǎn),其中非常明顯的就是數(shù)據(jù)卷的生命周期是獨(dú)立于容器的生命周期的,也就是說容器的創(chuàng)建、運(yùn)行、停止、刪除等操作都和數(shù)據(jù)卷沒有任何關(guān)系,因?yàn)樗且粋€(gè)特殊的目錄,是用于幫助容器進(jìn)行持久化的。簡單而言,我們會將數(shù)據(jù)卷掛載到容器內(nèi),這樣一來容器就能夠?qū)?shù)據(jù)寫入到相應(yīng)的目錄里面了,而且容器的退出并不會導(dǎo)致數(shù)據(jù)的丟失。
通常情況下,數(shù)據(jù)卷管理主要有兩種方式:
第一種是通過?bind?的方式,直接將宿主機(jī)的目錄直接掛載到容器內(nèi);這種方式比較簡單,但是會帶來運(yùn)維成本,因?yàn)槠湟蕾囉谒拗鳈C(jī)的目錄,需要對于所有的宿主機(jī)進(jìn)行統(tǒng)一管理。 第二種是將目錄管理交給運(yùn)行引擎。 三、容器項(xiàng)目架構(gòu) moby?容器引擎架構(gòu)moby?是目前最流行的容器管理引擎,moby
daemon?會對上提供有關(guān)于容器、鏡像、網(wǎng)絡(luò)以及?Volume的管理。moby daemon?所依賴的最重要的組件就是?containerd,containerd?是一個(gè)容器運(yùn)行時(shí)管理引擎,其獨(dú)立于?moby daemon?,可以對上提供容器、鏡像的相關(guān)管理。
containerd?底層有?containerd shim?模塊,其類似于一個(gè)守護(hù)進(jìn)程,這樣設(shè)計(jì)的原因有幾點(diǎn):
首先,containerd?需要管理容器生命周期,而容器可能是由不同的容器運(yùn)行時(shí)所創(chuàng)建出來的,因此需要提供一個(gè)靈活的插件化管理。而?shim?就是針對于不同的容器運(yùn)行時(shí)所開發(fā)的,這樣就能夠從?containerd?中脫離出來,通過插件的形式進(jìn)行管理。 其次,因?yàn)?shim 插件化的實(shí)現(xiàn),使其能夠被?containerd?動態(tài)接管。如果不具備這樣的能力,當(dāng)?moby本節(jié)課程只是針對于?moby?進(jìn)行一個(gè)大致的介紹,在后續(xù)的課程也會詳細(xì)介紹。
?
VM?利用?Hypervisor?虛擬化技術(shù)來模擬?CPU、內(nèi)存等硬件資源,這樣就可以在宿主機(jī)上建立一個(gè)?Guest OS,這是常說的安裝一個(gè)虛擬機(jī)。
每一個(gè)?Guest OS?都有一個(gè)獨(dú)立的內(nèi)核,比如?Ubuntu、CentOS?甚至是?Windows?等,在這樣的?Guest OS?之下,每個(gè)應(yīng)用都是相互獨(dú)立的,VM?可以提供一個(gè)更好的隔離效果。但這樣的隔離效果需要付出一定的代價(jià),因?yàn)樾枰岩徊糠值挠?jì)算資源交給虛擬化,這樣就很難充分利用現(xiàn)有的計(jì)算資源,并且每個(gè)?Guest OS?都需要占用大量的磁盤空間,比如?Windows?操作系統(tǒng)的安裝需要?10~30G?的磁盤空間,Ubuntu?也需要?5~6G,同時(shí)這樣的方式啟動很慢。正是因?yàn)樘摂M機(jī)技術(shù)的缺點(diǎn),催生出了容器技術(shù)。
?
容器是針對于進(jìn)程而言的,因此無需?Guest OS,只需要一個(gè)獨(dú)立的文件系統(tǒng)提供其所需要文件集合即可。所有的文件隔離都是進(jìn)程級別的,因此啟動時(shí)間快于?VM,并且所需的磁盤空間也小于?VM。當(dāng)然了,進(jìn)程級別的隔離并沒有想象中的那么好,隔離效果相比?VM?要差很多。
總體而言,容器和?VM?相比,各有優(yōu)劣,因此容器技術(shù)也在向著強(qiáng)隔離方向發(fā)展。
?
名稱欄目:8分鐘入門K8s|詳解容器基本概念
網(wǎng)頁鏈接:http://jinyejixie.com/article28/cjdcjp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、軟件開發(fā)、外貿(mào)建站、外貿(mào)網(wǎng)站建設(shè)、建站公司、品牌網(wǎng)站設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)