日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Docker 容器文件存储驱动 Overlay2

發布時間:2023/12/8 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Docker 容器文件存储驱动 Overlay2 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

碼字不易,轉載請注明出處!!


寫在前面

  • Docker 文件存儲驅動有很多種,比如 overlay2、aufs等,可以通過命令 docker info 查看:
> # docker info > Storage Driver: overlay2
  • 鏡像是只讀的,而容器是可讀可寫的(這將體現在)

幾個關鍵目錄

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:虛擬文件系統信息

從一個容器開始查找

  • 查看容器信息
  • [root@VM-0-7-centos docker]# docker ps | grep mysql bdba3fa6c74b mysql:latest "docker-entrypoint.s…" 3 days ago Up 3 days 33060/tcp, 0.0.0.0:13307->3306/tcp, :::13307->3306/tcp mysql

    得到容器ID:bdba3fa6c74b

  • 進入 image/overlay2/layerdb/mounts,找到這個容器的目錄
  • [root@VM-0-7-centos mounts]# pwd /var/lib/docker/image/overlay2/layerdb/mounts [root@VM-0-7-centos mounts]# ls bc66c5693bb082c2932929d6be3e351bcd8fd176f5ea9113b5874416ca921fdf bdba3fa6c74b828d2971547c339412853928213c2f3a75c76de58bc88d8c5d1e
  • 查看這個容器目錄下的 init-id 和 mount-id 內容
  • [root@VM-0-7-centos mounts]# cd bdba3fa6c74b828d2971547c339412853928213c2f3a75c76de58bc88d8c5d1e/ [root@VM-0-7-centos bdba3fa6c74b828d2971547c339412853928213c2f3a75c76de58bc88d8c5d1e]# ls init-id mount-id parent [root@VM-0-7-centos bdba3fa6c74b828d2971547c339412853928213c2f3a75c76de58bc88d8c5d1e]# cat init-id 2d62d796656b32086ca6105f7ab3f97d630e6fda28dd2e023e5dd6cce161849d-init [root@VM-0-7-centos bdba3fa6c74b828d2971547c339412853928213c2f3a75c76de58bc88d8c5d1e]# cat mount-id 2d62d796656b32086ca6105f7ab3f97d630e6fda28dd2e023e5dd6cce161849d

    得到的兩串值對應的是overlay2目錄下的文件名

  • 找到容器所掛載的虛擬目錄
  • [root@VM-0-7-centos overlay2]# cd /var/lib/docker/overlay2 [root@VM-0-7-centos overlay2]# cd 2d62d796656b32086ca6105f7ab3f97d630e6fda28dd2e023e5dd6cce161849d [root@VM-0-7-centos 2d62d796656b32086ca6105f7ab3f97d630e6fda28dd2e023e5dd6cce161849d]# ls diff link lower merged work

    diff:容器臨時創建的可讀可寫層
    link:記錄當前容器所掛載的可讀寫層信息,它的內容對應的是/var/lib/docker/overlay2/l下的目錄名,該路徑的目錄都是鏈接文件,最后還是會指向上面提到的這個diff文件
    lower:記錄當前容器的只讀層(通常是鏡像層)的信息,會有很多層,對應的也是/var/lib/docker/overlay2/l下的目錄名
    merged:字面意思,可讀可寫的diff層和只讀的鏡像層合并的結果,可以看到diff目錄下有的東西,merged也會有

    [root@VM-0-7-centos 2d62d796656b32086ca6105f7ab3f97d630e6fda28dd2e023e5dd6cce161849d]# ls diff/ logs run tmp [root@VM-0-7-centos 2d62d796656b32086ca6105f7ab3f97d630e6fda28dd2e023e5dd6cce161849d]# ls merged/ 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 [root@VM-0-7-centos 2d62d796656b32086ca6105f7ab3f97d630e6fda28dd2e023e5dd6cce161849d]# cat diff/run/mysqld/mysqld.pid 1 [root@VM-0-7-centos 2d62d796656b32086ca6105f7ab3f97d630e6fda28dd2e023e5dd6cce161849d]# cat merged/run/mysqld/mysqld.pid 1

    我們也可以進入容器內部,會發現內容和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的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。