Docker鏡像分層解密--Docker layer


      

 

       Docker和傳統虛擬機相比,有輕量化,靈活,但是安全性隔離性更差的特點。

       這個輕量化,靈活,平常我們從整個應用層面上講,因為Docker把底層的OS給下線了,只保留應用需要的庫和組件,所以從隔離機制來講,安全性也更差。那我們有沒有更深入的理解呢,當然是有的。

  

       Docker的所有鏡像包(Image)都包含一個叫Dockerfile的文件,我們可以理解Docker鏡像和千層蛋糕一樣,有一層一層的分層,絕大部分還夾了不同的餡,這些不同層級就是Docker layer——具體表現為,Docker file有特定書寫規則,這個文件的每一行都會成為鏡像build時的一層。所以我們在pull或者build時,屏幕上顯示的,每一行都是不同12位的字母數字組成的,一看就很計算機的無意義字符串,就是Docker隨機生成的,Docker Layer的名字。所有Layer層ok了,那么這個千層蛋糕--容器就制作好了,否則我們在image列表就會看到明顯是一個半成品的容器。

 

       Docker Layer最上面一層,是我們可以進行改寫操作的一層,稱之為可寫層。除此之外,所有下層的Layer,都是只讀層,是不允許我們用戶直接進行修改的。所以我們exec進去進行操作的,都是最上面一層可寫層。如果我們修改了一個下面只讀層的一個文件(只要有權限,在可寫層允許任意修改),那么這個只讀層文件就會是我們可寫層修改的內容。但是呢,原來未修改版本的這個只讀層文件還是存在的,就是被隱藏起來了,這即是Docker的“寫時復制”的機制。我們設源文件為A,這個修改過的文件為A',在當前這個容器里,退出再進去我們看見的就會是A',但是刪除容器,重新用鏡像構建,我們看到的就是A。當我們把這個A’刪掉以后,源文件A就會出現了。

 

       這個Docker Layer在建立的時候,一般都會顯示自己的大小(如幾k,幾M,幾G),有時候很快,我們也很開心!有時候慢呢,我們又很抓狂,好家伙,難道真是我們網絡問題,還是被我們嫌棄了一次又一次的外網的鍋?其實網絡當然有原因,但我們發現有時候具有相同依賴的兩個不同鏡像文件,即使有時候是幾個G的Layer,構建起來也是很快的,這怎么解釋,難道有復用?

      對,復用就是存在的,我們自己在Docker file隨便加一行,再進行build,和原來的容器就是兩個不同的容器,但物理上我們看到的兩個不同容器,實際上,下層的只讀層除了我們自己魔改的那一行成了一層layer外,兩個容器用的是一樣的東西,類似於互不干擾的映射關系。這就是我們說為啥Docker輕量級,省空間,但安全性不如傳統虛擬機的原因。

 

      兩個存在相同Layer的不同容器構建后關系如下圖所示,容器1有ABCD四層,容器2有ABC三層。通常狀況下,Layer內容相同,可以映射到不同容器需求的相應層級(這里只畫了相同層級,實際上映射的層級可以不同),用戶在可寫層對容器Layer下層的只讀層進行操作,但改變的是自己本身可寫層的相應文件內容(下圖容器1的A’和容器2的C’),不同容器內的映射的只讀層原始內容,容器2的A和容器1的C的內容並不會跟着改變,除非用戶進容器地下對他們進行改動操作。Layer內容不同,如下圖容器1的D,就會直接成為容器1的layer,容器2則沒有。

 

        說到這里是不是明確了很多,我們在構建產生錯誤的情況下,尤其是BUILD某一層總是出錯的情況下,我們可以檢查一下Docker file內對應那一層有啥毛病,要是真是要在網上下什么東西,我們可以直接在網上找這個資源的Docker鏡像包自己先下載再在本地構建,這樣容器的建立就順暢很多。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM