介绍
在这个实验(Lab)中,你将学习如何有效地使用 docker images
命令来列出和过滤你系统上的 Docker 镜像。你将从列出所有顶层镜像开始,然后探索如何按特定名称和标签列出镜像。
此外,你将深入研究如何基于镜像的悬虚(dangling)状态和应用标签来过滤镜像。最后,你将学习如何使用自定义模板来自定义 docker images
命令的输出格式,以便更定制化地显示信息。
在这个实验(Lab)中,你将学习如何有效地使用 docker images
命令来列出和过滤你系统上的 Docker 镜像。你将从列出所有顶层镜像开始,然后探索如何按特定名称和标签列出镜像。
此外,你将深入研究如何基于镜像的悬虚(dangling)状态和应用标签来过滤镜像。最后,你将学习如何使用自定义模板来自定义 docker images
命令的输出格式,以便更定制化地显示信息。
在这一步中,你将学习如何列出你系统上的所有顶层 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
这证实了你可以按名称和标签过滤镜像。
在这一步中,你将学习如何根据 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>
这演示了如何根据镜像的悬虚状态进行过滤。
在这一步中,你将学习如何根据标签过滤 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
命令的输出格式,从而只显示你需要的信息。