docker 卷 ls 列出空的

docker volume ls lists empty

我正在使用 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"
        }
    ],

为什么没有列出卷?

这是因为 -v c:/py:/azima 选项将使用 bind-mounts.

c:/py 挂载到容器内的 /azima 目录中

绑定挂载基本上只是绑定容器内主机中的某个目录或文件,您已经这样做了。

这就是为什么当您检查容器时会看到 "Type": "bind"

docker volume will create Named volumes 是您使用 docker volume create VOLUME_NAME 手动创建的。它们是在 /var/lib/docker/volumes 中创建的,只能通过名称引用。

这些命名卷仅在 docker volume ls 命令中列出。

当您检查连接到此类卷的容器时,您会看到 "Type": "volume"

更多信息here

希望对您有所帮助。

Docker volume 和 Docker mount 是两个不同的东西。

In bind mounts, we specify Host Path and it does not show in docker volumes ls and volume we specify docker volume name and we can see docker volume using docker volumes ls

卷: 卷是存储容器创建或使用的持久数据的首选方式。主机文件系统也存储卷,类似于绑定挂载。但是,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": ""
                }
            ],

绑定装载:绑定装载是存储在容器主机文件系统上任何位置的文件或文件夹,装载到 运行ning 容器中。绑定挂载与卷的主要区别在于,由于它可以存在于主机文件系统的任何位置,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"
            }
        ],