卷存在于容器的文件系统之外。它们在运行时挂载,但其中的数据并不存在于容器中。举个例子:
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
现在我在容器内的外壳中,所以我在文件夹中创建了一个新文件/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
还有文件!