Docker AUFS如何持久保存数据?

时间:2018-09-09 08:52:37

标签: docker docker-volume

我对docker AUFS如何持久化数据有些疑问。据我了解, VOLUME 内部的数据可以持久保存,而其他位置则不能保存。在这里举一个例子,将一个dockerfile的mysql容器拉到那里,然后执行以下步骤:

  1. test目录下创建一个/opt目录,该目录不应在docker容器中持久存在
  2. 登录mysql并创建一个数据库,因此/var/lib/mysql目录添加了一个附加文件
  3. 停止此类容器,然后重新开始
  4. 提交这样的容器,然后删除该容器
  5. 启动已提交的容器,并检查数据库是否仍退出

结果

  • 第3步之后,所有内容都存在于包含test目录的容器中 我认为不应将其保留在AUFS中。那么,我对docker aufs的了解是否有误?
  • 在第5步之后,我可以看到新容器中不存在数据库,但是为什么呢?不应该将文件/var/lib/mysql保留下来吗?

这是我正在运行的docker命令

docker build -td --name mysql_test mysqlImageId

注意 :我尚未指定-v选项

1 个答案:

答案 0 :(得分:1)

根据我对docker的理解,我期望您所描述的过程步骤会带来以下结果:

第一个:数据可以保存在Docker容器中-实际上,对容器执行的创建,删除或更新文件的任何操作都会触发 AUFS < / em>将该文件写入容器层。对于删除或更新,这将在较低的图像层中隐藏相同文件的条目。当然,任何写入的数据只会持续到您删除容器为止。如果您基于同一图像启动一个新容器,则此数据自然将不存在。

此外,Docker构建的目的是从Dockerfile构建映像。您不能使用它来启动容器。

关于您的观察

  • 第3步之后,我希望您的所有数据仍然存在,因为停止和重新启动容器会使容器层保持不变。 stop 仅杀死使您的容器保持活动状态的主进程,而 start 通过执行相关的入口点脚本重新点燃主进程。
  • 第5步之后,我仍然希望您的数据在那里,因为您已将容器提交到新映像。现在,该图像应包括修改后的容器层。调用 docker commit 时,请记住,这不是更新原始映像,而是创建一个新映像。