Docker 容器文件存储驱动 Overlay2
碼字不易,轉載請注明出處!!
寫在前面
- Docker 文件存儲驅動有很多種,比如 overlay2、aufs等,可以通過命令 docker info 查看:
- 鏡像是只讀的,而容器是可讀可寫的(這將體現在)
幾個關鍵目錄
docker 默認路徑:/var/lib/docker
[root@VM-0-7-centos docker]# tree -L 2 . ├── buildkit │ ├── cache.db │ ├── containerdmeta.db │ ├── content │ ├── executor │ ├── metadata_v2.db │ └── snapshots.db ├── containers │ ├── bc66c5693bb082c2932929d6be3e351bcd8fd176f5ea9113b5874416ca921fdf │ └── bdba3fa6c74b828d2971547c339412853928213c2f3a75c76de58bc88d8c5d1e ├── image │ └── overlay2 ├── network │ └── files ├── overlay2 │ ├── 020a1d83c7a2880a5aeaaeefae78ba3229a6acdc45284b8ce9690afbfa709d07 │ ├── 025d66d4c070a7ef461939653fe229b57fdb2c9525e44db2f23b9a7ba11d3cee │ ├── 0794172ce57701a8fba81c3fcd2c7048502ae4dc237ea5d5793d7a7b2abb1f05 │ ├── 1e97ea0c744e8ffc92a7427c05f32d1b99210fd8868c2d6f0777c693cc68bc66 │ ├── 2d62d796656b32086ca6105f7ab3f97d630e6fda28dd2e023e5dd6cce161849d │ ├── 2d62d796656b32086ca6105f7ab3f97d630e6fda28dd2e023e5dd6cce161849d-init │ ├── 3bc3a1c925a62dee8153595be93b57affe59bc7660aa7ad6b4def2531dce7b76 │ ├── 3bc3a1c925a62dee8153595be93b57affe59bc7660aa7ad6b4def2531dce7b76-init │ ├── 432352c81670f9b6e2f7634bc5812452cd9c15bfaf7d880fd6a81436477f8c4a │ ├── 685986bdc2572b46b3e034d81d454a3d9b90b0db544a0308881586154f156fd9 │ ├── 68768e41e7e485a0de695ff2272d378b0309a0d9d5695d80ddb35f51aaf9a236 │ ├── 6c3e399bfbd458d9aef157ee99045fef6a84d936e21a3f4f6e248310b432af59 │ ├── 6fe1babc4c723e81afcdd41ad9d6d0ddc4471974ce32861b8cf5da7f8f255a55 │ ├── 7bfca74231e537d58afa6adc31453f1f3e3a796ee80026b88490fca3ed9b4e6e │ ├── 88f3a80280da0c23b7d44a8f943703722262cc29dcd64d481f2050ade4aa9aa4 │ ├── b4fa632bcd08c5050e6691e3df80016c9391dc1f48ba8a00b0024c8d1fd66187 │ ├── be8a908c293a4f380a99a4726b0d2f29a11e7aa8e05f089bdef4c88bfe2cc968 │ ├── c5131b6ee23d74fe73057ca566b2d318062a2832d83e44157b28741a8e0e672a │ ├── cc9f0182b0710b8eda8c64d434eeb7c775a53664223338fc03495d75992db042 │ ├── d7bd582337f9687319331465ce30e052e0c7e4cfc685d3af02643ca2a137de06 │ ├── f3a64c9738393c0c8b0f7d1397b3108a357286646f92c901a413f6411e2df808 │ └── l ├── plugins │ ├── storage │ └── tmp ├── runtimes ├── swarm ├── tmp ├── trust └── volumes├── backingFsBlockDev└── metadata.db- containers:容器信息,文件名與容器id一一對應
- images:鏡像信息
- overlay2:虛擬文件系統信息
從一個容器開始查找
得到容器ID:bdba3fa6c74b
得到的兩串值對應的是overlay2目錄下的文件名
diff:容器臨時創建的可讀可寫層
link:記錄當前容器所掛載的可讀寫層信息,它的內容對應的是/var/lib/docker/overlay2/l下的目錄名,該路徑的目錄都是鏈接文件,最后還是會指向上面提到的這個diff文件
lower:記錄當前容器的只讀層(通常是鏡像層)的信息,會有很多層,對應的也是/var/lib/docker/overlay2/l下的目錄名
merged:字面意思,可讀可寫的diff層和只讀的鏡像層合并的結果,可以看到diff目錄下有的東西,merged也會有
我們也可以進入容器內部,會發現內容和merged下的內容是一致的
[root@VM-0-7-centos merged]# docker exec -it mysql /bin/bash root@bdba3fa6c74b:/# ls bin boot dev docker-entrypoint-initdb.d entrypoint.sh etc home lib lib64 logs media mnt opt proc root run sbin srv sys tmp usr var所以,我們在diff、merged或者容器三者之一所做的操作,都會同時作用在另外兩者,因為他們都是相互掛載的:
[root@VM-0-7-centos 2d62d796656b32086ca6105f7ab3f97d630e6fda28dd2e023e5dd6cce161849d]# echo 'oysq' > diff/root/a.txt [root@VM-0-7-centos 2d62d796656b32086ca6105f7ab3f97d630e6fda28dd2e023e5dd6cce161849d]# echo 'oysq' > merged/root/b.txt [root@VM-0-7-centos 2d62d796656b32086ca6105f7ab3f97d630e6fda28dd2e023e5dd6cce161849d]# docker exec -it mysql /bin/bash root@bdba3fa6c74b:/# echo 'oysq' > root/c.txt root@bdba3fa6c74b:/# ls root/ a.txt b.txt c.txt root@bdba3fa6c74b:/# exit [root@VM-0-7-centos 2d62d796656b32086ca6105f7ab3f97d630e6fda28dd2e023e5dd6cce161849d]# ls diff/root/ a.txt b.txt c.txt [root@VM-0-7-centos 2d62d796656b32086ca6105f7ab3f97d630e6fda28dd2e023e5dd6cce161849d]# ls merged/root/ a.txt b.txt c.txt但是!!當我們啟動容器的時候,把某個路徑 bind (掛載)到宿主機時,容器內的這個路徑將不再和diff、merged關聯,比如本文的例子,通過docker inspect mysql發現,容器的/logs目錄被掛載到宿主機的/usr/local/mysql/logs目錄下:
"Mounts": [{"Type": "bind","Source": "/usr/local/mysql/conf","Destination": "/etc/mysql/conf.d","Mode": "","RW": true,"Propagation": "rprivate"},{"Type": "bind","Source": "/usr/local/mysql/logs","Destination": "/logs","Mode": "","RW": true,"Propagation": "rprivate"},{"Type": "bind","Source": "/usr/local/mysql/data","Destination": "/var/lib/mysql","Mode": "","RW": true,"Propagation": "rprivate"}],因此,容器內的/logs和宿主機的/usr/local/mysql/logs會相互修改,而對diff和merged內的修改,雖然會在diff和merged之間相互影響(因為diff是掛載在merged的),但是對容器已經沒有作用了
- 重啟容器:diff和merged都不會受到影響
- 刪除容器:diff和merged都會被初始化為鏡像的可讀寫層,而bind的目錄不會受影響,這也是為什么容器要把需要持久化的數據bind到宿主機下
總結
以上是生活随笔為你收集整理的Docker 容器文件存储驱动 Overlay2的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Zookeeper客户端网络通讯模型分析
- 下一篇: nvidia驱动升级和nvidia-do