一、鏡像與分層
一個鏡像由多個分層組成。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來提供一個最終合成的視圖,來作爲容器的實際掛載點。
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)的操作