Docker overlay存儲工作原理

 

一、鏡像與分層

一個鏡像由多個分層組成。Dockerfile中寫有每個分層,比如:

FROM ubuntu:18.04
COPY . /app
RUN make /app
CMD python /app/app.py

dockerfile中每一行指令都會創建一個層次。每一層保留只有與前一層有差異的部分,一次次進行疊加。當你創建一個‘容器’時,頂層將會創建一個讀寫層。這個讀寫層就稱之爲“容器層”。容器中的文件增加、刪除、修改,都在容器層中操作。這些層級之間文件操作由docker的storage driver來進行實現。

二、OverlayFS 工作原理

overlay是storage driver的一種實現。可在/etc/docker/daemon.json中設置

{
  "storage-driver": "overlay2"
}

overlay有兩層結構,底層叫lowerdir,上層叫upperdir,然後通過merged來提供一個最終合成的視圖,來作爲容器的實際掛載點。

overlayfs lowerdir, upperdir, merged

overlay只有兩層,這意味着他無法由多層的鏡像組成。鏡像的每一層,都在目錄/var/lib/docker/overlay下有他自己的目錄。

創建一個容器時,鏡像的最頂層作爲lowerdir(只讀),容器中新創建的文件就在upperdir層(可寫)

三、宿主機磁盤中的overlay存放方式

/var/lib/docker/overlay/中,每個鏡像層都有他自己的文件夾。每一層都只包含他獨有的一些文件,與底層共享的那些文件則通過硬鏈接的方式實現。可高效利用磁盤空間。

$ ls -l /var/lib/docker/overlay/

total 20
drwx------ 3 root root 4096 Jun 20 16:11 38f3ed2eac129654acef11c32670b534670c3a06e483fce313d72e3e0a15baa8
drwx------ 3 root root 4096 Jun 20 16:11 55f1e14c361b90570df46371b20ce6d480c434981cbda5fd68c6ff61aa0a5358
drwx------ 3 root root 4096 Jun 20 16:11 824c8a961a4f5e8fe4f4243dab57c5be798e7fd195f6d88ab06aea92ba931654
drwx------ 3 root root 4096 Jun 20 16:11 ad0fe55125ebf599da124da175174a4b8c1878afe6907bf7c78570341f308461
drwx------ 3 root root 4096 Jun 20 16:11 edab9b5e5bf73f2997524eebeac1de4cf9c8b904fa8ad3ec43b3504196aa3801
$ ls -i /var/lib/docker/overlay/38f3ed2eac129654acef11c32670b534670c3a06e483fce313d72e3e0a15baa8/root/bin/ls

19793696 /var/lib/docker/overlay/38f3ed2eac129654acef11c32670b534670c3a06e483fce313d72e3e0a15baa8/root/bin/ls

$ ls -i /var/lib/docker/overlay/55f1e14c361b90570df46371b20ce6d480c434981cbda5fd68c6ff61aa0a5358/root/bin/ls

19793696 /var/lib/docker/overlay/55f1e14c361b90570df46371b20ce6d480c434981cbda5fd68c6ff61aa0a5358/root/bin/ls

 四、用overlay時,容器讀寫文件的機制

讀文件:

1、容器層中無文件:從lowerdir中讀取

2、只有容器層中有文件:直接總容器層中讀取

3、容器層與鏡像層都有:讀容器層中的文件,再隱藏鏡像層中的同名文件

文件修改:

第一次寫文件:先從鏡像複製文件到容器層,在容器層中修改文件

刪除文件:容器層中的文件變空文件,但是鏡像層中的文件任然未變

重命名目錄:只有源和目的路徑都在頂層時,才能重命名。

五、性能

overlay的性能比aufs和devicemapper好。

對於讀寫頻繁的文件,需要放入volume存儲卷。這些可以跳過storage driver,減少寫時拷貝(copy on write)的操作

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章