更新映像时的Docker卷

net*_*cat 4 docker docker-volume

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

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

除此之外,其中非常清楚:

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

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

谢谢!

joh*_*s85 5

位于容器文件系统之外.它们在运行时挂载,但其中的数据不在容器中.我们来举个例子:

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

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

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

现在/inside/data不是真的我的容器文件系统中,它是一个存在于容器外部的卷,只是安装在它中.如果我停止我的容器,并且_don't将该卷重新安装,我的文件就不存在了.

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
Run Code Online (Sandbox Code Playgroud)

事实上,即使文件夹不存在!因为我没有在那个位置安装任何东西.我正在使用卷,因此我的数据不会保留在容器中.那我怎么再找到它?那么它会持续存在于音量(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
Run Code Online (Sandbox Code Playgroud)

好的,我可以获取该数据并将其安装到不同的容器中.但是卷中的数据实际存在于何处?好吧我的主机文件系统.我们可以这样做:

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

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

j@host $ sudo ls /var/lib/docker/volumes/my-data/_data
my-file
Run Code Online (Sandbox Code Playgroud)

还有文件!


Ald*_*ndi 2

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