《数量》在 Dockerfile 的目的是什么

我试图更深入地理解 Docker 的卷,但我很难弄清楚其中的区别/用例:

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

我尤其不理解如果将 VOLUME条目与 -v标志组合在一起会发生什么。

84738 次浏览

卷是存储在 /var/lib/docker/volumes/...中的持久数据

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

  • 您可以在运行时 docker run -v [host-dir:]container-dir上声明它。
    将两者结合起来(VOLUME + docker run -v)意味着您可以将主机文件夹的内容挂载到由 /var/lib/docker/volumes/...

  • 中的容器持久存储的卷中
  • Docker 宪章创建 创建一个卷,而不必定义一个 Dockerfile 并构建一个映像和运行一个容器。它被用来快速允许其他容器装入所述容量。

如果您在一个卷中保存了一些内容,但是随后删除了该容器(默认情况下,该容器不会删除其相关的卷,除非您使用 docker rm-v) ,那么您可以将该卷重新附加到一个新容器(声明相同的卷)。

请看“ Docker-如何访问未附加到容器的卷?”。
通过创建 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-2包含 myvolume文件夹中的文件 hello.txt

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

@ radium226

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

使用 码头中心中的 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部分将来自底层主机系统的 我自己的资料目录挂载为容器内的 /var/lib/mysql,MySQL 默认将在此处写入其数据文件。

因此,可以挂载一个在容器被终止时仍然存在的目录,这个目录还为一些操作(比如数据库操作)提供了更高的性能。