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