使用VFS存储驱动程序

预计阅读时间:3分钟

VFS存储驱动程序不是联合文件系统。相反,每一层都是磁盘上的目录,并且不支持写时复制。要创建一个新层,需要对上一层进行“深度复制”。与其他存储驱动程序相比,这导致较低的性能和更多的磁盘空间使用。但是,它是健壮,稳定的,并且可以在每种环境下工作。在测试环境中,它还可以用作验证其他存储后端所依据的机制。

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

  1. 停止Docker。

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

    {
      "storage-driver": "vfs"
    }
    

    如果要设置配额以控制VFS存储驱动程序可以使用的最大大小size,请在storage-opts密钥上设置该选项。

    {
      "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存储驱动程序如何工作

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存储驱动程序的缺点之一 。

容器存储驱动程序vfs