Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在重新启动容器时重用Docker中的相同卷?_Docker - Fatal编程技术网

如何在重新启动容器时重用Docker中的相同卷?

如何在重新启动容器时重用Docker中的相同卷?,docker,Docker,我有一个Dockerfile,它在末尾声明了一个类似这样的卷 VOLUME /data 现在,当我构建并运行这个容器时,我确实在/data 这很好,但我希望能够停止此容器,然后再次运行它,并确保装载回与其数据完全相同的卷 我如何才能做到这一点? 理想情况下,如果卷不存在,则使用同一命令创建该卷,如果卷已经存在,则重用该卷 如果要在容器的生命周期之外保存数据,则需要在容器外部创建卷。一个选项是创建“数据卷容器”,如中所述: 这将创建一个容器(名为mydata)。它基于busybox图像,但是因为

我有一个Dockerfile,它在末尾声明了一个类似这样的卷

VOLUME /data
现在,当我构建并运行这个容器时,我确实在
/data

这很好,但我希望能够停止此容器,然后再次运行它,并确保装载回与其数据完全相同的卷

我如何才能做到这一点?

理想情况下,如果卷不存在,则使用同一命令创建该卷,如果卷已经存在,则重用该卷

如果要在容器的生命周期之外保存数据,则需要在容器外部创建卷。一个选项是创建“数据卷容器”,如中所述:

这将创建一个容器(名为
mydata
)。它基于
busybox
图像,但是因为我们使用的是
create
而不是
run
,所以实际上没有启动任何东西。此容器的存在只是为了向其他容器提供卷

然后,我们可以在启动另一个容器时,使用
--volumes from
选项到
docker run
访问该卷:

docker run --volumes-from my-data ...
现在,您有一个在容器存在后仍然存在的卷,只要您的
my data
容器未被删除,该卷就会一直存在

或者,您只需在容器中的
/data
上挂载主机目录,如下所示:

docker run -v /path/on/host:/data ...

我在上面链接的文档中也描述了这些选项。

larsks的答案是在命名卷出现之前应该遵循的方法(或至少是解决方法)。
现在只需使用更加简单和标准的命名卷

这很好,但我希望能够阻止这个容器 然后再次运行它,并确保其数据与卷完全相同 它被安装在后面

如果
停止运行的容器(使用
docker stop id
),然后
启动它(使用
docker start id
),与容器关联的卷将仍然存在,而不需要使用命名卷或任何技巧,因为它仍然使用相同的容器。
同一映像的不同运行(
docker run fooImageName
)之间出现卷不持久的问题

匿名卷和命名卷

指定卷有两种形式:匿名和命名。
如果我们不为此指定名称,主机上的卷将无法在运行的下一个容器中重用,因为该容器是匿名的(但使用两个不同的容器:一个用于应用程序,另一个用于具有匿名卷的数据,如larsks答案所示)。 因此,由于卷是匿名的,Docker会在主机上为同一映像的每个容器运行创建一个新卷

要使用命名卷,当我们运行容器时,我们只需要在容器中装入的文件/目录前面加上一个名称(无论我们想要什么,它都是一个逻辑名称)。
例如,对于dockerfile中声明的卷:

VOLUME /data
我们可以将容器启动为:

docker run -v my-volume:/data myImage
在第一次运行时,将创建卷。 然后,对于任何下一次运行,我们只需指定命名卷
my volume
,即可重用该卷

以下是文档中有趣的部分(重点是我的):

选择-v或--mount标志

  • -v
    --volume
    :由三个字段组成,用冒号字符(:)分隔。字段的顺序必须正确,并且 每个字段的含义不是很明显。
    • 对于命名卷,第一个字段是卷的名称,在给定主机上是唯一的。对于匿名卷, 省略第一个字段
    • 第二个字段是在容器中装入文件或目录的路径
    • 第三个字段是可选的,是以逗号分隔的选项列表,例如ro

或者,如果出于某些原因需要在不启动容器的情况下创建卷,则可以使用
docker volume
命令。
你可以阅读:

创建和管理卷 与绑定装载不同,您可以在外部创建和管理卷 任何容器的范围

创建卷:

$docker卷创建我的卷

我们会像以前一样使用它:

docker run -v my-volume:/data myImage

我已经测试了这个过程(关于数据卷容器),它按照预期工作。但我不明白的是,它甚至可以在Dockerfile中不提供VOLUME语句的情况下工作!那么VOLUME语句的用途是什么呢?@BarryNL Volumes可以在Dockerfile中定义,也可以使用
docker run-v
来定义。如果卷是在Dockerfile中指定的,则本地路径通常类似于
/var/lib/docker/vfs/…
。您可以使用
docker inspect-f{{.Volumes}}name
来查找。但是,Dockerfile卷和
run-v
-卷之间存在差异。如果容器的基本映像包含指定装载点的数据,则在卷初始化时将现有数据复制到新卷中,但仅当它是Dockerfile卷时。
docker run -v my-volume:/data myImage