VFS 儲存驅動程式

VFS 儲存驅動程式不是聯合檔案系統。每一層都是磁碟上的目錄,且不支援寫入時複製。要建立新的層,會對前一層進行「深度複製」。這會導致效能降低,且佔用的磁碟空間比其他儲存驅動程式更多。然而,它很強固、穩定,並且在每個環境中都能運作。它也可以在測試環境中用作驗證其他儲存後端的機制。

使用 vfs 儲存驅動程式設定 Docker

  1. 停止 Docker。

    $ sudo systemctl stop docker
    
  2. 編輯 /etc/docker/daemon.json。如果它不存在,請建立它。假設檔案是空的,請新增以下內容。

    {
      "storage-driver": "vfs"
    }

    如果您想設定配額來控制 VFS 儲存驅動程式可使用的最大大小,請在 storage-opts 鍵上設定 size 選項。

    {
      "storage-driver": "vfs",
      "storage-opts": ["size=256M"]
    }

    如果 daemon.json 檔案包含無效的 JSON,Docker 將無法啟動。

  3. 啟動 Docker。

    $ sudo systemctl start docker
    
  4. 確認守護行程正在使用 vfs 儲存驅動程式。使用 docker info 命令並尋找 Storage Driver

    $ docker info
    
    Storage Driver: vfs
    ...
    

Docker 現在正在使用 vfs 儲存驅動程式。Docker 已自動建立 /var/lib/docker/vfs/ 目錄,其中包含執行中容器使用的所有層。

vfs 儲存驅動程式的運作方式

每個映像檔層和可寫入的容器層在 Docker 主機上都表示為 /var/lib/docker/ 內的子目錄。聯合掛載提供了所有層的統一視圖。目錄名稱並未直接對應到層本身的 ID。

VFS 不支援寫入時複製 (COW)。每次建立新的層時,它都是其父層的深度複製。這些層都位於 /var/lib/docker/vfs/dir/ 下。

範例:映像檔和容器的磁碟結構

以下 docker pull 命令顯示 Docker 主機正在下載一個由五層組成的 Docker 映像檔。

$ docker pull ubuntu

Using default tag: latest
latest: Pulling from library/ubuntu
e0a742c2abfd: Pull complete
486cb8339a27: Pull complete
dc6f0d824617: Pull complete
4f7a5649a30e: Pull complete
672363445ad2: Pull complete
Digest: sha256:84c334414e2bfdcae99509a6add166bbb4fa4041dc3fa6af08046a66fed3005f
Status: Downloaded newer image for ubuntu:latest

提取後,這些層中的每一層都表示為 /var/lib/docker/vfs/dir/ 的子目錄。目錄名稱與 docker pull 命令中顯示的映像檔層 ID 無關。要查看每個層在磁碟上佔用的空間大小,您可以使用 du -sh 命令,它會以人類可讀的值顯示大小。

$ ls -l /var/lib/docker/vfs/dir/

total 0
drwxr-xr-x.  2 root root  19 Aug  2 18:19 3262dfbe53dac3e1ab7dcc8ad5d8c4d586a11d2ac3c4234892e34bff7f6b821e
drwxr-xr-x. 21 root root 224 Aug  2 18:23 6af21814449345f55d88c403e66564faad965d6afa84b294ae6e740c9ded2561
drwxr-xr-x. 21 root root 224 Aug  2 18:23 6d3be4585ba32f9f5cbff0110e8d07aea5f5b9fbb1439677c27e7dfee263171c
drwxr-xr-x. 21 root root 224 Aug  2 18:23 9ecd2d88ca177413ab89f987e1507325285a7418fc76d0dcb4bc021447ba2bab
drwxr-xr-x. 21 root root 224 Aug  2 18:23 a292ac6341a65bf3a5da7b7c251e19de1294bd2ec32828de621d41c7ad31f895
drwxr-xr-x. 21 root root 224 Aug  2 18:23 e92be7a4a4e3ccbb7dd87695bca1a0ea373d4f673f455491b1342b33ed91446b
$ du -sh /var/lib/docker/vfs/dir/*

4.0K	/var/lib/docker/vfs/dir/3262dfbe53dac3e1ab7dcc8ad5d8c4d586a11d2ac3c4234892e34bff7f6b821e
125M	/var/lib/docker/vfs/dir/6af21814449345f55d88c403e66564faad965d6afa84b294ae6e740c9ded2561
104M	/var/lib/docker/vfs/dir/6d3be4585ba32f9f5cbff0110e8d07aea5f5b9fbb1439677c27e7dfee263171c
125M	/var/lib/docker/vfs/dir/9ecd2d88ca177413ab89f987e1507325285a7418fc76d0dcb4bc021447ba2bab
104M	/var/lib/docker/vfs/dir/a292ac6341a65bf3a5da7b7c251e19de1294bd2ec32828de621d41c7ad31f895
104M	/var/lib/docker/vfs/dir/e92be7a4a4e3ccbb7dd87695bca1a0ea373d4f673f455491b1342b33ed91446b

以上輸出顯示三層各佔用 104M,兩層各佔用 125M。這些目錄彼此之間只有很小的差異,但它們都佔用相同的磁碟空間。這是使用 vfs 儲存驅動程式的缺點之一。