持久数据的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 } ],
这意味着我可以在Source
path下的主机上find卷。 我想知道在Source
path中是什么意思4fc1fe18d93fd2090f63619edc5d6244e9821805a2e070a0235d9305b2dfe80f
。 在我的docker主机上我找不到这样的容器和图像。
有一件事我不明白的是,当我删除容器并重新创build它,然后Source
path是不同的,实际上没有数据保存…
因此,对于数据持久性来说,我必须在主机和容器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。