1. 程式人生 > >Docker 檔案系統以及啟動容器的檔案系統變化

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 檔案系統目錄

ll /var/lib/docker #其中目錄是這樣的 /var/lib/docker -> /mnt/sda1/var/lib/docker/
df -h # 檢視掛載情況
FilesystemSizeUsedAvailableUse%Mounted on tmpfs 896.6M115.3M781.3M13%/ tmpfs 498.1M 0 498.1M 0% /dev/shm /dev/sda1 18.2G300.1M16.9G2%/mnt/sda1 cgroup 498.1M0498.1M0%/sys/fs/cgroup none 100.0G42.1G57.9G42%/c/Users/dev/sda1
18.2G300.1M16.9G2%/mnt/sda1/var/lib/docker/aufs ls -l /mnt/sda1/var/lib/docker/ drwxr-xr-x 5 root root 4096Sep2801:59 aufs/# 系統掛載目錄,系統使用的aufs drwx------2 root root 4096Oct703:48 containers/# 容器檔案系統 drwx------7 root root 12288Oct703:48 graph/# 本地映象-rw-r--r--1 root root
15360Oct703:48 linkgraph.db -rw-------1 root root 105Oct703:48 repositories-aufs # 儲存與image有關的基本資訊 drwx------2 root root 4096Oct702:52 tmp/ drwx------2 root root 4096Sep2802:01 trust/ drwx------2 root root 4096Sep2801:59 volumes/

檢視一下我本地的映象

docker images 
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu              latest              91e54dfb11796 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 資料夾下。

image_json

如上圖所示,其中映象的 json 檔案中儲存著映象的元資料,譬如父映象 id

在 /var/lib/docker/aufs/layers 存放著映象ID以及層級關係,如下圖,我們知道最底層的 IMAGE ID 是 d3a1f33e8a5a513092f01bb7eb1c2abf4d711e5105390a3fe1ae2248cfde1391

layers

我們檢視容器層級內容

$ cd /var/lib/docker/aufs/diff/d3a1f33e8a5a513092f01bb7eb1c2abf4d711e5105390a3fe1ae2248cfde1391
$ ls

images_rootfs

我們就看到了如上圖所示的 rootfs 檔案目錄,而這個映象就作為最根部的 Images ,我們使用的最終映象 ubuntu:latest 就是在這個映象的基礎上根據各層級的關係動態新增的。

images_docker

如上圖,/var/lib/docker/graph 下的映象 ID 以及映象 json,檢視 json 檔案內容如下圖:

docker_add

如上圖所示包含了,所有父映象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 中就會進行日誌儲存,如下圖

images_logo

上圖,從日誌中我們可以看出,我們對容器操作有兩部:

cd root
touch 1.txt

然後我們建立的 1.txt 檔案,記在 /var/lib/docker/diff/ID/root/ 下,如下圖

images_addlayer

這就能很簡單的看出 docker 的層級關係和資料關係。