Dockerfile 中 VOLUME 的用途是什么

新手上路,请多包涵

我正在尝试更深入地了解 Docker 的容量,但我很难找出以下差异/用例:

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

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

原文由 radium226 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 941
2 个回答

卷是存储在 /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!

原文由 VonC 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

给定以下 Dockerfile:

 FROM busybox
VOLUME /myvolume

使用以下命令构建图像:

 docker build -t my-busybox .

并启动一个容器:

 docker run --rm -it --name my-busybox-1 my-busybox

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

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

 cd myvolume
touch hello.txt

现在启动一个新容器,但与 my-busybox-1 共享相同的卷:

 docker run --rm -it --volumes-from my-busybox-1 --name my-busybox-2 my-busybox

您将看到 my-busybox-2 包含文件 hello.txtmyvolume 文件夹中。

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

原文由 Koray Tugay 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进