VFS 存储驱动程序

VFS 存储驱动程序不是联合文件系统。每个层都是一个 目录中,并且不支持写入时复制。要创建新的 层,则对前一层进行 “深层复制”。这导致 性能以及磁盘上比其他存储驱动程序使用的更多空间。但是,它 健壮、稳定,适用于各种环境。它也可以用作 在测试环境中验证其他存储后端的机制。

使用 vfs 存储驱动程序配置 Docker

  1. 停止 Docker。

    $ sudo systemctl stop docker
    
  2. 编辑。如果尚不存在,请创建它。若 该文件为空,请添加以下内容。/etc/docker/daemon.json

    {
      "storage-driver": "vfs"
    }

    如果要设置配额以控制 VFS 存储的最大大小 driver 可以使用,在键上设置选项。sizestorage-opts

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

    如果文件包含无效的 JSON,则 Docker 不会启动。daemon.json

  3. 启动 Docker。

    $ sudo systemctl start docker
    
  4. 验证守护程序是否正在使用存储驱动程序。 使用命令并查找 .vfsdocker infoStorage Driver

    $ docker info
    
    Storage Driver: vfs
    ...
    

Docker 现在正在使用存储驱动程序。Docker 会自动 创建了包含所有层的目录 由正在运行的容器使用。vfs/var/lib/docker/vfs/

vfs 存储驱动程序的工作原理

每个镜像层和可写容器层都表示在 Docker 上 host 作为 中的子目录。union 挂载提供 所有图层的统一视图。目录名称不直接对应于 图层本身的 ID。/var/lib/docker/

VFS 不支持写入时复制 (COW)。每次创建新图层时, 它是其父图层的深层副本。这些图层都位于 下。/var/lib/docker/vfs/dir/

示例:镜像和容器磁盘构造

以下命令显示了下载 Docker 的 Docker 主机 镜像包含五个图层。docker pull

$ 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

拉取后,这些层中的每一个都表示为 的子目录。目录名称与 命令中显示的镜像图层 ID。查看占用的大小 disk 上,您可以使用命令,该命令将大小指定为 人类可读的值。/var/lib/docker/vfs/dir/docker pulldu -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。 这些目录彼此之间只有很小的差异,但它们都 占用相同数量的磁盘空间。这是 使用 Storage 驱动程序。vfs