如何使用 docker manifest inspect 命令查看镜像清单

DockerBeginner
立即练习

介绍

在这个实验中,你将学习如何使用 docker manifest inspect 命令来查看镜像清单。我们将从拉取一个多架构的 Docker 镜像开始,具体是 alpine 镜像,以此来了解 Docker 如何处理不同架构的镜像。

拉取镜像后,你将使用 docker manifest inspect 来检查与多架构镜像关联的清单列表。然后,你将深入检查该列表中的特定镜像清单,最后探索 docker manifest inspect 命令的详细输出选项,以全面了解镜像清单的详细信息。

拉取多架构镜像

在这一步中,你将学习如何拉取多架构的 Docker 镜像。多架构镜像指的是一个单一的镜像标签,可在不同架构(如 amd64arm64 等)中使用。当你拉取多架构镜像时,Docker 会自动为你系统的架构选择正确的镜像层。

我们将拉取 alpine 镜像,它是一种轻量级的 Linux 发行版,常用于 Docker 容器。alpine 镜像是一个多架构镜像。

要拉取 alpine 镜像,请打开终端并运行以下命令:

docker pull alpine

此命令会指示 Docker 从 Docker Hub 下载 alpine 镜像的最新版本。由于 alpine 是多架构镜像,Docker 会下载适合你 LabEx 虚拟机架构的镜像层。

你应该会看到类似以下的输出,表明 Docker 正在拉取镜像:

Using default tag: latest
latest: Pulling from library/alpine
... (output showing download progress)
Digest: sha256:...
Status: Downloaded newer image for alpine:latest
docker.io/library/alpine:latest

Digest 行显示了为你的架构拉取的特定镜像清单的唯一标识符。

命令执行完成后,alpine 镜像将在你的 LabEx 虚拟机上可用,并可用于运行容器。

检查多架构镜像的清单列表

在上一步中,我们拉取了 alpine 镜像。由于 alpine 是多架构镜像,标签 alpine:latest 实际上指向一个 清单列表。清单列表是一个镜像清单的集合,每个清单对应一种不同的架构。当你拉取多架构镜像时,Docker 会使用清单列表为你的系统找到正确的镜像清单。

要查看 alpine:latest 镜像的清单列表,我们可以使用 docker manifest inspect 命令。该命令允许你查看镜像清单或清单列表的详细信息。

在终端中运行以下命令:

docker manifest inspect alpine:latest

此命令将输出一个 JSON 文档,该文档表示 alpine:latest 镜像的清单列表。输出将显示一个 manifests 列表,每个清单对应一种不同的架构(如 amd64arm64arm/v7 等)。列表中的每个清单都会包含诸如 platform(架构和操作系统)和 digest(特定架构的镜像清单的唯一标识符)等详细信息。

你会看到类似以下的输出(具体的摘要信息和清单数量可能会有所不同):

{
   "schemaVersion": 2,
   "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
   "manifests": [
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 528,
         "digest": "sha256:...",
         "platform": {
            "architecture": "amd64",
            "os": "linux"
         }
      },
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 528,
         "digest": "sha256:...",
         "platform": {
            "architecture": "arm",
            "os": "linux",
            "variant": "v6"
         }
      },
      ...
   ]
}

此输出证实了 alpine:latest 确实是一个包含各种架构清单的清单列表。这就是当你使用多架构标签时,Docker 知道为你的系统拉取哪个特定镜像的方式。

检查列表中特定镜像的清单

在上一步中,我们检查了 alpine:latest 的清单列表。该列表包含多个条目,每个条目指向不同架构的特定镜像清单。现在,让我们来检查其中一个特定的镜像清单。

要检查特定的清单,我们需要其摘要信息(digest)。从 docker manifest inspect alpine:latest 的输出中,找到与你的 LabEx 虚拟机架构(即 amd64)匹配的 digest。摘要信息看起来会像 sha256:...

一旦你获得了 amd64 清单的摘要信息,就可以使用 docker manifest inspect 命令来检查它,命令后面要跟上镜像名称和摘要信息,两者用 @ 符号分隔。

YOUR_AMD64_DIGEST 替换为你在上一步输出中找到的 amd64 平台的实际摘要信息。

docker manifest inspect alpine@YOUR_AMD64_DIGEST

例如,如果 amd64 的摘要信息是 sha256:f70734b6a266dcb51c52a820c34f3204cc6897445f6510b7a5be74d30a72f227,那么命令将是:

docker manifest inspect alpine@sha256:f70734b6a266dcb51c52a820c34f3204cc6897445f6510b7a5be74d30a72f227

此命令将输出一个 JSON 文档,该文档表示 amd64 架构的特定镜像清单。这个清单包含有关镜像层(由其摘要信息标识)和镜像配置(同样由摘要信息标识)的详细信息。

你会看到类似以下的输出:

{
  "schemaVersion": 2,
  "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
  "config": {
    "mediaType": "application/vnd.docker.container.image.v1+json",
    "size": 1510,
    "digest": "sha256:..."
  },
  "layers": [
    {
      "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
      "size": 2803897,
      "digest": "sha256:..."
    }
  ]
}

此输出展示了单个镜像清单的结构,列出了构成该特定架构镜像的配置和层。

以详细输出模式检查清单

在前面的步骤中,我们检查了清单列表和特定的镜像清单。docker manifest inspect 的默认输出会提供清单或清单列表的摘要信息。若要获取更详细的信息,包括镜像的完整配置,我们可以使用 --verbose 标志。

让我们再次检查 alpine:latest 的清单列表,但这次使用 --verbose 标志。这将显示清单列表,并且对于列表中的每个清单,还会显示完整的配置细节。

在你的终端中运行以下命令:

docker manifest inspect --verbose alpine:latest

此命令将输出一个更详细的 JSON 文档。对于 manifests 列表中的每个条目,你现在会看到一个名为 Config 的额外字段。这个 Config 字段包含了特定架构镜像的完整配置,包括诸如入口点、命令、环境变量、工作目录等详细信息。

你会看到类似以下的输出(Config 部分的具体细节会有所不同):

{
   "schemaVersion": 2,
   "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
   "manifests": [
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 528,
         "digest": "sha256:...",
         "platform": {
            "architecture": "amd64",
            "os": "linux"
         },
         "Config": {
            "Env": [
               "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Entrypoint": [
               "/bin/sh"
            ],
            "Cmd": null,
            "WorkingDir": "/",
            ...
         }
      },
      ...
   ]
}

当你需要查看清单列表中镜像的详细配置时,使用 --verbose 标志很有用,这对于调试或了解特定镜像的设置方式很有帮助。

总结

在本次实验中,我们学习了如何使用 docker manifest inspect 命令来查看镜像清单。我们首先拉取了一个多架构镜像 alpine,了解到单个标签可以代表不同架构的镜像。

然后,我们使用 docker manifest inspect 查看与多架构镜像关联的清单列表,该列表详细列出了适用于各种架构的可用镜像清单。最后,我们探索了如何检查列表中的特定镜像清单,以及如何使用详细输出选项获取更详细的信息。