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)
現在就能瞭解官方範例圖檔中說明的意思了,每個容器都在只讀的image底層之上添加一個可讀寫層,當我們在對容器中的任何操作例如新增、修改、刪除文件,都是在對可讀寫層操作所以並不會影響到底層的image
詳細的內容可以參考此篇Issues
Summary
Docker不像傳統的VM,在VM裝系統時需要先下載ISO檔在系統安裝到硬碟內部,這樣每新增一台VM系統都會佔據硬碟一部分的空間
所以docker image這樣設計的好處,只需要參考image內容即可不需要額外複製,所以可以做到秒級的啟動速度並且會不消耗多餘的空間,比起傳統VM優勢很大