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

时间:2017-12-11 22:09:45

标签: docker

我碰巧以可疑的方式使用docker用于特定目的:

我有一个带有一些开发工具及其配置的容器。这些通常是在操作系统中找到的工具,这些工具配置有通常在主目录中找到的dotconf文件(如tmux,vim,git,编程语言......)。这通常通过使用工具和点文件配置操作系统来处理。

但随着设置变得越来越复杂,正确设置新操作系统变得非常困难。另一方面,在机器周围移动容器非常简单。因此,对于这种精确的情况,我碰巧使用了一种与#34; docker方式相反的方式使用docker"。但这对我来说真的很舒服。

话虽这么说,我也希望将容器的文件系统与另一个容器同步(根据我的理解,这绝对不是" docker方式",但是。)我想要运行在不同的机器上的同一图像的2个实例。然后我想同步它们在图像顶部的读写层。因此,当在一个文件上创建,删除或修改文件时,会在另一个文件上复制该文件。

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

2 个答案:

答案 0 :(得分:0)

我认为你最好的选择是使用绑定挂载。这会稍微改变您的初始设计 - 但它可能是最干净,最容易实现的。

首先要做的事情 - 您需要确保要同步的所有文件都在特定文件夹中;所以不要对整个底层文件系统进行rsyncing - 你只需要在容器中设置/app/my_files ,并将应用程序设置为从那里读/写。

现在 - 创建您的目录并在您的机器之间设置rsync;让我们说它在/rsync

最后 - 运行你的容器并使用bind-mount;如果你只是提出一个容器,那就像:docker run -d -v /rsync:/app/my_files my_image

答案 1 :(得分:0)

阅读本页后:https://docs.docker.com/engine/userguide/storagedriver/overlayfs-driver/并尝试创建和删除图像/容器,我发现了一些事情。

创建图像时,文件夹/var/lib/docker/overlay2会填充一个新文件夹,调用一个似乎是哈希的东西(让我们称之为123),并且它本身填充了图像内容/文件系统。

然后,当从同一个图像创建容器时,在/var/lib/docker/overlay2内创建另外两个文件夹,同样用另一个哈希命名,其中一个最后有-init。我们称他们为456456-init。它们似乎包含容器层。

在查看docker inspect <container-name>的输出时,GraphDriver部分提供了有关do​​cker如何使用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。这是获取容器内所做更改的目录。我找不到文档所以我进行了一些实验,发现这个上层目录在容器的生命周期中从未改变过。我停下来开始了,上面的dir保持不变。然后在删除容器时删除此文件夹。再次创建容器时,会创建一个具有不同名称的新文件夹。

所以看起来我需要同步的是这个上层目录,可以在docker inspect找到。我会再尝试一下。