Docker container layer

在此篇文章中: Docker Certified Associate(DCA)認證考試學習-Docker Images

在說明docker run命令時有提到一個重點: docker 會在image之上建立一個可讀寫層
那麼這個讀寫層是甚麼意思呢?

我們可以做一下測試,首先我們先下載ubuntu

$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
ubuntu       latest    58db3edaf2be   3 weeks ago   77.8MB

這邊可以看到ubuntu image的大小為77.8MB

那接下來建立幾個ubuntu container

docker run --name ubuntu1 -dit ubuntu
docker run --name ubuntu2 -dit ubuntu
docker run --name ubuntu3 -dit ubuntu
docker run --name ubuntu4 -dit ubuntu
docker run --name ubuntu5 -dit ubuntu

建立完成,這邊可以猜一下這邊五個container,ubuntu1~ubuntu5總共會佔據多少硬碟容量
可以使用docker ps -s命令, -s參數會將容量列出來

$ docker ps -s
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES     SIZE
99c4f21e20f8   ubuntu    "/bin/bash"   6 minutes ago   Up 6 minutes             ubuntu5   0B (virtual 77.8MB)
ba4ee9e0587f   ubuntu    "/bin/bash"   6 minutes ago   Up 6 minutes             ubuntu4   0B (virtual 77.8MB)
1892ba06818b   ubuntu    "/bin/bash"   6 minutes ago   Up 6 minutes             ubuntu3   0B (virtual 77.8MB)
caa413333ef7   ubuntu    "/bin/bash"   6 minutes ago   Up 6 minutes             ubuntu2   0B (virtual 77.8MB)
b76ec17fa825   ubuntu    "/bin/bash"   6 minutes ago   Up 6 minutes             ubuntu1   0B (virtual 77.8MB)

這邊最終答案是總共77.8MB,為什麼呢?
這是因為image當初設計之時為了共用所以image在docker都是只讀的(readonly),所以這邊只需要參考image的內容即可,不需要複製一份完整的系統到container之內 所以這邊SIZE欄位中virtual 77.8MB就代表底層image的大小,也就是我們一開始先下載的ubuntu image 那麼我們為什麼可以在container寫入資料呢?
這就是可讀寫層起作用的地方了
SIZE欄位中0B就代表目前可讀寫層的大小,每個container都有自己獨立的可讀寫層並且不會共用
我們可以進入container嘗試建立幾個檔案

$ docker attach 99c4
root@99c4f21e20f8:/# touch file1
root@99c4f21e20f8:/# touch file2
root@99c4f21e20f8:/# touch file3

使用CTRL+P CTRL+Q 可退出container

這邊可以看到可讀寫層容量確實有增加,之後只要將容器刪除,此讀寫層也會隨之刪除

[node1] (local) root@192.168.0.13 ~
$ docker ps -as
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS                          PORTS     NAMES     SIZE
99c4f21e20f8   ubuntu    "/bin/bash"   31 minutes ago   Up 31 minutes                             ubuntu5   99B (virtual 77.8MB)
ba4ee9e0587f   ubuntu    "/bin/bash"   31 minutes ago   Up 31 minutes                             ubuntu4   0B (virtual 77.8MB)
1892ba06818b   ubuntu    "/bin/bash"   31 minutes ago   Up 31 minutes                             ubuntu3   0B (virtual 77.8MB)
caa413333ef7   ubuntu    "/bin/bash"   31 minutes ago   Up 31 minutes                             ubuntu2   0B (virtual 77.8MB)
b76ec17fa825   ubuntu    "/bin/bash"   31 minutes ago   Up 31 minutes                             ubuntu1   0B (virtual 77.8MB)
container-layers sharing-layers

現在就能瞭解官方範例圖檔中說明的意思了,每個容器都在只讀的image底層之上添加一個可讀寫層,當我們在對容器中的任何操作例如新增、修改、刪除文件,都是在對可讀寫層操作所以並不會影響到底層的image

詳細的內容可以參考此篇Issues


Summary

Docker不像傳統的VM,在VM裝系統時需要先下載ISO檔在系統安裝到硬碟內部,這樣每新增一台VM系統都會佔據硬碟一部分的空間
所以docker image這樣設計的好處,只需要參考image內容即可不需要額外複製,所以可以做到秒級的啟動速度並且會不消耗多餘的空間,比起傳統VM優勢很大