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