88 lines
4.2 KiB
Markdown
88 lines
4.2 KiB
Markdown
|
---
|
|||
|
outline: [2,5]
|
|||
|
---
|
|||
|
|
|||
|
# VFS 存储驱动程序
|
|||
|
|
|||
|
VFS 存储驱动程序不是联合文件系统。每个层都是磁盘上的一个目录,并且不支持写入时复制。要创建新图层,需要对前一图层进行“深层复制”。与其他存储驱动程序相比,这会导致性能较低且磁盘上使用的空间更多。但是,它健壮、稳定,并且适用于各种环境。它还可以用作在测试环境中验证其他存储后端的机制。
|
|||
|
|
|||
|
## 使用 `vfs` 存储驱动程序配置 Docker
|
|||
|
1. 停止 Docker。
|
|||
|
```bash
|
|||
|
sudo systemctl stop docker
|
|||
|
```
|
|||
|
2. 编辑 `/etc/docker/daemon.json`。如果尚不存在,请创建它。假设文件为空,请添加以下内容。
|
|||
|
```json
|
|||
|
{
|
|||
|
"storage-driver": "vfs"
|
|||
|
}
|
|||
|
```
|
|||
|
如果要设置配额来控制 VFS 存储驱动程序可以使用的最大大小,请在 `storage-opts` 键上设置 `size` 选项。
|
|||
|
```json
|
|||
|
{
|
|||
|
"storage-driver": "vfs",
|
|||
|
"storage-opts": ["size=256M"]
|
|||
|
}
|
|||
|
```
|
|||
|
如果 `daemon.json` 文件包含无效的 JSON,则 Docker 不会启动。
|
|||
|
|
|||
|
3. 启动 Docker。
|
|||
|
```bash
|
|||
|
sudo systemctl start docker
|
|||
|
```
|
|||
|
4. 验证守护程序是否正在使用 `vfs` 存储驱动程序。使用 `docker info` 命令并查找 `Storage Driver`。
|
|||
|
```bash
|
|||
|
docker info
|
|||
|
|
|||
|
Storage Driver: vfs
|
|||
|
...
|
|||
|
```
|
|||
|
Docker 现在正在使用 `vfs` 存储驱动程序。Docker 已自动创建 `/var/lib/docker/vfs/` 目录,其中包含正在运行的容器使用的所有层。
|
|||
|
|
|||
|
## `vfs` 存储驱动程序的工作原理
|
|||
|
每个映像层和可写容器层在 Docker 主机上表示为 `/var/lib/docker/` 中的子目录。union 挂载提供所有层的统一视图。目录名称并不直接与层本身的 ID 对应。
|
|||
|
|
|||
|
VFS 不支持写入时复制 (COW)。每次创建新图层时, 它是其父图层的深层副本。这些图层都位于 `/var/lib/docker/vfs/dir/` 中。
|
|||
|
|
|||
|
### 示例:映像和容器磁盘构造
|
|||
|
以下 `docker pull` 命令显示了一个 Docker 主机正在下载一个包含五个层的 Docker 镜像。
|
|||
|
```bash
|
|||
|
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` 命令,该命令将大小作为人类可读的值提供。
|
|||
|
```bash
|
|||
|
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
|
|||
|
```
|
|||
|
```bash
|
|||
|
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` 存储驱动程序的缺点之一。
|
|||
|
|
|||
|
## 相关信息
|
|||
|
- [了解映像、容器和存储驱动程序](./../drivers/)
|
|||
|
- [选择存储驱动程序](./select-storage-driver)
|