为什么docker-machine重新启动时会清除数据?


9

我在OSX上使用Docker Toolbox。

我创建了一个用于存储持久性数据的数据卷容器:https : //docs.docker.com/userguide/dockervolumes/#creating-and-mounting-a-data-volume-container

我检查了这些数据确实存储在boot2docker VM(由docker-machine创建)上,而不是存储在容器上,以便将其持久化。但是,“ docker-machine restart”会清除虚拟机上的此自定义数据。

我找不到正在发生的事情的文档。我发现有一个论坛帖子提到/ var / lib / docker中的数据将被保留,但我找不到任何官方文档说明这一点,考虑到上述持久性存储指南未使用此路径,甚至提到该信息,这似乎也很奇怪。您的数据将被删除。

这是预期的吗?如果是这样,那么在存储持久数据的正确路径上是否有任何官方文档?


编辑:添加失败的senario示例

$ docker-machine ssh alt
docker@alt:~$ docker run -v /data:/var/lib/mysql --name mydata busybox sh -c "echo 'hello' > /var/lib/mysql/hello"
docker@alt:~$ docker run --rm --volumes-from mydata busybox sh -c "cat /var/lib/mysql/hello"
hello
docker@alt:~$ exit
$ docker-machine restart alt
Starting VM...
$ docker-machine ssh alt
docker@alt:~$ docker run --rm --volumes-from mydata busybox sh -c "cat /var/lib/mysql/hello"
cat: can't open '/var/lib/mysql/hello': No such file or directory

Answers:


8

这绝对应该工作:

$ docker-machine ssh default
docker@default:~$ docker run -v /data --name mydata busybox true
docker@default:~$ docker run --volumes-from mydata busybox sh -c "echo hello >/data/hello"
docker@default:~$ docker run --volumes-from mydata busybox cat /data/hello
hello
docker@default:~$ exit
$ docker-machine restart default
Starting VM...
$ docker-machine ssh default
docker@default:~$ docker run --volumes-from mydata busybox cat /data/hello
hello

您能否详细说明重现问题的步骤?

boot2docker具有只读文件系统(将在重新引导时擦除),但以下情况除外:

  1. 容器及其数据(卷)-这就是您所读到的内容 /var/lib/docker
  2. Docker映像
  3. Docker配置(例如/var/lib/boot2docker/profile,可以调整守护程序标志的位置)

嗨,我刚刚建议对您的回复进行修改。您是要在第二个第3和第4个运行命令中指定busybox映像吗?如果不这样做,码头工人会尝试下载名为“ sh”和“ cat”的图像,我怀疑这不是您想要的。我将在上面添加一个失败的示例。
格里2015年

感谢您的帮助。您和@ mc0e都帮助完成了这个任务,因此我给了您答答和答谢他的赏金(同时给了他们+1)。我希望你认为这很公平。
格里2015年

1
嗯,打错了。抱歉打错了。
nathanleclaire

无需道歉。我只是仔细检查以确保我没有被误解。为您的所有帮助加油。
格里2015年

6

我不使用boot2docker,但是如果/ data在重新启动时被擦除,那就是您的卷的存储位置(docker run -v /data:/var/lib/mysql),因此它将丢失。

您正在做的就是将两种不同的模式结合起来以处理卷持久性。为了获得持久性,容器可以从主机系统上的指定位置(假定是持久性的)挂载卷,也可以将它们与数据容器相关联并用挂载--volumes-from。听起来主机文件系统方法不适用于boot2docker,您应该使用数据卷模式(仅)。

大概您应该使用-v /var/lib/mysql而不是使用创建数据容器-v /data:/var/lib/mysql


使用-v标志创建一个卷,然后使用--volumes-from在该容器中的其他容器中使用该卷,正是该文档所显示的内容:docs.docker.com/userguide/dockervolumes/… 如果-v,我希望/ location知道它应该相对于/ var / lib / docker / volumes,因此添加冒号不会改变它。至少这是不直观的。-v / var / lib / mysql!= -v / var / lib / mysql:/ var / lib / mysql似乎还应该更新mysql- docker
格里2015年

感谢您的帮助。您和@nathanleclaire都为此提供了帮助,因此我给了您赏金(因为它的价值更高),我给了nathanleclaire(这两个都为+1)打勾。我希望你认为这是公平的。
格里2015年

@Gerry当然建议创建一个卷,然后通过--volumes-from使用它。不能在容器上挂载临时/ data。
mc0e

是的麻烦是,直到重启后,我才知道/ data是短暂的。
格里2015年

0

请注意,我正在使用xhyve vm的docker for mac beta。

/ var / lib / boot2docker的内容将在机器重新启动之间保留。因此,如果您希望某些文件在vm上可用,请将它们放在此目录中。

如果希望在运行Docker容器的其他位置可以访问它们,则可以将以下内容添加到/ var / lib / boot2docker / profile中:

mkdir -p /desired/path
ln -s /var/lib/boot2docker/your.file /desire/path/your.file

如果要将其他配置添加到将在vm重新启动之间保留的系统文件(例如,主机文件中的额外值),则可以在/ var / lib / boot2docker / profile中添加以下命令:

echo '127.0.0.1 your.domain.com' >> /etc/hosts

希望能帮助到你

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.