Docker 檔案系統以及啟動容器的檔案系統變化
轉載自如下連結
http://www.widuu.com/archives/10/1230.html
本文主要介紹一下 Docker 基礎的東西,先介紹一下我的實現環境:
1. windows 10 正式版
1. Docker Toolbox
1. Docker version 1.8.2
1. 官方映象 ubuntu:latest這裡我們主要只說 aufs/containers/graph 這三個目錄。
1. 先進入 Docker 檔案系統目錄
檢視一下我本地的映象
我本地有一個
ubuntu:latest
的 office image, Image 的短 ID 是 91e54dfb1179。這裡說明說一下 Docker 的映象是由映象層檔案內容 和 json檔案組成。
1. 映象層檔案儲存在/var/lib/docker/aufs/diff
中
1. 本地映象的 json 檔案存放在/var/lib/docker/graph
資料夾下。
如上圖所示,其中映象的 json 檔案中儲存著映象的元資料,譬如父映象 id
在
/var/lib/docker/aufs/layers
存放著映象ID以及層級關係,如下圖,我們知道最底層的 IMAGE ID 是d3a1f33e8a5a513092f01bb7eb1c2abf4d711e5105390a3fe1ae2248cfde1391
我們檢視容器層級內容
我們就看到了如上圖所示的 rootfs 檔案目錄,而這個映象就作為最根部的 Images ,我們使用的最終映象 ubuntu:latest 就是在這個映象的基礎上根據各層級的關係動態新增的。
如上圖,
/var/lib/docker/graph
下的映象 ID 以及映象 json,檢視 json 檔案內容如下圖:
如上圖所示包含了,所有父映象id,和在父映象id 上執行的命令以及生成映象id 等等所有元資料。當我們啟動容器的時候,就會一步一步逐步的從
rootfs
上累加過來。
2. 啟動容器
當我們執行上邊的命令的時候,基礎過程如下:
1. 它會先檢查我們本地是否存在 ubuntu:latest 的映象,如果存在就載入映象,也就是我們之前提到的91e54dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c
。
2. 建立容器,程式的CreateRootfs
會呼叫Create
函式來在mnt
和diff
資料夾下建立ID-init
資料夾,然後通過程式的GET
函式將依賴的layers
層根據層級關係依次載入到ID-init
資料夾下。只有ID-init
是可寫,其它都是可讀。
3. 再次呼叫Create
函式來建立ID
資料夾,並在containers
資料夾下建立ID
資料夾和所有配置檔案 ,然後啟動容器,將依賴的容器的層依次掛載到ID
資料夾下。
當我們在容器內進行操作的時候,在 /var/lib/docker/containers/ID/ID-json.log
中就會進行日誌儲存,如下圖
上圖,從日誌中我們可以看出,我們對容器操作有兩部:
然後我們建立的 1.txt 檔案,記在
/var/lib/docker/diff/ID/root/
下,如下圖
這就能很簡單的看出 docker 的層級關係和資料關係。