1. 程式人生 > >Docker映象內有啥,存哪?

Docker映象內有啥,存哪?

據說重要的事情要說三遍,那我再表述一下個人觀點:Docker映象是Docker的靈魂所在。

前兩講關於Docker映象的描述,已經從巨集觀的角度涉及一二。一旦掌握Docker對於映象的層級管理方式,以及Docker映象大小的真實情況之後,再來了解Docker映象包含的內容以及儲存,就顯得簡單很多。

Docker映象內容

對於Docker映象的認識總會有第一次,自那時開始,當然也少不了成長,筆者本人的認識過程不妨和大家一起分享:

1.初次接觸Docker:相信很多愛好者都會和我一樣,有這樣一個認識:Docker映象代表一個容器的檔案系統內容;

2.初步接觸聯合檔案系統:聯合檔案系統的概念,讓我意識到映象層級管理的技術,每一層映象都是容器檔案系統內容的一部分。

3.研究映象與容器的關係:容器是一個動態的環境,每一層映象中的檔案屬於靜態內容,然而Dockerfile中的ENV、VOLUME、CMD等內容最終都需要落實到容器的執行環境中,而這些內容均不可能直接坐落到每一層映象所包含的檔案系統內容中,那這部分內容Docker該如何管理?

另外,在上述第三個步驟中,還有一種情況,相信大家並不陌生:很多個映象層大小為0,映象層內部不存在任何檔案內容。這又是怎麼一回事?

大家可以回憶一下《一圖看盡Docker容器檔案系統內容》中,關於空映象的生成部分,其中提到“更新映象的 json檔案”。其實,前文埋下的伏筆,即暗示了真相:Docker映象內容由映象層檔案內容

映象json檔案組成,不論靜態內容還是動態資訊,Docker均為將其在json檔案中更新。

Docker每一層映象的json檔案,都扮演著一個非常重要的角色,其主要的作用如下:

1.記錄Docker映象中與容器動態資訊相關的內容

2.記錄父子Docker映象之間真實的差異關係

3.彌補Docker映象內容的完整性與動態內容的缺失

Docker映象的json檔案可以認為是映象的元資料資訊,其重要性不言而喻,本系列將在下一篇文章重點分析Docker映象json檔案。敬請期待。

Docker映象儲存位置

Docker映象內容的理論分析,看著多少有些雲裡霧裡,不論Docker映象層的檔案,還是json檔案,讀來都稍顯乏味。倘若可以一窺Docker中的真實環境,相信對於映象技術的理解定會有不少的幫助。

我們直奔主題,從Docker映象的儲存入手,看看這些映象層檔案內容映象json檔案分別儲存於何處。(以下展示的實驗環境:宿主機作業系統為ubuntu:14.04,Docker版本為1.7.1,graphdriver型別為aufs,僅包含ubuntu:14.04一個映象)。

檢視映象層組成

我們可以通過命令docker history ubuntu:14.04檢視ubuntu:14.04,結果如下:
這裡寫圖片描述

圖中顯示ubuntu:14.04映象共有4個映象層。

映象層檔案內容儲存

Docker映象層的內容一般在Docker根目錄的aufs路徑下,為/var/lib/docker/aufs/diff/,具體情況如下:
這裡寫圖片描述

圖中顯示了映象ubuntu:14.04的4個映象層內容,以及每個映象層內的一級目錄情況。需要額外注意的是:映象層d2a0ecffe6fa中沒有任何內容。

映象json檔案儲存

對於每一個映象層,Docker都會儲存一份相應的json檔案,json檔案的儲存路徑為/var/lib/docker/graph,ubuntu:14.04所有映象層的json檔案儲存路徑展示如下:
這裡寫圖片描述

除了json檔案,大家還看到每一個映象層還包含一個layersize檔案,該檔案主要記錄映象層內部檔案內容的總大小。既然談到了映象json檔案,為了給下文鋪墊,以下貼出ubuntu:14.04中空映象層d2a0ecffe6fa的json檔案:
這裡寫圖片描述

由於該映象層的對應的Dockerfile指令為CMD,所以映象層的內容為空,而改映象層的json檔案會更新Cmd域,獲取新的Cmd值,以便後續通過該映象執行容器時,使用更新後的Cmd。

總結

聯合檔案系統的使用,是Docker映象技術的精髓,然而除此之外,對於映象的元資料管理(即映象json檔案)打通了通過Docker映象直接執行Docker容器的捷徑。

這裡寫圖片描述

歡迎關注[Docker原始碼分析]微信公眾號,更多精彩即將呈現。