Dockerfile中VOLUME的作用是什么


106

我试图加深对Docker容量的理解,并且很难弄清以下内容的差异/用例:

  • docker volume create命令
  • docker run -v /path:/host_path
  • 文件中的VOLUME条目Dockerfile

我特别不明白如果将VOLUME条目与-v标志结合在一起会发生什么。


Answers:


70

卷是存储在 /var/lib/docker/volumes/...

  • 您可以在Dockerfile中声明它,这意味着每次从映像启动容器时,即使没有任何选择,也会创建该卷(为-v

  • 您可以在运行时声明它docker run -v [host-dir:]container-dir
    结合使用两个(VOLUME+ docker run -v)意味着您可以将主机文件夹的内容挂载到容器中保存的卷中/var/lib/docker/volumes/...

  • docker volume create无需定义Dockerfile,构建映像和运行容器即可创建卷。它用于快速允许其他容器安装该体积。

如果您已在卷中保留了某些内容,但此后删除了该容器(除非使用docker rm -v,否则默认情况下不会删除其关联的卷),则可以将所述卷重新附加到新容器(声明相同的体积)。

请参阅“ Docker-如何访问未连接到容器的卷? ”。
使用docker volume create,可以轻松地将命名卷重新附加到容器。

docker volume create --name aname
docker run -v aname:/apath --name acontainer
...
# modify data in /apath
...
docker rm acontainer

# let's mount aname volume again
docker run -v aname:/apath --name acontainer
ls /apath
# you find your data back!

2
假设您使用Dockerfilewith VOLUME-v /path:/host_path/标志。的内容VOLUME将被/host_path/?的内容覆盖。
radium226 '16

感谢您@VonC,我想我明白了:)如果您在docker volume create --name my_volume后面加上a docker run --volume-from my_volume,您怎么知道挂载点在哪里?
radium226 '16

@ radium226没有安装点(意味着没有从主机安装的东西,除了本机空的/ var / lib / docker / volume之外)。卷的路径位于my_volume元数据中:stackoverflow.com/a/31997267/6309
VonC

我了解主机上没有安装点。但是,在用启动的运行容器中docker run ...,如何写入存储在my_volume卷上的文件中?我不知道...的路径?因为我什么都没定义,所以我正在运行的容器中的容量是多少?我希望我已经足够清楚,因为我绝对不确定我的嗓音:-/
radium226 '16

1
@ radium226 docker volume create --name aname创建一个命名卷:您在运行时分配一个容器路径docker run -v aname:/apath::该容器现在已附加一个卷,该卷已安装在其/ apath文件夹中。我已将答案重写为清楚。
VonC

11

VOLUME将其与volumes-from运行时参数结合使用时,指令变得很有趣。

鉴于以下Dockerfile:

FROM busybox
VOLUME /myvolume

使用以下方法生成图像:

docker build -t my-bb .

并用以下方法旋转容器:

docker run --rm -it --name my-first-bb my-bb

首先要注意的是,此图像中将有一个名为的文件夹myvolume。但这并不是特别有趣,因为当我们退出容器时,该体积也将被移除。

在此文件夹中创建一个空文件,因此在容器中运行以下命令:

cd myvolume
touch hello.txt

现在旋转一个新容器,但与以下容器共享相同的体积my-first-bb

docker run --rm -it --volumes-from my-first-bb --name my-second-bb my-bb

您将看到其中my-second-bb包含文件夹hello.txt中的myvolume文件。

退出两个容器后,您的卷也将被删除。


这些卷将被删除,因为它们是匿名卷,并且您使用该--rm选项启动了容器。我认为提及它可能可行。如果您没有启动容器--rm,你仍然可以删除容器及其匿名卷docker rm -v my-container
AymDev
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.