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-volume
和 labeled-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
子命令来显示卷的详细信息。