6

我是 Docker 的新手,我正在努力更好地理解 Volumes 主题。在这里,我看到:

  • 创建容器时会初始化卷。如果容器的基础映像包含指定挂载点的数据,则在卷初始化时,现有数据将复制到新卷中。(请注意,这不适用于挂载主机目录。)
  • 数据卷可以在容器之间共享和重用。
  • 直接对数据卷进行更改。
  • 更新映像时不会包括对数据卷的更改。
  • 即使容器本身被删除,数据卷仍然存在。
  • 数据卷旨在持久化数据,独立于容器的生命周期。因此,当您删除容器时,Docker 永远不会自动删除卷,它也不会“垃圾收集”不再被容器引用的卷。

这很清楚,除了这个:

  • 更新映像时不会包括对数据卷的更改。

我真的很难更好地理解这一点。谁能给我一些更清晰的概述,可能还有一些基本的例子?

谢谢!

4

2 回答 2

7

卷存在于容器的文件系统之外。它们在运行时挂载,但其中的数据并不存在于容器中。举个例子:

j@host $ docker volume create --name my-data

这将创建一个名为my-data. 现在我创建一个新容器并将这个卷安装在我的容器中/inside/data

j@host $ docker run -it -v my-data:/inside/data --name container1 alpine:3.3 sh

现在我在容器内的外壳中,所以我在文件夹中创建了一个新文件/inside/data

root@container1 $ cd /inside/data && touch my-file

现在/inside/data实际上不在的容器文件系统中,它是一个位于容器外部的卷,它只是安装在其中。如果我停止我的容器,并且_不要重新安装该卷,我的文件就不存在了。

root@container1 $ exit
j@host $ docker run -it --name container2 alpine:3.3 sh
root@container2 $ ls /inside/data
ls: /inside/data: No such file or directory
root@container2 $ exit

事实上,连文件夹都不存在!因为我没有在那个位置安装任何东西。我正在使用卷,因此我的数据不会保留在容器中。那我怎么再找呢?好吧,它保留在卷(my-data)中。让我们通过挂载到另一个容器来看看它(我不需要在同一点挂载它,我将使用不同的东西)。

j@host $ docker run -it -v my-data:/different/folder --name container3 alpine:3.3 sh
root@container3 $ ls /different/folder
my-file
root@container3 $ exit

好的,所以我可以获取该数据并将其安装到不同的容器中。但是卷中的数据实际上在哪里?在我的主机文件系统上。我们可以通过以下方式检查:

j@host $ docker volume inspect my-data
[
    {
        "Name": "my-data",
        "Driver": "local",
        "Mountpoint": "/var/lib/docker/volumes/my-data/_data",
        "Labels": {},
        "Scope": "local"
    }
]

好的,所以它告诉我该卷在我的主机上的位置,让我们看看里面有什么(我们需要 sudo,因为它由 root 拥有)。

j@host $ sudo ls /var/lib/docker/volumes/my-data/_data
my-file

还有文件!

于 2016-06-29T18:36:59.440 回答
2

我认为它试图说明数据量是否被其他进程更改(它可以从其他容器或其他系统更改),当您构建/更新您的 docker 映像时,这些更改将不会被包含/记录,这是非常明显的。

于 2016-06-29T14:34:48.907 回答