Dockerfile中VOLUME的用途是什么

时间:2016-01-15 11:03:42

标签: docker volume

我试图深入了解Docker的数量,并且我很难弄清楚差异/用例:

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

如果您将VOLUME条目与-v标记合并,我特别不明白会发生什么。

如果有人理解,请解释我!

3 个答案:

答案 0 :(得分:43)

卷是存储在/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 - How to access a volume not attached to a container?"。
使用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!

答案 1 :(得分:4)

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-bbhello.txt文件夹中包含文件myvolume

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

答案 2 :(得分:0)

@radium226

  1. 在 Dockerfile 中指定 VOLUME 可确保文件夹在运行时被视为卷(即容器外部),而不是容器内的常规目录。请注意性能和可访问性影响。
  2. 如果忘记在“docker run”命令行中指定“-v”,上述情况仍然成立。只是卷名变为匿名。但仍有办法从此类匿名卷中访问或恢复数据。