這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
本文主要介紹一下 Docker 基礎的東西,先介紹一下我的實現環境:
1. windows 10 正式版
1. Docker Toolbox
1. Docker version 1.8.2
1. 官方鏡像 ubuntu:latest
這裡我們主要只說 aufs/containers/graph 這三個目錄。
1. 先進入 Docker 檔案系統目錄
ll /var/lib/docker #其中目錄是這樣的 /var/lib/docker -> /mnt/sda1/var/lib/docker/df -h # 查看掛載情況Filesystem Size Used Available Use% Mounted ontmpfs 896.6M 115.3M 781.3M 13% /tmpfs 498.1M 0 498.1M 0% /dev/shm/dev/sda1 18.2G 300.1M 16.9G 2% /mnt/sda1cgroup 498.1M 0 498.1M 0% /sys/fs/cgroupnone 100.0G 42.1G 57.9G 42% /c/Users/dev/sda1 18.2G 300.1M 16.9G 2% /mnt/sda1/var/lib/docker/aufsls -l /mnt/sda1/var/lib/docker/drwxr-xr-x 5 root root 4096 Sep 28 01:59 aufs/ # 系統掛載目錄,系統使用的aufsdrwx------ 2 root root 4096 Oct 7 03:48 containers/ # 容器檔案系統drwx------ 7 root root 12288 Oct 7 03:48 graph/ # 本地鏡像-rw-r--r-- 1 root root 15360 Oct 7 03:48 linkgraph.db -rw------- 1 root root 105 Oct 7 03:48 repositories-aufs # 儲存與image有關的基本資料drwx------ 2 root root 4096 Oct 7 02:52 tmp/drwx------ 2 root root 4096 Sep 28 02:01 trust/drwx------ 2 root root 4096 Sep 28 01:59 volumes/
查看一下我本地的鏡像
docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZEubuntu latest 91e54dfb1179 6 weeks ago 188.4 MB
我本地有一個 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
我們查看容器層級內容
$ cd /var/lib/docker/aufs/diff/d3a1f33e8a5a513092f01bb7eb1c2abf4d711e5105390a3fe1ae2248cfde1391$ ls
我們就看到了如所示的 rootfs 檔案目錄,而這個鏡像就作為最根部的 Images ,我們使用的最終鏡像 ubuntu:latest 就是在這個鏡像的基礎上根據各層級的關係動態添加的。
如,/var/lib/docker/graph 下的鏡像 ID 以及鏡像 json,查看 json 檔案內容如:
如所示包含了,所有父鏡像id,和在父鏡像id 上執行的命令以及產生鏡像id 等等所有中繼資料。當我們啟動容器的時候,就會一步一步逐步的從 rootfs 上累加過來。
2. 啟動容器
docker run -i -t ubuntu bash
當我們運行上邊的命令的時候,基礎過程如下:
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 中就會進行日誌儲存,如
,從日誌中我們可以看出,我們對容器操作有兩部:
cd roottouch 1.txt
然後我們建立的 1.txt 檔案,記在 /var/lib/docker/diff/ID/root/ 下,如
這就能很簡單的看出 docker 的層級關係和資料關係。
今天就說到這裡,哪裡不懂的或者文章有錯誤的,請發送郵件到 admin#widuu.com(#換成@)
未經允許,不得轉載本站任何文章:微度網路 » Docker 檔案系統以及啟動容器的檔案系統變化