持久数据的Docker卷 - 仅足以传递容器路径吗?

时间:2015-08-20 07:59:48

标签: docker

据我所知,docker volume允许在docker容器中指定将在docker主机上共享/存储的目录/文件。例如postgres Dockerfile包含以下行

VOLUME /var/lib/postgresql/data

因此,这意味着/var/lib/postgresql/data将实际“存储”在主机上,我将可以从主机系统访问该文件。例如,当我检查pg容器时:

"Mounts": [
        {
            "Name": "4fc1fe18d93fd2090f63619edc5d6244e9821805a2e070a0235d9305b2dfe80f",
            "Source": "/mnt/sda1/var/lib/docker/volumes/4fc1fe18d93fd2090f63619edc5d6244e9821805a2e070a0235d9305b2dfe80f/_data",
            "Destination": "/var/lib/postgresql/data",
            "Driver": "local",
            "Mode": "",
            "RW": true
        }
    ],

这意味着我可以在Source路径下的主机上找到卷。我想知道4fc1fe18d93fd2090f63619edc5d6244e9821805a2e070a0235d9305b2dfe80f路径中的Source是什么意思。我在Docker主机上找不到容器或带有此ID的图像。

我无法理解的一点是,当我删除容器并重新创建容器时,Source路径不同,实际上没有数据存在......

所以似乎对于数据持久性我必须在主机和容器路径上添加卷以强制它始终在相同路径下存储数据 - 这是正确的吗?

2 个答案:

答案 0 :(得分:1)

关注" How do you list volumes in docker containers?",我写了一个脚本(updateDataContainerPath),其中包含:

  • 要么记录文件中的路径(以容器命名)
  • 或者,如果该文件已经存在,将:
    • 删除Mount.Source文件夹(为空)
    • 将文件中记录的路径移动到Mount.Source路径
    • 记录该文件中的Mount.Source路径

这样,我可以删除(docker rm,显然没有-v选项)容器并重新创建它,同时保持数据放入该卷。

例如,您可以在gitolite/run中看到该脚本。

答案 1 :(得分:1)

  

所以似乎对于数据持久性我必须用两者来增加音量   主机和容器路径,以强制它始终存储相同的数据   路径 - 这是正确的吗?

正确。这称为“将主机目录安装为数据卷”。可以找到文档here

但可以通过以下方式实现:

docker run -v /path/to/host/directory:/path/inside/the/container image

其他选项是使用“数据量容器”。通过这种方式,您可以将容器绑定到数据卷容器中。您可以重新创建容器,只要不删除数据卷容器,数据就会保留。可以找到文档here