diff --git a/.vitepress/config.mts b/.vitepress/config.mts index a6b747d..76b55e5 100644 --- a/.vitepress/config.mts +++ b/.vitepress/config.mts @@ -42,7 +42,10 @@ export default defineConfig({ { text: "选择存储驱动程序", link: '/docs/storage/drivers/select-storage-driver' }, { text: "BTRFS 存储驱动程序", link: '/docs/storage/drivers/btrfs-driver/' }, { text: "设备映射器存储驱动程序(已弃用)", link: '/docs/storage/drivers/device-mapper-driver/'}, - { text: "OverlayFS 存储驱动程序", link: '/docs/storage/drivers/overlayfs-driver/'} + { text: "OverlayFS 存储驱动程序", link: '/docs/storage/drivers/overlayfs-driver/'}, + { text: "VFS 存储驱动程序", link: '/docs/storage/drivers/vfs-driver/'}, + { text: "WindowsFilter 存储驱动程序", link: '/docs/storage/drivers/windowsfilter-driver/'}, + { text: "ZFS 存储驱动程序", link: '/docs/storage/drivers/zfs-driver/'}, ] }, { text: 'containerd 映像存储', link: '/docs/storage/container-image-store' } diff --git a/docs/storage/drivers/vfs-driver.md b/docs/storage/drivers/vfs-driver.md new file mode 100644 index 0000000..7b8780f --- /dev/null +++ b/docs/storage/drivers/vfs-driver.md @@ -0,0 +1,88 @@ +--- +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) \ No newline at end of file diff --git a/docs/storage/drivers/windowsfilter-driver.md b/docs/storage/drivers/windowsfilter-driver.md new file mode 100644 index 0000000..c7688a9 --- /dev/null +++ b/docs/storage/drivers/windowsfilter-driver.md @@ -0,0 +1,29 @@ +--- +outline: [2,5] +--- + +# WindowsFilter 存储驱动程序 + +windowsfilter 存储驱动程序是 Windows 上 Docker Engine 的默认存储驱动程序。windowsfilter 驱动程序使用 Windows 原生文件系统层在磁盘上存储 Docker 层和卷数据。windowsfilter 存储驱动程序仅适用于使用 NTFS 格式化的文件系统。 + +## 配置 windowsfilter 存储驱动程序 + +对于大多数用例,无需配置 windowsfilter 存储驱动程序。 + +Windows 上 Docker Engine 的默认存储限制为 127GB。若要使用不同的存储大小,请为 windowsfilter 存储设置 size 选项 司机。看 [windowsfilter 选项])[0]。 + +默认情况下,数据存储在 Docker 主机上 `C:\ProgramData\docker` 的 `image` 和 `windowsfilter` 子目录中。您可以通过在 [守护进程配置文件][1]: +```bash +{ + "data-root": "d:\\docker" +} +``` +您必须重新启动守护程序才能使配置更改生效。 + +## 其他信息: +有关容器存储在 Windows 上的工作原理的更多信息,请参阅 Microsoft 的 [Windows 上的容器文档][3]。 + + +[0]:https://docs.docker.com/reference/cli/dockerd/#windowsfilter-options +[1]:https://docs.docker.com/reference/cli/dockerd/#on-windows +[3]:https://learn.microsoft.com/en-us/virtualization/windowscontainers/manage-containers/container-storage \ No newline at end of file diff --git a/docs/storage/drivers/zfs-driver.md b/docs/storage/drivers/zfs-driver.md new file mode 100644 index 0000000..538e135 --- /dev/null +++ b/docs/storage/drivers/zfs-driver.md @@ -0,0 +1,149 @@ +--- +outline: [2,5] +--- + +# ZFS 存储驱动程序 +ZFS 是下一代文件系统,支持许多高级存储技术,如卷管理、快照、校验和、压缩和重复数据删除、复制等。 + +它由 Sun Microsystems(现为 Oracle Corporation)创建,并根据 CDDL 许可证进行开源。由于 CDDL 和 GPL 之间的许可不兼容,ZFS 不能作为主线 Linux 内核的一部分提供。但是,ZFS On Linux (ZoL) 项目提供了树外内核模块和用户空间工具,这些工具可以单独安装。 + +ZFS on Linux (ZoL) 端口运行状况良好且日趋成熟。但是,目前不建议将 `zfs` Docker 存储驱动程序用于生产用途,除非您在 Linux 上具有丰富的 ZFS 使用经验。 + +:::warning 注意 +Linux 平台上还有一个 ZFS 的 FUSE 实现。不建议这样做。本机 ZFS 驱动程序 (ZoL) 经过了更多的测试,具有更好的性能,并且使用范围更广。本文档的其余部分涉及本机 ZoL 端口。 +::: + +## 先决条件 +- ZFS 需要一个或多个专用块设备,最好是固态驱动器 (SSD)。 +- `/var/lib/docker/` 目录必须挂载在 ZFS 格式的文件系统上。 +- 更改存储驱动程序将使您已创建的任何容器在本地系统上都无法访问。使用 `docker save` 保存容器,并将现有镜像推送到 Docker Hub 或私有存储库,这样您以后就不需要重新创建它们。 + +:::warning 注意 +无需使用 `MountFlags=slave`,因为 `dockerd` 和 `containerd` 位于不同的挂载命名空间中。 +::: + +## 使用 `zfs` 存储驱动程序配置 Docker +1. 停止 Docker。 +2. 将 `/var/lib/docker/` 的内容复制到 `/var/lib/docker.bk`,并删除 `/var/lib/docker/` 的内容。 +```bash +sudo cp -au /var/lib/docker /var/lib/docker.bk + +sudo rm -rf /var/lib/docker/* +``` +3. 在专用块设备或设备上创建新的 `zpool`,并将其挂载到 `/var/lib/docker/` 中。请确保指定了正确的设备,因为这是破坏性操作。此示例将两个设备添加到池中。 +```bash +sudo zpool create -f zpool-docker -m /var/lib/docker /dev/xvdf /dev/xvdg +``` +该命令将创建 `zpool` 并将其命名为 `zpool-docker`。该名称仅用于显示目的,您可以使用其他名称。使用 `zfs list` 检查池是否已正确创建和挂载。 +```bash +sudo zfs list + +NAME USED AVAIL REFER MOUNTPOINT +zpool-docker 55K 96.4G 19K /var/lib/docker +``` +4. 将 Docker 配置为使用 `zfs`。编辑 `/etc/docker/daemon.json` 并设置 `storage-driver` 添加到 `zfs`。如果文件之前为空,则现在应如下所示: +```json +{ + "storage-driver": "zfs" +} +``` +保存并关闭文件。 +5. 启动 Docker。使用 `docker info` 验证存储驱动程序是否为 `zfs`。 +```bash +sudo docker info + Containers: 0 + Running: 0 + Paused: 0 + Stopped: 0 + Images: 0 + Server Version: 17.03.1-ce + Storage Driver: zfs + Zpool: zpool-docker + Zpool Health: ONLINE + Parent Dataset: zpool-docker + Space Used By Parent: 249856 + Space Available: 103498395648 + Parent Quota: no + Compression: off +<...> +``` +## 管理 `zfs` +### 增加正在运行的设备的容量 +要增加 `zpool` 的大小,您需要向 Docker 主机添加专用块设备,然后使用 `zpool add` 命令将其添加到 `zpool`: +```bash +sudo zpool add zpool-docker /dev/xvdh +``` +### 限制容器的可写存储配额 +如果要按图像/数据集实施配额,则可以设置 `size` 存储选项来限制单个容器可用于其可写层的空间量。 + +编辑 `/etc/docker/daemon.json` 并添加以下内容: + +```json +{ + "storage-driver": "zfs", + "storage-opts": ["size=256M"] +} +``` + +查看每个存储驱动程序的所有存储选项 [守护进程参考文档](https://docs.docker.com/reference/cli/dockerd/#daemon-storage-driver) + +保存并关闭文件,然后重新启动 Docker。 + +## `zfs` storage 驱动程序的工作原理 + +ZFS 使用以下对象: + +- Filesystems:精简配置,按需从 `zpool` 分配空间。 +- 快照:文件系统的只读空间高效时间点副本。 +- clones:快照的读写副本。用于存储与上一层的差异。 + +创建克隆的过程: +![zfs_clones](./zfs_clones.webp) +1. 从文件系统创建只读快照。 +2. 将从快照创建可写克隆。这包含与父图层的任何差异。 + +文件系统、快照和克隆都从底层 `zpool` 的 + +### 磁盘上的映像和容器层 +每个正在运行的容器的统一文件系统都挂载在 `/var/lib/docker/zfs/graph/` 中。请继续阅读,了解统一文件系统是如何组成的。 +### 图像分层和共享 +映像的基础层是 ZFS 文件系统。每个子层都是基于其下层的 ZFS 快照的 ZFS 克隆。容器是基于创建它的映像顶层的 ZFS 快照的 ZFS 克隆。 + +下图显示了如何将其与基于两层映像的正在运行的容器组合在一起。 + +![zfs_zpool](./zfs_zpool.webp) + +当您启动容器时,将按顺序执行以下步骤: +1. 映像的 Base Layer 作为 ZFS 文件系统存在于 Docker 主机上。 +2. 其他图像图层是托管其正下方图像图层的数据集的克隆。 + 在图中,通过拍摄 Base Layer 的 ZFS 快照,然后从该快照创建克隆来添加 “Layer 1”。克隆是可写的,并按需占用 zpool 中的空间。快照是只读的,将 Base Layer 维护为不可变对象。 +3. 启动容器时,将在图像上方添加一个可写层。 + 在图中,容器的读写层是通过创建映像顶层(第 1 层)的快照并从该快照创建克隆来创建的。 +4. 当容器修改其可写层的内容时,将为更改的块分配空间。默认情况下,这些块为 128k。 + +## 容器读取和写入如何与 `zfs` 配合使用 +### 读取文件 +每个容器的可写层都是一个 ZFS 克隆,它与创建容器的数据集(其父层的快照)共享其所有数据。读取操作速度很快,即使正在读取的数据来自深层。下图说明了数据块共享的工作原理: + +![zpool_blocks](./zpool_blocks.webp) + +### 写入文件 +编写新文件:从底层 `zpool` 按需分配空间 并且这些块直接写入容器的可写层。 + +修改现有文件:仅为更改的块分配空间,并且这些块使用写入时复制 (CoW) 策略写入容器的可写层。这样可以最小化层的大小并提高写入性能。 + +#### 删除文件或目录: +- 删除存在于较低层中的文件或目录时,ZFS 驱动程序会掩盖容器的可写层中该文件或目录的存在,即使该文件或目录仍存在于较低的只读层中也是如此。 +- 如果在容器的可写层中创建并删除文件或目录,则 zpool 将回收这些块。 + +## ZFS 和 Docker 性能 +有几个因素会影响 Docker 的性能,使用 `ZFS` Storage 驱动程序。 +- 内存:内存对 ZFS 性能有重大影响。ZFS 最初是为具有大量内存的大型企业级服务器设计的。 +- ZFS 功能:ZFS 包括重复数据删除功能。使用此功能可以节省磁盘空间,但会占用大量内存。建议您为与 Docker 一起使用的 `zpool` 禁用此功能,除非您使用的是 SAN、NAS 或其他硬件 RAID 技术。 +- ZFS 缓存:ZFS 将磁盘块缓存在称为自适应替换缓存 (ARC) 的内存结构中。ZFS 的单副本 *ARC* 功能允许块的单个缓存副本由 的多个克隆共享。使用此功能,多个正在运行的容器可以共享缓存块的单个副本。此功能使 ZFS 成为 PaaS 和其他高密度使用案例的不错选择。 +- 碎片化:碎片化是写入时复制的自然副产品 像 ZFS 这样的文件系统。ZFS 通过使用 128k 的小块大小来缓解此问题。 ZFS 意图日志 (ZIL) 和写入的合并 (延迟写入) 有助于减少碎片化。您可以使用 `zpool status`。但是,如果不重新格式化和恢复文件系统,就无法对 ZFS 进行碎片整理。 +- 使用适用于 Linux 的本机 ZFS 驱动程序:由于性能不佳,因此不建议使用 ZFS FUSE 实现。 + +### 性能最佳实践 +- 使用快速存储:固态驱动器 (SSD) 提供比旋转磁盘更快的读取和写入速度。 +- 将卷用于写入密集型工作负载:卷为写入密集型工作负载提供最佳且最可预测的性能。这是因为它们绕过了存储驱动程序,并且不会产生精简配置和写入时复制引入的任何潜在开销。卷还有其他好处,例如允许您在容器之间共享数据,以及即使没有正在运行的容器正在使用卷也可以保留它们。 \ No newline at end of file diff --git a/docs/storage/drivers/zfs_clones.webp b/docs/storage/drivers/zfs_clones.webp new file mode 100644 index 0000000..6258eb8 Binary files /dev/null and b/docs/storage/drivers/zfs_clones.webp differ diff --git a/docs/storage/drivers/zfs_zpool.webp b/docs/storage/drivers/zfs_zpool.webp new file mode 100644 index 0000000..b3e1c58 Binary files /dev/null and b/docs/storage/drivers/zfs_zpool.webp differ diff --git a/docs/storage/drivers/zpool_blocks.webp b/docs/storage/drivers/zpool_blocks.webp new file mode 100644 index 0000000..8831a66 Binary files /dev/null and b/docs/storage/drivers/zpool_blocks.webp differ