1. 概述

Docker 是最受欢迎的容器技术之一。它将应用程序及其依赖项打包在一起,并允许它们在隔离的环境中运行。这种技术极大地增加了应用程序的可移植性。默认情况下,容器存储是瞬态的,这对于状态性应用来说并不是理想的选择。然而,我们可以通过使用volumes来克服这一限制。

在这篇教程中,我们将看到如何列出卷并显示它们的详细信息。

2. 示例设置

让我们创建一些带有属性的卷作为示例:

$ docker volume create dangling-volume
$ docker volume create narendra-volume --driver local --opt type=tmpfs --opt device=tmpfs
$ docker volume create labeled-volume --label owner=narendra

教程后半部分将展示我们如何根据这些属性过滤卷。接下来的部分,我们将查看我们的示例是否已正确设置。

3. 显示基本卷信息

Docker 的 volume list 子命令将显示每个卷的简要摘要:

$ docker volume list
DRIVER    VOLUME NAME
local     dangling-volume
local     labeled-volume
local     narendra-volume

有时,我们只需要卷的名称。在这种情况下,我们可以使用 --quiet 选项:

$ docker volume list --quiet
dangling-volume
labeled-volume
narendra-volume

上述方法对于少量卷工作良好,但在列出大量卷时可能会变得繁琐。在这种情况下,我们可以使用 --filter 选项。此选项允许我们根据某些属性进行过滤。让我们看看一些示例。

3.1. 按名称过滤

我们可以使用 name 过滤器列出包含特定字符串的卷名称。让我们列出包含 "narendra" 的卷:

$ docker volume list --filter name=narendra
DRIVER    VOLUME NAME
local     narendra-volume

3.2. 按标签过滤

标签用于标记资源。一个非常常见的场景是将符合特定条件的资源分组。例如,开发者可以使用用户名作为标签,以便轻松识别他们创建的卷。让我们通过一个例子来理解这一点:

$ docker volume list --filter label=owner=narendra
DRIVER    VOLUME NAME
local     labeled-volume

在这个例子中,过滤器匹配带有标签 owner=narendra 的卷,这是我们设置示例卷时添加的。

3.3. 按驱动程序名称过滤

有时我们需要根据驱动程序的名称对卷进行分类。在这种情况下,我们可以使用 driver 过滤器:

$ docker volume list --filter driver=local
DRIVER    VOLUME NAME
local     dangling-volume
local     labeled-volume
local     narendra-volume

3.4. 无用卷(Dangling Volumes)

卷占用 Docker 主机的空间,因此清理未使用的卷是一个好习惯。删除错误的卷可能导致数据丢失,所以在删除之前我们必须格外小心。为了安全起见,我们可以通过使用 dangling 过滤器确保卷未被任何容器引用。让我们看看实际操作。

首先,让我们创建一个使用卷的容器:

$ docker container run -d --name dangling-volume-demo -v narendra-volume:/tmpwork \
   -v labeled-volume:/data busybox
fa3f6fd8261293a92da7efbca4b04040a1838cf57b2703795324eb70a3d84143

在这个例子中,容器使用了我们三个卷中的两个:narendra-volumelabeled-volume。现在让我们确认第三个卷是唯一未被引用的(即无用的)卷:

$ docker volume list --filter dangling=true
DRIVER    VOLUME NAME
local     dangling-volume

4. 显示详细卷信息

list 子命令只显示关于卷的非常有限的信息。有时这还不够。例如,在了解卷的详细信息后,调试会更容易。在这种情况下,我们可以使用 volume inspect 子命令获取有关卷的更多详细信息。这个命令会显示信息,如卷的创建时间戳、挂载点等。让我们通过一个例子来看看:

$ docker volume inspect labeled-volume
[
    {
        "CreatedAt": "2022-05-30T22:34:53+05:30",
        "Driver": "local",
        "Labels": {
            "owner": "narendra"
        },
        "Mountpoint": "/var/lib/docker/volumes/labeled-volume/_data",
        "Name": "labeled-volume",
        "Options": {},
        "Scope": "local"
    }
]

5. 显示容器特定的卷信息

另一个非常常见的场景是找到给定容器使用的卷。开发者经常需要这些信息来进行调试。我们可以使用 container inspect 子命令获取特定容器的卷信息。这个命令返回 Docker 对象的低级信息,如其状态、主机配置、网络设置等。我们可以通过指定 Mounts 部分来收集有关卷的挂载信息:

$ docker container inspect --format '{{ json .Mounts }}' dangling-volume-demo | python3 -m json.tool
[
    {
        "Type": "volume",
        "Name": "narendra-volume",
        "Source": "/var/lib/docker/volumes/narendra-volume/_data",
        "Destination": "/tmpwork",
        "Driver": "local",
        "Mode": "z",
        "RW": true,
        "Propagation": ""
    },
    {
        "Type": "volume",
        "Name": "labeled-volume",
        "Source": "/var/lib/docker/volumes/labeled-volume/_data",
        "Destination": "/data",
        "Driver": "local",
        "Mode": "z",
        "RW": true,
        "Propagation": ""
    }
]

注意,在这个例子中,我们将输出管道到 Python 解释器以使 JSON 输出更易于阅读。然而,这是完全可选的。

6. 结论

在这篇文章中,我们看到了列出 Docker 卷的一些实用示例。首先,我们使用了 list 子命令。然后我们看到了如何使用它与过滤器一起使用。最后,我们使用了 inspect 子命令来显示卷的详细信息。