VFS 儲存驅動程式
VFS 儲存驅動程式並非聯合檔案系統 (union filesystem)。每個層級都是磁碟上的一個目錄,且不支援寫入時複製 (copy-on-write)。若要建立新層級,系統會對前一層級執行「深層複製 (deep copy)」。這導致其效能較其他儲存驅動程式低,且在磁碟上佔用的空間更多。然而,它非常健壯、穩定,並且可在任何環境下運作。它也可以在測試環境中作為驗證其他儲存後端的機制。
設定 Docker 使用 vfs 儲存驅動程式
停止 Docker。
$ sudo systemctl stop docker編輯
/etc/docker/daemon.json。如果該檔案尚不存在,請建立它。假設該檔案原為空白,請加入以下內容。{ "storage-driver": "vfs" }如果您想要設定配額以控制 VFS 儲存驅動程式可使用的最大空間,請在
storage-opts金鑰中設定size選項。{ "storage-driver": "vfs", "storage-opts": ["size=256M"] }如果
daemon.json檔案包含無效的 JSON,Docker 將無法啟動。啟動 Docker。
$ sudo systemctl start docker驗證常駐程式是否正在使用
vfs儲存驅動程式。請使用docker info指令並查看Storage Driver欄位。$ docker info Storage Driver: vfs ...
Docker 現在已使用 vfs 儲存驅動程式。Docker 已自動建立 /var/lib/docker/vfs/ 目錄,其中包含執行中容器所使用的所有層級。
vfs 儲存驅動程式的運作方式
每個映像檔層級和可寫入的容器層級都會在 Docker 主機上表示為 /var/lib/docker/ 中的子目錄。聯合掛載 (union mount) 提供了所有層級的統一視圖。目錄名稱並不直接對應到層級本身的 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 儲存驅動程式的缺點之一。