03-Docker存儲引擎

Docker存儲引擎

參考:https://www.cnblogs.com/Gmiaomiao/p/13174618.html
官網(wǎng)文檔:https://docs.docker.com/storage/storagedriver/select-storage-driver/
overlay :https://www.cnblogs.com/lhanghang/p/13556629.html

目前docker的默認存儲引擎為overlay2,不同的存儲引擎需要相應的文件系統(tǒng)支持,如需要磁盤分區(qū)的時候傳遞d-type穩(wěn)健分層功能,即需要傳遞內核參數(shù)并開啟格式化磁盤的時候指定的功能

設計思想

Docker 存儲引擎的核心思想是“層”的概念,理解了這個層,就基本可以理解它的設計思路。當我們拉取一個 Docker 鏡像的時候,可以看到如下:

# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
a2abf6c4d29d: Downloading [========================>                          ]  15.25MB/31.36MB
f3409a9a9e73: Downloading [==================>                                ]  9.161MB/25.35MB
9919a6cbae9c: Download complete 
fc1ce43285d7: Download complete 
1f01ab499216: Download complete 
13cfaf79ff6d: Download complete

一個鏡像被分成許多的“層”,每“層”包含了若干的文件,而一層層堆疊起來就組成了我們的一個完整的鏡像。我們鏡像中的文件就是所有“層”文件的并集。 我們構建 Docker 鏡像一般采用 Dockerfile 的方式,而 Dockerfile 的每行命令,其實就會生成一個“層”,即使什么文件都沒有添加。

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

image-20211228122106318.png

Docker 的鏡像(image)是靜態(tài)的,所以當鏡像構建完成后,所有的層都是只讀的,并會賦予一個唯一的 ID。而容器(container)是動態(tài)的,當容器啟動后,Docker 會給這個容器創(chuàng)建一個可讀寫“層”,位于所有鏡像“層”的最上面。我們對容器的所有操作也就是在這個“層”里完成,當我們執(zhí)行 docker commit 將容器生成鏡像的時候,就是把這個“層”給拍了個快照,添加了一個新的只讀層。

文件的創(chuàng)建是在讀寫層增加文件,那修改和刪除呢?

這就要提一下 Docker 設計的 copy-on-write (CoW) 策略。

當我們試圖讀取一個文件時,Docker 會從上到下一層層去找這個文件,找到的第一個就是我們的文件。所以下面層相同的文件就被“覆蓋”了。而修改就是當我們找到這個文件時,將它“復制”到讀寫層并修改,這樣讀寫層的文件就是我們修改后的文件,并且“覆蓋”了鏡像中的文件了。而刪除就是創(chuàng)建了一個特殊的 whiteout 文件,這個 whiteout 文件覆蓋的文件即表示刪除了。

這樣的設計有什么好處嗎?

第一個好處是減少了存儲空間,由于鏡像被分成了多個層,而各個層是靜態(tài)只讀的,是可以共享的。當你從一個鏡像構建另一個鏡像時,只需要添加新的層,原有的層不會被復制。

我們可以用 docker history 命令查看我們創(chuàng)建的鏡像,相同的層將共享且只保存一份。

root@ubuntu-xenial:~# docker history  nginx
IMAGE          CREATED      CREATED BY                                      SIZE      COMMENT
f6987c8d6ed5   6 days ago   /bin/sh -c #(nop)  CMD ["nginx" "-g" "daemon…   0B        
<missing>      6 days ago   /bin/sh -c #(nop)  STOPSIGNAL SIGQUIT           0B        
<missing>      6 days ago   /bin/sh -c #(nop)  EXPOSE 80                    0B        
<missing>      6 days ago   /bin/sh -c #(nop)  ENTRYPOINT ["/docker-entr…   0B        
<missing>      6 days ago   /bin/sh -c #(nop) COPY file:09a214a3e07c919a…   4.61kB    
<missing>      6 days ago   /bin/sh -c #(nop) COPY file:0fd5fca330dcd6a7…   1.04kB    
<missing>      6 days ago   /bin/sh -c #(nop) COPY file:0b866ff3fc1ef5b0…   1.96kB    
<missing>      6 days ago   /bin/sh -c #(nop) COPY file:65504f71f5855ca0…   1.2kB     
<missing>      6 days ago   /bin/sh -c set -x     && addgroup --system -…   61.1MB    
<missing>      6 days ago   /bin/sh -c #(nop)  ENV PKG_RELEASE=1~bullseye   0B        
<missing>      6 days ago   /bin/sh -c #(nop)  ENV NJS_VERSION=0.7.0        0B        
<missing>      6 days ago   /bin/sh -c #(nop)  ENV NGINX_VERSION=1.21.4     0B        
<missing>      6 days ago   /bin/sh -c #(nop)  LABEL maintainer=NGINX Do…   0B        
<missing>      7 days ago   /bin/sh -c #(nop)  CMD ["bash"]                 0B        
<missing>      7 days ago   /bin/sh -c #(nop) ADD file:09675d11695f65c55…   80.4MB    
root@ubuntu-xenial:~# docker history  nginx:new
IMAGE          CREATED          CREATED BY                                      SIZE      COMMENT
cb6c54821a51   15 seconds ago   nginx -g daemon off;                            1.11kB    
f6987c8d6ed5   6 days ago       /bin/sh -c #(nop)  CMD ["nginx" "-g" "daemon…   0B        
<missing>      6 days ago       /bin/sh -c #(nop)  STOPSIGNAL SIGQUIT           0B        
<missing>      6 days ago       /bin/sh -c #(nop)  EXPOSE 80                    0B        
<missing>      6 days ago       /bin/sh -c #(nop)  ENTRYPOINT ["/docker-entr…   0B        
<missing>      6 days ago       /bin/sh -c #(nop) COPY file:09a214a3e07c919a…   4.61kB    
<missing>      6 days ago       /bin/sh -c #(nop) COPY file:0fd5fca330dcd6a7…   1.04kB    
<missing>      6 days ago       /bin/sh -c #(nop) COPY file:0b866ff3fc1ef5b0…   1.96kB    
<missing>      6 days ago       /bin/sh -c #(nop) COPY file:65504f71f5855ca0…   1.2kB     
<missing>      6 days ago       /bin/sh -c set -x     && addgroup --system -…   61.1MB    
<missing>      6 days ago       /bin/sh -c #(nop)  ENV PKG_RELEASE=1~bullseye   0B        
<missing>      6 days ago       /bin/sh -c #(nop)  ENV NJS_VERSION=0.7.0        0B        
<missing>      6 days ago       /bin/sh -c #(nop)  ENV NGINX_VERSION=1.21.4     0B        
<missing>      6 days ago       /bin/sh -c #(nop)  LABEL maintainer=NGINX Do…   0B        
<missing>      7 days ago       /bin/sh -c #(nop)  CMD ["bash"]                 0B        
<missing>      7 days ago       /bin/sh -c #(nop) ADD file:09675d11695f65c55…   80.4MB    

我們可以在系統(tǒng)的 /var/lib/docker/<存儲驅動>/ 下看到我們所有的層。
第二個好處是啟動容器就變得非常輕量和快速。因為我們的容器只是添加了一個“空”的讀寫層,其他的都是復用的只讀層,需要用時才會去搜索。

存儲驅動類型

Docker 的存儲引擎針對不同的文件系統(tǒng),是由不同的存儲驅動。

Docker 主要有一下幾類存儲驅動:

  • overlay2:是當前版本推薦的存儲驅動,無需額外的依賴和配置即可發(fā)揮絕佳的性能。在 18.09 版本之后替換了 overlay 存儲驅動。支持 xfs(在ftype = 1的情況下),ext4 文件系統(tǒng)。
  • aufs:Docker 早期使用的存儲驅動,是 Docker 18.06 版本之前,Ubuntu 14.04 版本前推薦的。支持 xfs,ext4 文件系統(tǒng)。
  • devicemapper:是較早版本的 CentOS 和 RHEL 系統(tǒng)推薦的存儲驅動,因為它們不支持 overlay2,需要 direct-lvm 的支持。
  • btrfs:僅用于 btrfs 文件系統(tǒng)。
  • zfs:僅用于 zfs 文件系統(tǒng)。
  • vfs:不依賴于文件系統(tǒng),但是性能奇差,主要用來測試。

需要注意的是:

  1. overlay2、overlay、aufs 的層是基于文件的,當單文件的寫并發(fā)較高時需要大內存的支持,且讀寫層可能因為單個文件而變得很大。
  2. devicemapper、btrfs、zfs 的層是基于塊存儲的,因此對于單個文件的高并發(fā)影響不大。但是 btrfs 和 zfs 非常消耗內存。

有條件的情況下,我們還是建議選擇 overlay2 的存儲驅動。

OverlayFS

Linux 系統(tǒng)運行基礎

Linux 系統(tǒng)正常運行, 通常需要兩個文件系統(tǒng):

  • boot file system (bootfs)
    1. 包含 Boot Loader與Kernel文件,用戶不能修改這些文件。并且在系統(tǒng)啟動過程完成之后, 整個系統(tǒng)的內核都會被加載進內存。此時bootfs會被卸載, 從而釋放出所占用的系統(tǒng)內存。
    2. 在容器中可以運行不同版本的Linux, 說明對于同樣內核版本的不同的 Linux 發(fā)行版的 bootfs 都是一致的, 否則會無法啟動。因此可以推斷, Docker運行是需要內核支持的。
    3. Linux系統(tǒng)中典型的bootfs目錄: (核心) /boot/vmlinuz、(核心解壓縮所需 RAM Disk) /boot/initramfs
  • root file system (rootfs)
    1. 不同的Linux發(fā)行版本, bootfs相同, rootfs不同(二進制文件)。
    2. 每個容器有自己的 rootfs, 它來自不同的 Linux 發(fā)行版的基礎鏡像,包括 Ubuntu, Debian 和 SUSE 等。
    3. 使用不同的rootfs 就決定了, 在構建鏡像的過程中, 可以使用哪些系統(tǒng)的命令。
    4. 典型的rootfs 目錄: /dev、/proc、/bin、/etc、 /lib、/usr

OverlayFS 存儲原理

OverlayFS 是從 aufs 之上改進和簡化而來的,比 aufs 和 devicemapper 有更好的性能,大部分情況下也比 btrfs 好。
OverlayFS 結構分為三個層: LowerDir、Upperdir、MergedDir

  • LowerDir (只讀)
      只讀的 image layer,其實就是 rootfs, 在使用 Dockerfile 構建鏡像的時候, Image Layer
      可以分很多層,所以對應的 lowerdir 會很多(源鏡像)。
  • Upperdir (讀寫)
      upperdir 則是在 lowerdir 之上的一層, 為讀寫層。容器在啟動的時候會創(chuàng)建, 所有對容器的修改, 都是在這層。比如容器啟動寫入的日志文件,或者是應用程序寫入的臨時 文件。
  • MergedDir (展示)
      MergedDir 目錄是容器的掛載點,在用戶視角能夠看到的所有文件,都是從這層展示的。

LowerDir、Upperdir、MergedDir 關系圖:


image.png

特性:

  • 頁緩存:overlayFS 支持頁緩存分享,多個容器如果讀取相同層的同一個文件,可以共享頁緩存,有效利用內存,使得它對于高并發(fā)讀場景十分高效。
  • 層查找:由于第一次修改只讀層文件時需要復制到讀寫層,所以對于大文件會有一些延遲。但是 overlayFS 還是比 aufs 更快,因為在搜索和緩存方面做了不少優(yōu)化。
  • 重命名:overlayFS 不支持不同層文件的重命名操作,需要修改為復制然后刪除。

鏡像的存儲結構

獲取鏡像存儲路徑

$ docker inspect  image_name/image_id
....
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/0327c5b0651d542787c486344309f1d987c0d1eec7d295e3ddf7361cbf45d14a/diff:/var/lib/docker/overlay2/5cbce5e3378dcbefc0e07dcc1cbe3f613672b968ef4d597450d1339fed0a9d21/diff:/var/lib/docker/overlay2/806e3cb7df6da370e9a019a885c22910307a4ebc3134883c2e36192715add56a/diff:/var/lib/docker/overlay2/84909920ee1463c7a9705f45831b3e907a11a5ffa3c96a17c58393e63114fe6e/diff:/var/lib/docker/overlay2/9c2079932dd0a050d3454eebc76c4346d231e84d0e7a8201c526924cbe41e1ab/diff:/var/lib/docker/overlay2/d3b8fe7c368851b63c1124da1cf4c0d97c634ef92248dbf5262b38f761fe38d5/diff:/var/lib/docker/overlay2/403a4842e9b8a2c852db3b31c18a9ef7376e10745234cc888b45c8465b31d174/diff:/var/lib/docker/overlay2/a688eafd2e410fe43225cef2d996f6253fa703f77ad52f313441b1ca137d2cb4/diff:/var/lib/docker/overlay2/084c86479601559bb4343476d18b5f3f9f3da731e8ba707a7f9276cb58a14fe8/diff:/var/lib/docker/overlay2/ca83b1c8447afdad29673acab13991cd83cd4899dd9370c58d45fc7ee8d34219/diff:/var/lib/docker/overlay2/1d638b9f12f3cf0c3b053397125d5ed1ae72a547d578554bee308ee190b691b3/diff:/var/lib/docker/overlay2/b30c6ef11cfda30e33f32e3a424540b4524da983a56cc2e2eabad377ea68d79e/diff:/var/lib/docker/overlay2/ac90cb8b9581f49992cd89e9df290679446b12d7bce36a8eb7f102c884d9cbcd/diff:/var/lib/docker/overlay2/c2ba4deaf300a91e9397d0182f39d69c2aea12c51476dd1da7ad81f809e576d0/diff:/var/lib/docker/overlay2/eaef62ff1f48ec98c92f9e4899ccacbf493a4645f2b6aa8777cc0571fcc37e72/diff:/var/lib/docker/overlay2/8441b589ff918a8f7b2db46ad3f2f2a6127513e161def9210f0e61795057c807/diff:/var/lib/docker/overlay2/3be68f22f189552deb55dfdcaa8231d304a6f8816eb196cb4821f23c7dad6dc9/diff:/var/lib/docker/overlay2/1ea1c6405f0375db13fd030486bbef0bffbe66622eb9ea221c7a7cfda84f6046/diff:/var/lib/docker/overlay2/2252a056d693614157e76b6ac07ba8abdf3feeaaa15df6468f85cebb98bd49e9/diff:/var/lib/docker/overlay2/53adfc7fdc3df9e0728346b657a8c2bc3279d277a7dc70fc9e7d951b4adba271/diff",
                "MergedDir": "/var/lib/docker/overlay2/437f0702dae3b6fc6e6bd220578c9b4e415c3c53a621b9150ddd170c9f08fe11/merged",
                "UpperDir": "/var/lib/docker/overlay2/437f0702dae3b6fc6e6bd220578c9b4e415c3c53a621b9150ddd170c9f08fe11/diff",
                "WorkDir": "/var/lib/docker/overlay2/437f0702dae3b6fc6e6bd220578c9b4e415c3c53a621b9150ddd170c9f08fe11/work"
            },
            "Name": "overlay2"
        },
....

Lower層
  LowerDir 層的存儲是不允許創(chuàng)建文件, 此時的LowerDir實際上是其他的鏡像的UpperDir層,也就是說在構建鏡像的時候, 如果發(fā)現(xiàn)構建的內容相同, 那么不會重復的構建目錄,而是使用其他鏡像的Upper 層來作為本鏡像的Lower
Merged層
  屬于對外展示層,只能在運行中的容器查看,鏡像是查看不了的

運行中容器的存儲結構

  1. 啟動一個容器
 docker run -d -it image_name sleep 1000
  1. 查看容器的存儲目錄信息
    容器啟動以后,掛載merged、lowerdir、upperdir以及workdir目錄
    lowerdir是只讀的image layer,其實就是rootfs
$ docker ps
CONTAINER ID   IMAGE          COMMAND        CREATED          STATUS          PORTS     NAMES
f25670308855   e2c4afea8894   "sleep 1000"   58 seconds ago   Up 57 seconds             quirky_cray
$ docker inspect quirky_cray <--容器名稱
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/5c87fd383ad3cef80e09301ccb535ee1b67f6f696b378107a09d9d0c33ddec6a-init/diff:/var/lib/docker/overlay2/437f0702dae3b6fc6e6bd220578c9b4e415c3c53a621b9150ddd170c9f08fe11/diff:/var/lib/docker/overlay2/0327c5b0651d542787c486344309f1d987c0d1eec7d295e3ddf7361cbf45d14a/diff:/var/lib/docker/overlay2/5cbce5e3378dcbefc0e07dcc1cbe3f613672b968ef4d597450d1339fed0a9d21/diff:/var/lib/docker/overlay2/806e3cb7df6da370e9a019a885c22910307a4ebc3134883c2e36192715add56a/diff:/var/lib/docker/overlay2/84909920ee1463c7a9705f45831b3e907a11a5ffa3c96a17c58393e63114fe6e/diff:/var/lib/docker/overlay2/9c2079932dd0a050d3454eebc76c4346d231e84d0e7a8201c526924cbe41e1ab/diff:/var/lib/docker/overlay2/d3b8fe7c368851b63c1124da1cf4c0d97c634ef92248dbf5262b38f761fe38d5/diff:/var/lib/docker/overlay2/403a4842e9b8a2c852db3b31c18a9ef7376e10745234cc888b45c8465b31d174/diff:/var/lib/docker/overlay2/a688eafd2e410fe43225cef2d996f6253fa703f77ad52f313441b1ca137d2cb4/diff:/var/lib/docker/overlay2/084c86479601559bb4343476d18b5f3f9f3da731e8ba707a7f9276cb58a14fe8/diff:/var/lib/docker/overlay2/ca83b1c8447afdad29673acab13991cd83cd4899dd9370c58d45fc7ee8d34219/diff:/var/lib/docker/overlay2/1d638b9f12f3cf0c3b053397125d5ed1ae72a547d578554bee308ee190b691b3/diff:/var/lib/docker/overlay2/b30c6ef11cfda30e33f32e3a424540b4524da983a56cc2e2eabad377ea68d79e/diff:/var/lib/docker/overlay2/ac90cb8b9581f49992cd89e9df290679446b12d7bce36a8eb7f102c884d9cbcd/diff:/var/lib/docker/overlay2/c2ba4deaf300a91e9397d0182f39d69c2aea12c51476dd1da7ad81f809e576d0/diff:/var/lib/docker/overlay2/eaef62ff1f48ec98c92f9e4899ccacbf493a4645f2b6aa8777cc0571fcc37e72/diff:/var/lib/docker/overlay2/8441b589ff918a8f7b2db46ad3f2f2a6127513e161def9210f0e61795057c807/diff:/var/lib/docker/overlay2/3be68f22f189552deb55dfdcaa8231d304a6f8816eb196cb4821f23c7dad6dc9/diff:/var/lib/docker/overlay2/1ea1c6405f0375db13fd030486bbef0bffbe66622eb9ea221c7a7cfda84f6046/diff:/var/lib/docker/overlay2/2252a056d693614157e76b6ac07ba8abdf3feeaaa15df6468f85cebb98bd49e9/diff:/var/lib/docker/overlay2/53adfc7fdc3df9e0728346b657a8c2bc3279d277a7dc70fc9e7d951b4adba271/diff",
                "MergedDir": "/var/lib/docker/overlay2/5c87fd383ad3cef80e09301ccb535ee1b67f6f696b378107a09d9d0c33ddec6a/merged",
                "UpperDir": "/var/lib/docker/overlay2/5c87fd383ad3cef80e09301ccb535ee1b67f6f696b378107a09d9d0c33ddec6a/diff",
                "WorkDir": "/var/lib/docker/overlay2/5c87fd383ad3cef80e09301ccb535ee1b67f6f696b378107a09d9d0c33ddec6a/work"
            },
            "Name": "overlay2"
        },

注意在所有的啟動容器中會自動添加init目錄, 此目錄是存放系統(tǒng)的hostname與域名解析文件。

  • UpperDir目錄
# 本地窗口
# 查看UpperDir目錄
$ ls -l /var/lib/docker/overlay2/5c87fd383ad3cef80e09301ccb535ee1b67f6f696b378107a09d9d0c33ddec6a/diff
total 0
# 從本地往UpperDir目錄創(chuàng)建一個test.txt
$ echo "aaaaa" > /var/lib/docker/overlay2/5c87fd383ad3cef80e09301ccb535ee1b67f6f696b378107a09d9d0c33ddec6a/diff/test.txt
# 進到容器中
$ docker exec -it quirky_cray /bin/bash <--容器名稱
root@092e30a6ce1c:~# cat /test.txt 
aaaaa
  • WorkDir 目錄
    work目錄用于聯(lián)合掛載指定的工作目錄,在overlay 把文件掛載到 upperdir后, work內容會
    被清空,且在使用過程中(為空)其內容用戶不可見。
  • MergedDir
    用戶視角層Merged,最后給用戶展示的層,一般看到為一個完整的操作系統(tǒng)文件系統(tǒng)結構
$ ls -l /var/lib/docker/overlay2/88d2db63b784f534166c0d4c53860841846ffcf1119f918724bf3d0141e05f0c/merged
total 112
drwxr-xr-x 1 root root  4096 Apr  4  2019 bin
drwxr-xr-x 2 root root  4096 Apr 12  2016 boot
drwxr-xr-x 1 root root  4096 Nov  2  2020 builds
drwxr-xr-x 1 root root  4096 Dec 30 07:26 dev
drwxr-xr-x 1 root root  4096 Dec 30 07:26 etc
drwxr-xr-x 2 root root  4096 Apr 12  2016 home
drwxr-xr-x 1 root root  4096 Apr  4  2019 lib
drwxr-xr-x 2 root root  4096 Feb 22  2019 lib64
drwxr-xr-x 2 root root  4096 Feb 22  2019 media
drwxr-xr-x 2 root root  4096 Feb 22  2019 mnt
drwxr-xr-x 2 root root  4096 Feb 22  2019 opt
drwxr-xr-x 2 root root  4096 Apr 12  2016 proc
drwx------ 1 root root  4096 Dec 30 07:27 root
drwxr-xr-x 1 root root  4096 Feb 22  2019 run
drwxr-xr-x 1 root root  4096 Apr  4  2019 sbin
drwxr-xr-x 2 root root  4096 Feb 22  2019 srv
drwxr-xr-x 2 root root  4096 Feb  5  2016 sys
-rw-r--r-- 1 root root     6 Dec 30 07:27 test.txt  <--- 剛上面新建在upperdir的test.txt
drwxrwxrwt 1 root root  4096 Nov  2  2020 tmp
drwxr-xr-x 1 root root  4096 Feb 22  2019 usr
drwxr-xr-x 1 root root  4096 Feb 22  2019 var
  • LowerDIR

Lower 包括兩個層:

  1. 系統(tǒng)的init.
  2. 容器的鏡像層
# Lower 記錄父層的鏈接名稱
$ cat /var/lib/docker/overlay2/88d2db63b784f534166c0d4c53860841846ffcf1119f918724bf3d0141e05f0c/lower 
l/VZFTLWDPDFGVUW6S4CA3OVLG22:l/A37ZDWLC7UOVJU5LSLMQHNS5L6:l/ZTFFTXEEQ35OW5TPEPH6C5WEY4:l/O5LIFSRLRPM4J63VJEVOV5G3NX:l/ZU5QLLMTYV6QLLXU6DCQJ7GB3X:l/RVFWKDTLUID2HM2Y6LENWJS523:l/HFCUBNMRHLMUSOIM7TET53364W:l/NTZCQMDR7N4O5TMLUSR3V6Z4WU:l/G7GIGWRGIX7BWT57427DEW56VW:l/54Q6NV4E4DGJDSSAVL6M4TZGAC:l/BYHMNYRKWRUD5RANQBGYSOA2R7:l/7SH4TSBXZUWX2BFRMZ6IMFBPSR:l/G3ASWW6VQD35V27H44M2AL5KND:l/YHQN7DAE6KXFZHLBSSGD2ADECT:l/IV3YRJ4ORC5MAA7VIKF4SYKU25:l/AEGSOCDTU3U4SDM6E2MZL5JCVQ:l/EM7ITWJMMP27RXFOGECQZRS2UR:l/EBXT7QYTI3PB4BBMQQLTR7WYI2:l/KDPDQHYJGIG7SLOZ5MCFZ2DM4A:l/XXBANUVUSORSWVS4KMENUAGBEJ:l/7ZZT3RDAVHOR65KBTW5AHF2DR4:l/UT5W7YPX2NJK2GEMIOMAJPELHY

1)查看init層地址指向
  容器在啟動的過程中, Lower 會自動掛載init的一些文件

$ ls /var/lib/docker/overlay2/88d2db63b784f534166c0d4c53860841846ffcf1119f918724bf3d0141e05f0c-init/diff
dev  etc
$ ls /var/lib/docker/overlay2/88d2db63b784f534166c0d4c53860841846ffcf1119f918724bf3d0141e05f0c-init/diff/etc/
hostname  hosts  mtab  resolv.conf

2) init層主要內容是什么?
  init層是以一個uuid+-init結尾表示,放在只讀層(Lowerdir)和讀寫層(Upperdir)之間,
  作用只是存放/etc/hosts、/etc/resolv.conf 等文件。
3) 為什么需要init層?
  (1) 容器在啟動以后, 默認情況下lower層是不能夠修改內容的, 但是用戶有需求需要修改主機名與域名地址, 那么就需要添加init層中的文件(hostname, resolv.conf), 用于解決此類問題.
  (2) 修改的內容只對當前的容器生效, 而在docker commit提交為鏡像時候,并不會將init層提交。
  (3) init 文件存放的目錄為/var/lib/docker/overlay2/<init_id>/diff
4) 查看init層文件
  hostname與resolv.conf 全部為空文件, 在系統(tǒng)啟動以后由系統(tǒng)寫入。

注:不能在打鏡像的時候copy進去,copy進去用這個鏡像啟動時,啟動起來以后文件也是空的。

$ ls -l /var/lib/docker/overlay2/88d2db63b784f534166c0d4c53860841846ffcf1119f918724bf3d0141e05f0c-init/diff/etc/
total 0
-rwxr-xr-x 1 root root  0 Dec 30 07:26 hostname
-rwxr-xr-x 1 root root  0 Dec 30 07:26 hosts
lrwxrwxrwx 1 root root 12 Dec 30 07:26 mtab -> /proc/mounts
-rwxr-xr-x 1 root root  0 Dec 30 07:26 resolv.conf

更改Docker存儲引擎

查看當前docker的存儲引擎

# docker info
...
 Server Version: 20.10.7
 Storage Driver: overlay2
  Backing Filesystem: extfs
  Supports d_type: true
  Native Overlay Diff: true
  userxattr: false

更改docker的存儲引擎

配置 Docker 存儲驅動非常簡單,只需要修改配置文件即可。

注意:
如果你原先有不同存儲驅動的層數(shù)據(jù),更換存儲驅動后將不可用,建議備份鏡像并清除 /var/lib/docker 下所有數(shù)據(jù)。 備份鏡像可以用 docker save 導出鏡像,之后用 docker load 導入鏡像。

方法1

  1. 創(chuàng)建或修改文件 /etc/docker/daemon.json 并添加
{
 "storage-driver": "overlay2"
}
  1. 重啟 Docker
systemctl restart docker

方法2

#修改/lib/systemd/system/docker.service 
......
ExecStart=/usr/bin/dockerd -s=overlay2
......
# 然后重啟 Docker
systemctl daemon-reload
systemctl restart docker
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Storage Driver查詢 可以使用docker info命令查看你的Docker使用的storage dr...
    梅_梅閱讀 3,631評論 1 5
  • OverlayFS是一個類似于AUFS 的現(xiàn)代聯(lián)合文件系統(tǒng),更快實現(xiàn)簡單。 OverlayFS是內核提供的文件系統(tǒng)...
    haodevops閱讀 1,216評論 0 0
  • Docker 一、Namespace:名稱空間,主要用于容器間的資源隔離,每個容器都運行在各自的不同的名稱空間,各...
    花花遴20102967閱讀 981評論 1 0
  • 認識容器 Namespace幫助容器來實現(xiàn)各種計算資源的隔離,Cgroups主要限制的是容器能夠使用的某種資源量。...
    一生逍遙一生閱讀 1,063評論 0 1
  • docker最早是LXC(Linux Container)的二次封裝發(fā)行,后來使用的是Libcontainer技術...
    OOM_Killer閱讀 718評論 0 0

友情鏈接更多精彩內容