容器的卷只是主机上的目录,无论它们是由什么方法创建的。如果您没有在主机上指定目录,Docker 将为卷创建一个新目录,通常在/var/lib/docker/vfs
.
不管卷是如何创建的,使用以下命令很容易找到它在主机上的位置,docker inspect
例如:
$ ID=$(docker run -d -v /data debian echo "Data container")
$ docker inspect -f {{.Mounts}} $ID
[{0d7adb21591798357ac1e140735150192903daf3de775105c18149552a26f951 /var/lib/docker/volumes/0d7adb21591798357ac1e140735150192903daf3de775105c18149552a26f951/_data /data local true }]
我们可以看到 Docker 为卷创建了一个目录/var/lib/docker/volumes/0d7adb21591798357ac1e140735150192903daf3de775105c18149552a26f951/_data
。
您可以从主机自由修改/添加/删除此目录中的文件,但请注意,您可能需要使用sudo
权限。
Docker 只会在两种情况下删除卷目录:
- 如果
--rm
选项被赋予docker run
,任何卷都将在容器退出时被删除
- 如果使用 删除容器
docker rm -v CONTAINER
,则将删除所有卷。
在这两种情况下,只有在没有其他容器引用它们时才会删除卷。映射到特定主机目录(-v HOST_DIR:CON_DIR
语法)的卷永远不会被 Docker 删除。但是,如果您删除卷的容器,命名方案意味着您将很难确定哪个目录包含该卷。
所以,具体问题:
- 是的,是的,但有上述警告。
- 每个 Docker 托管卷都会在主机上获得一个新目录
- 该
VOLUME
指令与-v
不指定主机目录相同。当指定主机目录时,Docker 不会为卷创建任何目录,不会从镜像中复制文件,并且永远不会删除卷(docker rm -v CONTAINER
不会删除映射到用户指定主机目录的卷)。
更多信息在这里:
https://blog.container-solutions.com/understanding-volumes-docker