我正在使用docker version 18.09.2, build 6247962
。
我运行一个容器,并在该容器上安装了主机目录。
docker run -it -p 4444:8000 -v c:/py:/azima 27b4b21eeb64 /bin/sh
这创建了一个容器,并且主机目录c:/py
已安装到/azima
。
我可以检查,创建,读取文件,并且可以正常工作。
但是从another powershell
开始,当我运行此命令docker volume ls
时。
这显示为空。
检查container
会提供以下信息(如果有帮助):
"Mounts": [
{
"Type": "bind",
"Source": "/host_mnt/c/py",
"Destination": "/azima",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
为什么未列出该卷?
答案 0 :(得分:2)
这是因为-v c:/py:/azima
选项将使用bind-mounts将c:/py
挂载到容器内的/azima
目录中。
绑定装载基本上只是从容器内部的主机绑定某个目录或文件,而您这样做。
这就是为什么当您检查容器时会看到"Type": "bind"
docker volume将创建Named volumes,您可以使用docker volume create VOLUME_NAME
手动创建。它们是在/var/lib/docker/volumes
中创建的,只能通过其名称进行引用。
这些命名的卷仅在docker volume ls命令中列出。
当您检查连接到该卷的容器时,您会看到"Type": "volume"
更多信息here。
希望这会有所帮助。
答案 1 :(得分:1)
Docker卷和Docker挂载是两个不同的东西。
在绑定装载中,我们指定
Host Path
,并且它不显示在docker volumes ls
和卷中,而我们指定dockervolume name
,我们可以使用docker volumes ls
卷:卷是存储Docker容器创建或使用的持久数据的首选方式。主机文件系统还存储卷,类似于绑定安装。但是,Docker完全管理它们并将它们默认存储在〜/ docker / volumes下。
docker volume create alpine_test
现在运行容器
docker run --rm -v alpine_test:/root alpine ash -c "touch /root/test.txt"
这只会使用卷alpine_test
创建一个文件,容器将终止。
现在,如果我们运行另一个容器并列出文件
docker run -v alpine_test:/root alpine ash -c "ls /root/"
仍然,我们可以看到我们最后创建的文件。
如果容器终止,则数据仍将保留在卷中,并且可供以后使用。
如果您检查了大容量的附加容器,它将显示docker卷路径
docker inspect container_id
"Mounts": [
{
"Type": "volume",
"Name": "alpine_test",
"Source": "/var/snap/docker/common/var-lib-docker/volumes/alpine_test/_data",
"Destination": "/root",
"Driver": "local",
"Mode": "z",
"RW": true,
"Propagation": ""
}
],
B ind挂载:绑定挂载是存储在容器主机文件系统上任何位置的文件或文件夹,已挂载到正在运行的容器中。绑定挂载与卷的主要区别在于,由于它可以存在于主机文件系统上的任何位置,因此Docker外部的进程也可以对其进行修改。
docker run -v /home/test/:/test -it --rm alpine
对于安装,如果您检查容器,则将是主机安装路径的位置。
docker inspect container_id
"Mounts": [
{
"Type": "bind",
"Source": "/home/test/",
"Destination": "/root",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],