我是Docker的新手,我试图更好地理解Volumes主题。 我在这里看到:
- 创建容器时初始化卷。如果容器的基本映像包含指定安装点的数据,则在卷初始化时将现有数据复制到新卷中。 (请注意,安装主机目录时不适用。)
- 可以在容器之间共享和重用数据卷。
- 直接对数据卷进行更改。
- 更新图像时,不会包含对数据卷的更改。
- 即使容器本身已被删除,数据量仍然存在。
- 数据卷旨在保存数据,与容器的生命周期无关。因此,当您删除容器时,Docker永远不会自动删除卷,也不会“垃圾收集”容器不再引用的卷。
除此之外,其中非常清楚:
- 更新图像时,不会包含对数据卷的更改。
我真的在努力更好地理解这一点。 任何人都可以提供一些更清晰的概述,可能有一些基本的例子吗?
谢谢!
答案 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镜像时,不会包含/记录更改,这是很明显。