如何使用 docker image ls 命令列出和过滤镜像

DockerDockerBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

介绍

在这个实验(Lab)中,你将学习如何有效地使用 docker images 命令来列出和过滤你系统上的 Docker 镜像。你将从列出所有顶层镜像开始,然后探索如何按特定名称和标签列出镜像。

此外,你将深入研究如何基于镜像的悬虚(dangling)状态和应用标签来过滤镜像。最后,你将学习如何使用自定义模板来自定义 docker images 命令的输出格式,以便更定制化地显示信息。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/DockerfileGroup(["Dockerfile"]) docker/ContainerOperationsGroup -.-> docker/ls("List Containers") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") docker/ImageOperationsGroup -.-> docker/images("List Images") docker/DockerfileGroup -.-> docker/build("Build Image from Dockerfile") subgraph Lab Skills docker/ls -.-> lab-555157{{"如何使用 docker image ls 命令列出和过滤镜像"}} docker/pull -.-> lab-555157{{"如何使用 docker image ls 命令列出和过滤镜像"}} docker/images -.-> lab-555157{{"如何使用 docker image ls 命令列出和过滤镜像"}} docker/build -.-> lab-555157{{"如何使用 docker image ls 命令列出和过滤镜像"}} end

列出所有顶层镜像

在这一步中,你将学习如何列出你系统上的所有顶层 Docker 镜像。顶层镜像是指你显式拉取或构建的镜像。它们不是在构建过程中创建的中间镜像。

要列出所有顶层镜像,你可以使用 docker images 命令。此命令将显示一个表格,其中包含有关每个镜像的信息,包括仓库(repository)、标签(tag)、镜像 ID(image ID)、创建时间(creation time)和大小(size)。

让我们尝试列出镜像。由于这是一个全新的环境,最初可能没有太多镜像。我们将在后面的步骤中拉取一个镜像。

~/project 目录中打开你的终端,然后运行以下命令:

docker images

你应该看到类似于以下的输出(确切的输出可能因存在的镜像而异):

REPOSITORY    TAG       IMAGE ID       CREATED       SIZE

此输出表明你系统上目前没有顶层镜像。

按名称和标签列出镜像

在这一步中,你将学习如何按名称和标签列出特定的 Docker 镜像。当你有很多镜像并想找到特定的一个时,这非常有用。

docker images 命令允许你指定一个仓库名称,并可选择指定一个标签来过滤输出。格式为 docker images [REPOSITORY[:TAG]]

首先,让我们拉取一个镜像,以便我们有东西可以列出。我们将拉取 hello-world 镜像,这是一个用于测试的非常小的镜像。

运行以下命令来拉取 hello-world 镜像:

docker pull hello-world

你应该看到输出表明该镜像正在被拉取和下载:

Using default tag: latest
latest: Pulling from library/hello-world
...
Status: Downloaded newer image for hello-world:latest
docker.io/library/hello-world:latest

现在我们有了 hello-world 镜像,让我们只使用它的名称列出这个镜像。

运行以下命令:

docker images hello-world

输出应该只显示 hello-world 镜像:

REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   latest    <image_id>     <created_time>   <size>

你还可以指定一个标签(tag)。由于我们拉取了 latest 标签,让我们列出带有 latest 标签的 hello-world 镜像。

运行以下命令:

docker images hello-world:latest

输出将与上一个命令相同,因为如果没有指定标签,则 latest 是默认标签:

REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   latest    <image_id>     <created_time>   <size>

如果你尝试列出不存在的镜像,你将得到一个空输出。例如:

docker images non-existent-image

输出:

REPOSITORY    TAG       IMAGE ID       CREATED       SIZE

这证实了你可以按名称和标签过滤镜像。

按悬虚状态(dangling status)过滤镜像

在这一步中,你将学习如何根据 Docker 镜像的“悬虚(dangling)”状态进行过滤。悬虚镜像(Dangling images)是指与任何已标记(tagged)镜像没有关系的层(layer)。它们通常是构建镜像新版本的结果,这使得旧的层没有标签。这些悬虚镜像会占用磁盘空间,可以被清理掉。

要按悬虚状态过滤镜像,你可以将 --filter 标志与 dangling 键一起使用。该值可以是 true 以仅显示悬虚镜像,也可以是 false 以仅显示非悬虚镜像。

首先,让我们创建一个悬虚镜像。我们可以通过构建一个替换现有镜像的新镜像来做到这一点。我们将为此使用一个简单的 Dockerfile。

在你的 ~/project 目录中创建一个名为 Dockerfile 的文件,内容如下:

FROM alpine
CMD ["echo", "Hello, world!"]

这个 Dockerfile 非常简单。它使用 alpine 镜像作为基础,并在从它运行容器时只打印 "Hello, world!"。

现在,让我们从这个 Dockerfile 构建一个镜像并标记它。

运行以下命令来构建镜像并将其标记为 my-image:latest

docker build -t my-image:latest .

你应该看到输出表明构建过程:

[+] Building
...
Successfully built <image_id>
Successfully tagged my-image:latest

现在,让我们稍微修改 Dockerfile,然后使用相同的标签再次构建它。这将创建一个带有 my-image:latest 标签的新镜像,并且之前具有此标签的镜像将变为悬虚镜像。

编辑你的 ~/project 目录中的 Dockerfile 以更改命令:

FROM alpine
CMD ["echo", "Hello again!"]

现在,使用相同的标签再次构建镜像:

docker build -t my-image:latest .

你将看到与之前构建类似的输出,但会生成一个新的镜像 ID(image ID)。之前带有 my-image:latest 标签的镜像现在是悬虚的。

让我们列出所有镜像以查看悬虚镜像。

运行命令:

docker images

你可能会在 REPOSITORY 和 TAG 列中看到一个带有 <none> 的镜像。这是一个悬虚镜像。

REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
my-image      latest    <new_image_id> <created_time>   <size>
<none>        <none>    <old_image_id> <created_time>   <size>
hello-world   latest    <image_id>     <created_time>   <size>

现在,让我们使用 --filter dangling=true 标志过滤以仅显示悬虚镜像。

运行命令:

docker images --filter dangling=true

你应该只看到悬虚镜像:

REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
<none>        <none>    <old_image_id> <created_time>   <size>

要仅查看非悬虚镜像,你可以使用 --filter dangling=false

运行命令:

docker images --filter dangling=false

这将列出所有非悬虚镜像:

REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
my-image      latest    <new_image_id> <created_time>   <size>
hello-world   latest    <image_id>     <created_time>   <size>

这演示了如何根据镜像的悬虚状态进行过滤。

按标签(label)过滤镜像

在这一步中,你将学习如何根据标签过滤 Docker 镜像。标签是键值对(key-value pairs),你可以将它们附加到包括镜像在内的 Docker 对象。它们对于组织和识别镜像非常有用。

要按标签过滤镜像,你可以将 --filter 标志与 label 键一起使用。该值可以是单个标签(label=<key>=<value>),也可以仅是标签键(label=<key>),以查找具有该标签的镜像,而不管其值如何。

首先,让我们创建一个包含标签的新 Dockerfile。

在你的 ~/project 目录中创建一个名为 Dockerfile.labeled 的文件,内容如下:

FROM alpine
LABEL maintainer="LabEx User"
LABEL version="1.0"
CMD ["echo", "Image with labels!"]

这个 Dockerfile 与之前的类似,但包含两个 LABEL 指令。

现在,让我们从这个 Dockerfile 构建一个镜像并标记它。

运行以下命令来构建镜像并将其标记为 labeled-image:latest

docker build -t labeled-image:latest -f Dockerfile.labeled .

你应该看到输出表明构建过程以及镜像的成功标记。

现在,让我们列出所有镜像以查看新创建的镜像。

运行命令:

docker images

你应该在列表中看到 labeled-image 以及其他镜像。

REPOSITORY      TAG       IMAGE ID       CREATED        SIZE
labeled-image   latest    <image_id>     <created_time>   <size>
my-image        latest    <new_image_id> <created_time>   <size>
<none>          <none>    <old_image_id> <created_time>   <size>
hello-world     latest    <image_id>     <created_time>   <size>

现在,让我们按 maintainer 标签过滤镜像。我们将过滤 maintainer 标签的值为 "LabEx User" 的镜像。

运行命令:

docker images --filter label=maintainer=LabEx User

你应该只看到 labeled-image

REPOSITORY      TAG       IMAGE ID       CREATED        SIZE
labeled-image   latest    <image_id>     <created_time>   <size>

你还可以仅按标签键进行过滤,而不管其值如何。让我们过滤具有 version 标签的镜像。

运行命令:

docker images --filter label=version

你应该再次只看到 labeled-image

REPOSITORY      TAG       IMAGE ID       CREATED        SIZE
labeled-image   latest    <image_id>     <created_time>   <size>

这演示了如何使用标签过滤镜像。

使用自定义模板格式化输出

在这一步中,你将学习如何使用自定义模板格式化 docker images 命令的输出。当你想要以机器可读的格式或自定义的人类可读的格式提取有关镜像的特定信息时,这非常有用。

docker images 命令支持 --format 标志,该标志允许你指定一个 Go 模板来控制输出。你可以在模板中使用各种占位符来访问镜像的不同属性。

让我们尝试格式化输出,以仅显示镜像 ID 和仓库(repository)名称,并用冒号分隔。

运行以下命令:

docker images --format "{{.ID}}: {{.Repository}}"

你应该看到类似于以下的输出,其中列出了每个镜像的镜像 ID 和仓库:

<image_id>: hello-world
<new_image_id>: my-image
<old_image_id>: <none>
<image_id>: labeled-image

请注意,悬虚镜像的仓库仍然显示 <none>

你还可以包含其他属性,如标签和大小。让我们格式化输出以显示仓库、标签和大小,并用制表符分隔。

运行以下命令:

docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"

在格式字符串的开头使用 table 会创建一个带有表头的类似表格的输出。

你应该看到类似于以下的输出:

REPOSITORY          TAG                 SIZE
hello-world         latest              <size>
my-image            latest              <size>
<none>              <none>              <size>
labeled-image       latest              <size>

你可以在 Docker 文档中找到 docker images 命令的可用占位符列表。一些常见的包括:

  • .ID:镜像 ID
  • .Repository:镜像仓库名称
  • .Tag:镜像标签
  • .Created:镜像创建时间
  • .Size:镜像大小
  • .Containers:使用该镜像的容器数量

尝试使用不同的模板,看看如何自定义输出。例如,要列出镜像 ID 和创建时间:

docker images --format "{{.ID}} created at {{.Created}}"

此步骤结束了关于列出和过滤 Docker 镜像的实验。你已经学习了如何列出所有镜像,按名称、标签、悬虚状态和标签进行过滤,以及使用自定义模板格式化输出。

总结

在这个实验中,你学习了如何使用 docker images 命令来列出和过滤 Docker 镜像。你首先列出了系统上的所有顶层镜像(top-level images)。然后,在拉取(pull)了 hello-world 镜像后,你练习了按名称和标签列出特定的镜像。

你还探索了如何根据镜像的悬虚状态(dangling status)和特定标签来过滤镜像。最后,你学习了如何使用自定义模板来定制 docker images 命令的输出格式,从而只显示你需要的信息。