卷存在于容器文件系统之外。它们在运行时挂载,但其中的数据并不存在于容器中。举个例子:
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 并不是真正在我的容器文件系统中,它是一个位于容器外部的卷,它只是安装在其中。如果我停止我的容器,_不要安装那个卷回来了,我的文件不在那里了。
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
还有文件!