docker共享卷无法正常工作,如文档中所述

时间:2014-09-20 04:22:25

标签: docker

我现在正在学习docker,根据文档,当使用-v标志删除保存共享卷链接的最后一个容器时,应单独销毁共享数据卷。然而,在我的初步测试中,这不是我所看到的行为。

从文档中: Managing Data in Containers

  

如果删除装入卷的容器(包括初始dbdata容器)或后续容器db1和db2,则不会删除卷。要从磁盘中删除卷,必须使用对卷的引用对最后一个容器显式调用docker rm -v。这允许您在容器之间升级或有效地迁移数据卷。

我做了以下事情:

  1. docker run -d -v / dbdata --name dbdata ubuntu:14.04 echo postgres的仅数据容器
  2. docker run -d --volumes-from dbdata --name db1 ubuntu:14.04 / bin / bash
  3. 在/ dbdata目录中创建了一些文件
  4. 退出db1容器
  5. docker run -d --volumes-from dbdata --name db2 ubuntu:14.04 / bin / bash
  6. 我可以访问第3项创建的文件并创建一些新文件
  7. 退出db2容器
  8. docker run -d --volumes-from dbdata --name db3 ubuntu:14.04 / bin / bash
  9. 我可以访问在第3项和第6项上创建的文件并创建一些新文件
  10. 退出db3容器
  11. 删除了没有-v标志的所有容器
  12. 再次创建数据库容器,但数据不存在。
  13. 如用户手册中所述:

      

    这允许您在容器之间升级或有效迁移数据卷。

    我想知道我做错了什么。

1 个答案:

答案 0 :(得分:3)

你没有做错任何事。在步骤12中,您将创建一个具有相同名称的 new 容器。它有不同的音量,最初是空的。

以下示例可能会说明正在发生的事情(系统或其他docker版本中的ID和路径可能会有所不同):

$ docker run -d -v /dbdata --name dbdata ubuntu:14.04 echo Data-only container for postgres
7c23cc1e6637e29f36c6cdd4c1461f6e1742b201e05227279ac3db55328da674

运行具有卷/ dbdata的容器,并为其指定名称​​ dbdata 。返回ID(您的ID将有所不同)。

现在让我们检查容器并打印“Volumes”信息:

$ docker inspect --format "{{ .Volumes }}" dbdata
map[/dbdata:/var/lib/docker/vfs/dir/248641a5f51a80b5004f72f622a7329835e93881e9915a01b3c7112189d0b55e]

我们可以看到你的/ dbdata卷位于/ var / lib / docker / vfs / dir / 248641 ...

让我们在容器的卷中创建一些新数据:

$ docker run --rm --volumes-from dbdata ubuntu:14.04 /bin/bash -c "echo fuu >> /dbdata/test"

并检查它是否可用

$ docker run --rm --volumes-from dbdata -it ubuntu:14.04 cat /dbdata/test
fuu

之后删除容器,不带-v标志。

$ docker rm dbdata

dbdata容器(ID为7c23cc1e6637)已经消失,但文件系统仍然存在,因为您可以看到是否检查了该文件夹:

$ cat /var/lib/docker/vfs/dir/248641a5f51a80b5004f72f622a7329835e93881e9915a01b3c7112189d0b55e/test
fuu

(请注意:如果您使用 -v 标记并删除包含docker rm -v dbdata的容器,则主机文件系统上的卷文件将被删除上面的cat命令会导致没有这样的文件或目录消息或类似信息)

最后,在步骤12中,您启动一​​个容器,其中包含不同的卷,并为其指定相同的名称: dbdata

docker run -d -v /dbdata --name dbdata ubuntu:14.04 echo Data-only container for postgres
2500731848fd6f2093243da3be064db79e76d731904e6f5349c3f00f054e5f8c

检查会产生不同的音量,最初是空的。

docker inspect --format "{{ .Volumes }}" dbdata
map[/dbdata:/var/lib/docker/vfs/dir/faffba00358060024026412203a1562125f73d2bdd69a2202483e858dda04740]

如果要重新使用该卷,则必须创建一个新容器import/restore the data from the filesystem into the data container。在您的情况下,您不应该首先删除数据容器,因为您要从中重用该卷。