VFS 驱动
VFS
存储驱动程序不是联合文件系统; 相反,每一层都是磁盘上的一个目录,并且不支持 copy-on-write
(写时复制)。
要创建新层,需要对前一层进行 deep copy
(深度拷贝)。与其他存储驱动程序相比,这会导致性能较低且磁盘上使用的空间较多。
然而,它强大、稳定,并且适用于各种环境。 它还可以用作在测试环境中验证其他存储后端的机制。
配置 Docker
使用 VFS
存储驱动程序
-
stop Docker
$ sudo systemctl stop docker
-
编辑
/etc/docker/daemon.json
。 如果它尚不存在,请创建它。 假设该文件为空,添加以下内容。{ "storage-driver": "vfs" }
VFS
存储驱动程序可以使用的最大 size,请在storage-opts
选项上设置size
。{ "storage-driver": "vfs", "storage-opts": ["size=256M"] }
daemon.json
文件包含格式错误的 JSON,则 Docker 不会启动。 -
start Docker
$ sudo systemctl start docker
-
验证守护程序是否正在使用
vfs
存储驱动程序。 使用docker info
命令并查找存储驱动程序。$ docker info Storage Driver: vfs ...
Docker 现在使用vfs
存储驱动程序。 Docker 已自动创建/var/lib/docker/vfs/
目录,其中包含运行容器所使用的所有层。
VFS
存储驱动程序是如何工作的
VFS
不是联合文件系统。 相反,每个镜像层和可写容器层在 Docker 主机上都表示为/var/lib/docker/
中的子目录。
联合安装提供所有层的统一视图。 目录名称并不直接对应于层本身的 ID。
VFS
不支持写时复制(COW),因此每次创建新层时,它都是其父层的深层副本。 这些层都位于/var/lib/docker/vfs/dir/
下。
Example: 镜像和容器在磁盘上的构成
以下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 不相关。
要查看每层在磁盘上占用的大小,可以使用do -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
存储驱动程序的缺点之一。