更新图像时的Docker卷

时间:2016-06-29 09:48:23

标签: docker docker-volume

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

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

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

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

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

谢谢!

2 个答案:

答案 0 :(得分: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将该卷装回,我的文件就不存在了。

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

还有文件!

答案 1 :(得分:1)

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