在 Docker 容器中绑定挂载 ZFS 支持的主机目录

在 Docker 容器中绑定挂载 ZFS 支持的主机目录

我在 Ubuntu 18.04 上运行 Docker 18.06.1-ce。Docker 在 ext4 文件系统上运行。

我有一个运行 ZFS 的大存储 RAID 阵列。我想将 ZFS 阵列中的目录挂载到容器中。但是,尝试此操作时,我收到以下错误:

docker run -it -v /mainpool/test:/mnt/mainpool busybox
docker: Error response from daemon: error while creating mount source path '/mainpool/test': mkdir /mainpool: read-only file system.

经过一番搜索,我发现其他人也遇到了同样的问题。例如: https://www.reddit.com/r/docker/comments/93u3hf/unable_to_mount_zfs_host_directory_in_container

出于性能原因,我不想将 Docker 移至 ZFS 文件系统。听起来 /var/lib/docker 必须位于 ZFS 中才能使用 ZFS 存储驱动程序。

有人知道如何解决这个问题吗?

编辑:添加更多信息。

我正在 snap 中运行 Docker 18.06.1-ce。我使用 snap 提供的默认 daemon.json:

    "log-level":        "error",
    "storage-driver":   "aufs"

Docker 提供的一些可能有用的信息:

Storage Driver: aufs
 Root Dir: /var/snap/docker/common/var-lib-docker/aufs
 Backing Filesystem: extfs
 Dirs: 192
 Dirperm1 Supported: true
Security Options:
 apparmor
 seccomp
  Profile: default
Docker Root Dir: /var/snap/docker/common/var-lib-docker

/proc/mounts 中可能包含的相关信息:

/dev/nvme0n1p2 / ext4 rw,relatime,data=ordered 0 0
/dev/loop8 /snap/docker/321 squashfs ro,nodev,relatime 0 0
nsfs /run/snapd/ns/docker.mnt nsfs rw 0 0
mainpool /mainpool zfs rw,xattr,noacl 0 0 

答案1

@gertvdijk 是正确的。

从 apt(外部 snap)重新安装 docker 并确保它已配置为使用 overlay2 存储驱动程序后,我就可以在我的 zfs 池上绑定挂载目录。

因此,无论是在 snap 中运行 docker 还是使用 aufs 存储驱动程序(而不是 overlay2)都会导致尝试从 zfs 池挂载目录的问题。

答案2

我遇到了同样的错误。我无法从 ZFS 数据集挂载目录。Docker 是作为 snap 安装的,尽管它使用的是 overlay2 存储驱动程序。我也删除了 docker(作为 snap),使用 apt 安装它,并将存储驱动程序设置为 overlay2。现在它运行得很好。

相关内容