镜像摘要
什么是 Docker 镜像摘要?
Docker 镜像摘要是代表 Docker 镜像内容的唯一加密标识符(SHA-256 哈希值)。与可重复使用或更改的标签不同,摘要是不可变的,可确保每次都拉取完全相同的镜像。这保证了不同环境和部署之间的一致性。
例如,`nginx:latest` 镜像的摘要可能如下所示
sha256:94a00394bc5a8ef503fb59db0a7d0ae9e1110866e8aee8ba40cd864cea69ea1a此摘要唯一标识 `nginx:latest` 镜像的特定版本,确保镜像内容的任何更改都会导致不同的摘要。
为什么镜像摘要很重要?
使用镜像摘要而不是标签具有以下几个优点
不变性:一旦镜像构建并生成了其摘要,与该摘要关联的内容就不能更改。这意味着,如果您使用摘要拉取镜像,您可以确信您正在检索的正是最初构建的镜像。
安全性:摘要有助于通过确保镜像内容未被篡改来防止供应链攻击。即使镜像内容发生微小更改,也会导致完全不同的摘要。
一致性:使用摘要可确保在不同环境中使用相同的镜像,从而降低开发、暂存和生产环境之间出现差异的风险。
Docker 强化镜像摘要
通过使用镜像摘要来引用 DHI,您可以确保您的应用程序始终使用完全相同的安全镜像版本,从而增强安全性和合规性
查看镜像摘要
使用 Docker CLI
要查看 Docker 镜像的镜像摘要,您可以使用以下命令。将 `<image-name>:<tag>` 替换为镜像名称和标签。
$ docker buildx imagetools inspect <image-name>:<tag>
使用 Docker Hub UI
- 前往 Docker Hub 并登录。
- 导航到您组织的命名空间并打开镜像的 DHI 仓库。
- 选择 **标签** 选项卡以查看镜像变体。
- 列表中的每个标签都包含一个 **摘要** 字段,显示镜像的 SHA-256 值。
按摘要拉取镜像
按摘要拉取镜像可确保您拉取的是由指定摘要标识的精确镜像版本。
要使用其摘要拉取 Docker 镜像,请使用以下命令。将 `<image-name>` 替换为镜像名称,将 `<digest>` 替换为镜像摘要。
$ docker pull <image-name>@sha256:<digest>
例如,要使用其摘要 `94a00394bc5a8ef503fb59db0a7d0ae9e1110866e8aee8ba40cd864cea69ea1a` 拉取 `docs/dhi-python:3.13` 镜像,您将运行
$ docker pull docs/dhi-python@sha256:94a00394bc5a8ef503fb59db0a7d0ae9e1110866e8aee8ba40cd864cea69ea1a
多平台镜像和清单
Docker 强化镜像作为多平台镜像发布,这意味着单个镜像标签(例如 `docs/dhi-python:3.13`)可以支持多个操作系统和 CPU 架构,例如 `linux/amd64`、`linux/arm64` 等。
多平台标签不是指向单个镜像,而是指向清单列表(也称为索引),它是一个更高级别的对象,引用多个镜像摘要,每个受支持平台一个。
当您使用 `docker buildx imagetools inspect` 检查多平台镜像时,您会看到类似这样的内容
Name: docs/dhi-python:3.13
MediaType: application/vnd.docker.distribution.manifest.list.v2+json
Digest: sha256:6e05...d231
Manifests:
Name: docs/dhi-python:3.13@sha256:94a0...ea1a
Platform: linux/amd64
...
Name: docs/dhi-python:3.13@sha256:7f1d...bc43
Platform: linux/arm64
...- 清单列表摘要 (`sha256:6e05...d231`) 标识整个多平台镜像。
- 每个平台特定镜像都有自己的摘要(例如,`linux/amd64` 的 `sha256:94a0...ea1a`)。
为何这很重要
- 可复现性:如果您在不同的架构上构建或运行容器,单独使用标签将解析为适用于您平台的相应镜像摘要。
- 验证:您可以拉取并验证您平台的特定镜像摘要,以确保您使用的是确切的镜像版本,而不仅仅是清单列表。
- 策略强制:使用 Docker Scout 强制执行基于摘要的策略时,每个平台变体都会使用其摘要单独评估。