docker共享volumed没有按照文档中所述的工作

我现在正在学习docker,根据文档,共享数据卷将被删除,当最后一个容器与共享卷的链接被删除与-v标志。 不过,在我最初的testing中,这不是我所看到的行为。

从文档: 在容器中pipe理数据

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

我做了以下几点:

  1. docker运行-d -v / dbdata – 名称dbdata ubuntu:14.04 echo仅用于postgres的数据容器
  2. docker运行-d –volumes – 从dbdata –name db1 ubuntu:14.04 / bin / bash
  3. 在/ dbdata目录下创build了一些文件
  4. 退出db1容器
  5. docker运行-d –volumes – 从dbdata –name db2 ubuntu:14.04 / bin / bash
  6. 我可以访问项目3上创build的文件,并创build一些新的文件
  7. 退出db2容器
  8. docker运行-d –volumes – 从dbdata –name db3 ubuntu:14.04 / bin / bash
  9. 我可以访问项目3和6创build的文件,并创build一些新的文件
  10. 退出db3容器
  11. 删除了没有-v标志的所有容器
  12. 再次创build数据库容器,但数据不在那里。

正如用户手册所述:

这使您可以升级或在容器之间有效迁移数据卷。

我不知道我做错了什么。

你没有做错什么。 在第12步中,您正在创build一个具有相同名称的容器。 它有不同的音量,最初是空的。

也许下面的例子可以说明发生了什么事情(ID和path将会/可能会在您的系统或其他docker版本中有所不同):

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

运行具有卷/ dbdata的容器并将其命名为dbdata 。 Id被返回(你的Id将会不同)。

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

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

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

让我们在容器的体积内创build一些新的数据:

 $ 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命令会导致docker rm -v dbdata 文件或目录消息或类似)

最后,在第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] 

如果要重新使用该卷,则必须创build一个新的容器, 并将文件系统中的数据导入/恢复到数据容器中 。 在你的情况下,你不应该首先删除数据容器,因为你想重新使用它的容量。