VFS 存储驱动程序
VFS 存储驱动不是联合文件系统。每一层都是磁盘上的一个目录,且不支持写时复制。要创建新层,需要对前一层进行“深拷贝”。这会导致性能较低,并且比其他存储驱动占用更多的磁盘空间。然而,它稳健、稳定,并且适用于所有环境。它还可以作为在测试环境中验证其他存储后端的机制。
使用 vfs 存储驱动程序配置 Docker
停止 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/ 内的子目录形式表示。联合挂载提供了所有层的统一视图。目录名称并不直接对应于层本身的 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存储驱动器的缺点之一。