Docker卷更新图像时

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

  • 当容器被创build时,卷被初始化。 如果容器的基础映像包含指定安装点上的数据,则在卷初始化时,现有数据将被复制到新卷中。 (请注意,在安装主机目录时这不适用。)
  • 数据卷可以在容器之间共享和重用。
  • 数据量的变化是直接进行的。
  • 更新图像时,不会包含对数据量的更改。
  • 即使容器本身被删除,数据量仍然存在。
  • 数据卷旨在持续数据,与容器的生命周期无关。 因此,Docker不会在删除容器时自动删除卷,也不会“垃圾收集”不再由容器引用的卷。

这是非常清楚的,除了这个:

  • 更新图像时,不会包含对数据量的更改。

而且我正在努力更好地理解这一点。 任何人都可以提供一些更清晰的概述,可能有一些基本的例子吗?

谢谢!

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

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

这会创build一个名为my-data的卷(没有容器)。 现在,我创build一个新的容器,并在我的容器/inside/data装入这个容器。

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

现在,我在我的容器内的shell,所以我创build一个新的文件/inside/data文件夹/inside/data

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

现在/inside/data不是真的我的容器文件系统中,它是一个容器,在容器之外,只是装入。如果我停止我的容器,并且不要重新装入该容量,我的文件isn'那里。

 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 

其实连文件夹都不在那里! 因为我没有在那个位置安装任何东西。 我正在使用卷,所以我的数据不会持久在容器中。 那么我怎么find它呢? 那么它是坚持在音量( 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 

还有文件!

我想这是说如果数据量被其他进程改变了(可以从其他容器或其他系统改变),当你build立/更新你的Docker镜像时,这些改变将不被包含/logging,这是非常明显的。