VOLUME 在 Dockerfile 中的作用是什么

What is the purpose of VOLUME in Dockerfile

我正在尝试更深入地了解 Docker 的数量,但我很难弄清楚它们的差异/用例:

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

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

中的持久数据
  • 您可以在 Dockerfile 中声明它,这意味着每次从映像启动容器时,都会创建卷(empty),即使如果您没有任何 -v 选项。

  • 您可以在运行时间docker run -v [host-dir:]container-dir申报。
    结合两者 (VOLUME + docker run -v) 意味着您可以将主机文件夹的内容装载到容器在 /var/lib/docker/volumes/...

  • 中保留的卷中
  • docker volume create 创建卷而无需定义 Dockerfile 并构建映像和 运行 容器。它用于快速允许其他容器挂载该卷。

如果您在一个卷中保留了一些内容,但此后删除了容器(默认情况下不会删除其关联的卷,除非您使用 docker rm -v),您可以 re-attach 表示卷到新容器(声明相同的卷)。

参见“”。
使用 docker 卷创建,这很容易将命名卷重新附加到容器。

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!
当您将

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

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

@radium226

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

使用 docker hub 中的 MYSQL:

运行 以下命令为例:

$ docker run --name some-mysql -v /my/own/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

命令的-v /my/own/datadir:/var/lib/mysql部分挂载了/my/own/datadir来自底层主机系统的目录作为容器内的 /var/lib/mysql,默认情况下 MySQL 将写入其数据文件。

因此,挂载容器时仍然存在的目录可用,它还为某些操作(如数据库操作)提供了更高的性能。