您好,登錄后才能下訂單哦!
文章首發于微信公眾號《程序員果果》
地址:https://mp.weixin.qq.com/s/8VM-c_UkxYcVw2Itiapw4w
從圖中我們很容器看出,容器技術資源占用比較少,由于虛擬機需要模擬硬件的行為,對CUP和內存的損耗比較大。所以同樣配置的服務器,容器技術就有以下優點:
那既然容器有這些優點,為什么直到Docker的出現,才真正的被關注呢?一個重要原因就是容器技術的復雜性。容器本身就很復雜,他依賴于Linux內核的很多特性,而且他不易安裝,也不易于管理和實現自動化。而Docker就是為了改變這一切而產生的。
Docker 包含了一下幾個重要主要部分:
docker的鏡像是一個層疊的只讀文件系統,最低端是一個引導文件系統(即bootfs),第二層是root文件系統(即rootfs),它位于bootfs之上,可以是一種或多種操作系統,比如ubuntu或者centos。在docker中,root文件系統永遠只能是只讀狀態,并且docker運用聯合加載技術又會在root文件系統之上加載更多的只讀文件系統,聯合加載指的是一次加載多個文件系統,但是在外面看起來只能看到一個文件系統,聯合加載會將各層文件系統疊加到一起,這樣最終的文件系統會包含所有的底層文件和目錄,docker將這樣的文件系統稱為鏡像。
當一個容器啟動時,docker會在該鏡像的最頂層加載一個讀寫文件系統,也就是一個可寫的文件層,我們在docker運行的程序,就是在這個層中進行執行的,當docker第一次啟動一個容器時,初始的讀寫層是空的,當文件系統發生變化時,這些變化都會應用到這一層上,比如像修改一個文件,該文件首先會從讀寫層下面的只讀層復制到該讀寫層,該文件的只讀版本依然存在,但是已經被讀寫層中的該文件副本所隱藏,這就是docker的一個重要技術:寫時復制(copy on write)。每個只讀鏡像層都是只讀的,永遠不會變化,當創建一個新容器時,docker會構建出一個鏡像棧,如下圖所示:
Docker依賴于Linux內核的兩個重要特性:
很多編程語言都包含了“命名空間”的概念,我們可以認為“命名空間”是一種“封裝”的概念, 而“封裝”本身實際上實現的是代碼的隔離。而在操作系統中,命名空間提供的是系統資源的隔離,而系統資源包括了進程、網絡、文件系統等。
我們從Docker公開的文檔來看,它使用了5種命名空間:
那么,這些隔離的資源,是如何被管理起來的呢?這就需要用到——Control groups(cgroup)控制組了。
Control groups是Linux內核提供的,一種可以限制、記錄、隔離進程組所使用的物理資源的機制。
最初是由google工程師提出,并且在2007年時被Linux的內核的2.6.24版本引進。可以說,Control groups就是為容器而生的,沒有Control groups就沒有容器技術的今天。
Control groups提供了以下功能:
資源限制:例如,memory(內存)子系統可以為進程組設定一個內存使用的上限,一旦進程組使用的內存達到了限額,該進程組再發出內存申請時,就會發出“out of memory”(內存溢出)的警告。
優先級設定:它可以設定哪些進程組可以使用更大的CPU或者磁盤IO的資源。
資源計量:它可以計算進程組使用了多少系統資源。尤其是在計費系統中,這一點十分重要。
到這里我們了解了Namespace和CGroup的概念和職能,而這兩個特性帶給了Docker哪些能力呢?如下:
文件系統隔離:首先是文件系統的隔離,每個Docker的容器,都可以擁有自己的root文件系統。
進程隔離:每個容器都運行在自己的進程環境中。
網絡隔離:容器間的虛擬網絡接口和IP地址都是分開的。
歡迎關注我的公眾號《程序員果果》,關注有驚喜~~
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。