鏡像放在docker根目錄下。鏡像層內容一般在Docker目錄的aufs路徑中,具體地址“/var/lib/docker/aufs/”;對于每一個鏡像層,都會保存一份相應的json文件,路徑為“/var/lib/docker/graph”。
本教程操作環境:Ubuntu 14.04系統、docker-1.7.1版、Dell G3電腦。
Docker 鏡像內容
對于 Docker 鏡像的認識總會有第一次,自那時開始,當然也少不了成長,筆者本人的認識過程不妨和大家一起分享:
-
初次接觸 Docker:相信很多愛好者都會和我一樣,有這樣一個認識:Docker 鏡像代表一個容器的文件系統內容;
-
初步接觸聯合文件系統:聯合文件系統的概念,讓我意識到鏡像層級管理的技術,每一層鏡像都是容器文件系統內容的一部分。
-
研究鏡像與容器的關系:容器是一個動態的環境,每一層鏡像中的文件屬于靜態內容,然而 Dockerfile 中的 ENV、VOLUME、CMD 等內容最終都需要落實到容器的運行環境中,而這些內容均不可能直接坐落到每一層鏡像所包含的文件系統內容中,那這部分內容 Docker 該如何管理?
另外,在上述第三個步驟中,還有一種情況,相信大家并不陌生,很多個鏡像層大小為 0,鏡像層內部不存在任何文件內容。這又是怎么一回事?
大家可以回憶一下《Docker鏡像詳談(1): 容器的文件系統》中,關于空鏡像的生成部分,其中提到「更新鏡像的 json 文件」。其實,前文埋下的伏筆,即暗示了真相—— Docker 鏡像內容由鏡像層文件內容和鏡像 json 文件組成,不論靜態內容還是動態信息,Docker 均為將其在 json 文件中更新。
Docker 每一層鏡像的 json 文件,都扮演著一個非常重要的角色,其主要的作用如下:
-
記錄 Docker 鏡像中與容器動態信息相關的內容
-
記錄父子 Docker 鏡像之間真實的差異關系
-
彌補 Docker 鏡像內容的完整性與動態內容的缺失
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/,具體情況如下:
圖中顯示了鏡像 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視頻教程》