对于某些用例,我希望能够创建一个卷docker volume create
,并用数据填充它。然后我想创建一个新卷,它只是第一个卷的副本,但不需要复制任何数据,只需写入更改的文件。
这就是 Docker 使用 aufs 或 overlayfs 对图像和容器所做的操作。您知道解决卷问题的任何策略吗?如果它现在不适用于 docker 卷,您能告诉我如何在 Docker 主机上执行类似操作吗?(然后我可以从主机挂载这些文件夹。)
到目前为止我有两个用例,也许你有一个完全不同的想法来解决它:
非常大的 Git 存储库(大约 10GB):我需要用这个存储库运行多个容器,其中一些容器还会提交更改。因此,它必须独立于其他容器,将提交推送到远程存储库,然后可能会删除复制的卷。
非常大的 mysql 数据库(大约 130GB):出于测试目的和其他迁移任务,我不希望复制整个数据库。
答案1
由于没有其他答案,我来回答一下。今天实现这一目标的最佳方法是自己用 来完成overlayfs
。它现在包含在 Linux 内核中,因此您无需任何额外的软件包或模块就可以开始使用(前提是您使用的是 3.18 或更新版本)。
overlayfs
除了您不想更改的现有目录之外,使用还需要一个工作目录、一个“上层”目录和一个挂载点。
假设我myreadonlydir
不希望容器中的数据发生变化,我可以创建两个这样的覆盖:
mkdir upperdir1 workdir1 mountpoint1 upperdir2 workdir2 mountpoint2
sudo mount -t overlay overlay -o lowerdir=myreadonlydir,upperdir=upperdir1,workdir=workdir1 mountpoint1
sudo mount -t overlay overlay -o lowerdir=myreadonlydir,upperdir=upperdir2,workdir=workdir2 mountpoint2
现在我有两个挂载点,mountpoint1
可以mountpoint2
将它们附加到我的容器上,例如
docker run -v $PWD/mountpoint1:/data alpine:3.6 # first container
docker run -v $PWD/mountpoint2:/data alpine:3.6 # second container
myreadonlydir
并且每个容器都会看到里面的内容/data
。当它们写对 中的任何操作/data
(删除文件、附加到文件、创建文件等等)overlayfs
都只会“写入” upperdir
,并且 中的数据myreadonlydir
将保持不变。
由于容器使用不同的挂载点,每个容器的修改不会/data
影响其他容器。
如果您想要真正安全,您可以挂载您的数据-o ro
以防止任何写入。
您可以很容易地编写一个脚本来为在测试环境中启动的每个容器执行此操作。
但请注意,我不知道在大型 MySQL 数据库中使用它时性能如何... 在写入文件时,overlayfs
它会在内部执行“复制”操作。理想情况下,您应该使用快速存储 - SSD 或如果您有足够的 RAM。workdir
workdir
tmpfs
更多信息 @https://wiki.archlinux.org/index.php/Overlay_filesystem。