如何同步2docker容器的overlay2文件系统?

我碰巧用一个可疑的方式使用docker来达到一个特定的目的:

我有一个容器,有一些开发工具和configuration。 这些通常是在操作系统中find的工具,这些工具通常在主目录(如tmux,vim,git,编程语言等)中使用dotconf文件进行configuration。 这通常通过使用工具和点文件configurationOS来处理。

但随着这些年来设置变得越来越复杂,适当地build立一个新的操作系统变得非常困难。 另一方面,在机器周围移动容器非常简单。 所以对于这个确切的案例,我碰巧用了一种违背“docker方式”的方式。 但这对我来说真的很舒服。

这就是说,我也想同步容器的文件系统与另一个容器(在我的理解是绝对不是“docker的方式”,但是)。我想在不同的机器上运行相同的图像的2个实例。 然后我想同步它们在图像顶部的读写层。 所以当一个文件被创build,删除或者修改的时候,这个就被复制了。

我正在考虑使用rsync或unison来做到这一点。 但我不知道overlay2驱动程序是如何工作的。 /var/lib/docker/overlay2/<container-id>的目录是否是实际的容器文件系统层? 还是应该安装? 我看到一些人用设备映射器驱动程序很容易地在主机上安装它们的容器文件系统。 这将有意义overlay2?

我认为你最好的select是使用绑定安装。 这会改变你最初的devise – 但它可能是最干净,最容易实现的。

首先,您需要确保您想要同步的任何文件都在特定的文件夹中; 因此,而不是rsyncing整个基础的文件系统 – 你会做,例如/app/my_files 在你的容器内,并设置你的应用程序从那里读/写。

现在 – 创build你的目录并设置你的机器之间的rsync; 假设它在/rsync

最后 – 运行您的容器并使用绑定安装; 如果你只是提出一个容器看起来像: docker run -d -v /rsync:/app/my_files my_image

看完这个页面之后: https : //docs.docker.com/engine/userguide/storagedriver/overlayfs-driver/并试验图像/容器的创build和删除,我发现了一些东西。

当创build一个图像时,文件夹/var/lib/docker/overlay2被一个新的文件夹填充,用一个似乎是散列(我们称之为123 )的东西来调用,并且它自己填充了图像内容/文件系统。

然后,当从这个相同的图像创build容器时,会在/var/lib/docker/overlay2内创build两个以上的文件夹,同样命名为另一个散列,其中一个文件夹的末尾有-init 。 我们称它们为456456-init 。 他们似乎包含容器层。

在查看GraphDriver docker inspect <container-name>的输出时, GraphDriver部分有一些关于GraphDriver如何使用overlay2的信息。 下面的dir包含init容器dir +映像目录,如: /var/lib/docker/overlay2/456-init/diff:/var/lib/docker/overlay2/123/diff 。 我不完全理解这是如何工作的,但是我知道我对低级目录不感兴趣,因为它应该是只读模式下的图像目录。 这是我已经在所有主机上,因此不需要同步。

然后在我的理解中,overlay2中的上方目录是容器在图像层上使用的读写层。 在GraphDriver这被发现是/var/lib/docker/overlay2/456/diff 。 这是获取容器内所做更改的目录。 我无法find文档,所以我尝试了一下,发现这个上面的dir在容器的使用期间从来没有改变过。 我停了下来,开始了,上面的方向也保持不变。 然后,当删除容器时,该文件夹被删除。 再次创build容器时,会创build一个名称不同的新文件夹。

所以看起来像我需要同步的是这个上面的目录,可以通过docker inspectfind。 我会再试一点。