您好,登錄后才能下訂單哦!
作者| 阿里巴巴高級開發(fā)工程師 傅偉
在介紹容器的具體概念之前,先簡單回顧一下操作系統(tǒng)是如何管理進程的。
首先,當(dāng)我們登錄到操作系統(tǒng)之后,可以通過?ps?等操作看到各式各樣的進程,這些進程包括系統(tǒng)自帶的服務(wù)和用戶的應(yīng)用進程。那么,這些進程都有什么樣的特點?
這樣的三個特點會帶來什么問題呢?
針對上述的三個問題,如何為進程提供一個獨立的運行環(huán)境呢?
那么,應(yīng)該如何定義這樣的進程集合呢?
其實,容器就是一個視圖隔離、資源可限制、獨立文件系統(tǒng)的進程集合。所謂“視圖隔離”就是能夠看到部分進程以及具有獨立的主機名等;控制資源使用率則是可以對于內(nèi)存大小以及?CPU?使用個數(shù)等進行限制。容器就是一個進程集合,它將系統(tǒng)的其他資源隔離開來,具有自己獨立的資源視圖。
容器具有一個獨立的文件系統(tǒng),因為使用的是系統(tǒng)的資源,所以在獨立的文件系統(tǒng)內(nèi)不需要具備內(nèi)核相關(guān)的代碼或者工具,我們只需要提供容器所需的二進制文件、配置文件以及依賴即可。只要容器運行時所需的文件集合都能夠具備,那么這個容器就能夠運行起來。
綜上所述,我們將這些容器運行時所需要的所有的文件集合稱之為容器鏡像。
那么,一般都是通過什么樣的方式來構(gòu)建鏡像的呢?通常情況下,我們會采用?Dockerfile?來構(gòu)建鏡像,這是因為?Dockerfile?提供了非常便利的語法糖,能夠幫助我們很好地描述構(gòu)建的每個步驟。當(dāng)然,每個構(gòu)建步驟都會對已有的文件系統(tǒng)進行操作,這樣就會帶來文件系統(tǒng)內(nèi)容的變化,我們將這些變化稱之為?changeset。當(dāng)我們把構(gòu)建步驟所產(chǎn)生的變化依次作用到一個空文件夾上,就能夠得到一個完整的鏡像。
?
changeset?的分層以及復(fù)用特點能夠帶來幾點優(yōu)勢:
如下圖所示的?Dockerfile?適用于描述如何構(gòu)建?golang?應(yīng)用的。
如圖所示:
當(dāng)有了?Dockerfile?之后,就可以通過?docker build?命令構(gòu)建出所需要的應(yīng)用。構(gòu)建出的結(jié)果存儲在本地,一般情況下,鏡像構(gòu)建會在打包機或者其他的隔離環(huán)境下完成。
那么,這些鏡像如何運行在生產(chǎn)環(huán)境或者測試環(huán)境上呢?這時候就需要一個中轉(zhuǎn)站或者中心存儲,我們稱之為?docker registry,也就是鏡像倉庫,其負責(zé)存儲所有產(chǎn)生的鏡像數(shù)據(jù)。我們只需要通過?docker push?就能夠?qū)⒈镜冂R像推動到鏡像倉庫中,這樣一來,就能夠在生產(chǎn)環(huán)境上或者測試環(huán)境上將相應(yīng)的數(shù)據(jù)下載下來并運行了。
運行一個容器一般情況下分為三步:
簡單回顧一下,容器就是和系統(tǒng)其它部分隔離開來的進程集合,這里的其他部分包括進程、網(wǎng)絡(luò)資源以及文件系統(tǒng)等。而鏡像就是容器所需要的所有文件集合,其具備一次構(gòu)建、到處運行的特點。
?
容器是一組具有隔離特性的進程集合,在使用?docker run?的時候會選擇一個鏡像來提供獨立的文件系統(tǒng)并指定相應(yīng)的運行程序。這里指定的運行程序稱之為?initial?進程,這個?initial?進程啟動的時候,容器也會隨之啟動,當(dāng)?initial?進程退出的時候,容器也會隨之退出。
因此,可以認(rèn)為容器的生命周期和?initial?進程的生命周期是一致的。當(dāng)然,因為容器內(nèi)不只有這樣的一個?initial?進程,initial?進程本身也可以產(chǎn)生其他的子進程或者通過?docker exec?產(chǎn)生出來的運維操作,也屬于?initial?進程管理的范圍內(nèi)。當(dāng)?initial?進程退出的時候,所有的子進程也會隨之退出,這樣也是為了防止資源的泄漏。
?
但是這樣的做法也會存在一些問題,首先應(yīng)用里面的程序往往是有狀態(tài)的,其可能會產(chǎn)生一些重要的數(shù)據(jù),當(dāng)一個容器退出被刪除之后,數(shù)據(jù)也就會丟失了,這對于應(yīng)用方而言是不能接受的,所以需要將容器所產(chǎn)生出來的重要數(shù)據(jù)持久化下來。容器能夠直接將數(shù)據(jù)持久化到指定的目錄上,這個目錄就稱之為數(shù)據(jù)卷。
數(shù)據(jù)卷有一些特點,其中非常明顯的就是數(shù)據(jù)卷的生命周期是獨立于容器的生命周期的,也就是說容器的創(chuàng)建、運行、停止、刪除等操作都和數(shù)據(jù)卷沒有任何關(guān)系,因為它是一個特殊的目錄,是用于幫助容器進行持久化的。簡單而言,我們會將數(shù)據(jù)卷掛載到容器內(nèi),這樣一來容器就能夠?qū)?shù)據(jù)寫入到相應(yīng)的目錄里面了,而且容器的退出并不會導(dǎo)致數(shù)據(jù)的丟失。
通常情況下,數(shù)據(jù)卷管理主要有兩種方式:
moby?是目前最流行的容器管理引擎,moby
daemon?會對上提供有關(guān)于容器、鏡像、網(wǎng)絡(luò)以及?Volume的管理。moby daemon?所依賴的最重要的組件就是?containerd,containerd?是一個容器運行時管理引擎,其獨立于?moby daemon?,可以對上提供容器、鏡像的相關(guān)管理。
containerd?底層有?containerd shim?模塊,其類似于一個守護進程,這樣設(shè)計的原因有幾點:
本節(jié)課程只是針對于?moby?進行一個大致的介紹,在后續(xù)的課程也會詳細介紹。
?
VM?利用?Hypervisor?虛擬化技術(shù)來模擬?CPU、內(nèi)存等硬件資源,這樣就可以在宿主機上建立一個?Guest OS,這是常說的安裝一個虛擬機。
每一個?Guest OS?都有一個獨立的內(nèi)核,比如?Ubuntu、CentOS?甚至是?Windows?等,在這樣的?Guest OS?之下,每個應(yīng)用都是相互獨立的,VM?可以提供一個更好的隔離效果。但這樣的隔離效果需要付出一定的代價,因為需要把一部分的計算資源交給虛擬化,這樣就很難充分利用現(xiàn)有的計算資源,并且每個?Guest OS?都需要占用大量的磁盤空間,比如?Windows?操作系統(tǒng)的安裝需要?10~30G?的磁盤空間,Ubuntu?也需要?5~6G,同時這樣的方式啟動很慢。正是因為虛擬機技術(shù)的缺點,催生出了容器技術(shù)。
?
容器是針對于進程而言的,因此無需?Guest OS,只需要一個獨立的文件系統(tǒng)提供其所需要文件集合即可。所有的文件隔離都是進程級別的,因此啟動時間快于?VM,并且所需的磁盤空間也小于?VM。當(dāng)然了,進程級別的隔離并沒有想象中的那么好,隔離效果相比?VM?要差很多。
總體而言,容器和?VM?相比,各有優(yōu)劣,因此容器技術(shù)也在向著強隔離方向發(fā)展。
?
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。