持久数据的Docker卷 – 是否足以仅传递容器path?

据我所知docker卷允许指定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 } ], 

这意味着我可以在Sourcepath下的主机上find卷。 我想知道在Sourcepath中是什么意思4fc1fe18d93fd2090f63619edc5d6244e9821805a2e070a0235d9305b2dfe80f 。 在我的docker主机上我找不到这样的容器和图像。

有一件事我不明白的是,当我删除容器并重新创build它,然后Sourcepath是不同的,实际上没有数据保存…

因此,对于数据持久性来说,我必须在主机和容器path上添加卷,以强制其始终在同一path下存储数据 – 这是正确的吗?

在“ 如何列出Docker容器中的卷? ”之后,我写了一个脚本( updateDataContainerPath ):

  • 要么在一个文件中loggingpath(以容器命名)
  • 或者,如果该文件已经存在,将会:
    • 删除Mount.Source文件夹(这是空的)
    • 将文件中logging的path移到Mount.Sourcepath
    • 在该文件中loggingMount.Sourcepath

这样,我可以删除( docker rm ,显然没有-v选项)一个容器并重新创build它,同时将数据保存在该卷中。

你可以看到gitolite/run使用的脚本。

因此,对于数据持久性来说,我必须在主机和容器path上添加卷,以强制其始终在同一path下存储数据 – 这是正确的吗?

正确。 这就是所谓的“将主机目录挂载为数据卷”。 文档可以在这里find。

但是可以通过如下方式来实现:

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

其他选项是使用“数据量容器”。 通过这种方式,您可以将容器绑定到数据容器中。 您可以重新创build您的容器,只要您不移除数据容器,数据将被保留。 文档可以在这里find。