如何使用 docker manifest create 命令构建多架构镜像

DockerDockerBeginner
立即练习

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

简介

在这个实验中,你将学习如何使用 docker manifest create 命令来构建和管理多架构 Docker 镜像。多架构镜像对于在具有不同 CPU 架构(如 amd64arm64)的各种环境中部署应用程序至关重要。

本实验将指导你完成准备多架构镜像的过程,包括启用实验性功能和创建多架构构建器实例。然后,你将创建一个清单列表(manifest list)来捆绑这些镜像,检查创建的清单列表以验证其内容,最后将清单列表推送到镜像仓库,使你的多架构镜像可在各种平台上进行部署。


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/inspect("Inspect Container") docker/ContainerOperationsGroup -.-> docker/create("Create Container") docker/ImageOperationsGroup -.-> docker/push("Push Image to Repository") docker/DockerfileGroup -.-> docker/build("Build Image from Dockerfile") subgraph Lab Skills docker/inspect -.-> lab-555169{{"如何使用 docker manifest create 命令构建多架构镜像"}} docker/create -.-> lab-555169{{"如何使用 docker manifest create 命令构建多架构镜像"}} docker/push -.-> lab-555169{{"如何使用 docker manifest create 命令构建多架构镜像"}} docker/build -.-> lab-555169{{"如何使用 docker manifest create 命令构建多架构镜像"}} end

准备多架构镜像

在这一步中,我们将准备多架构镜像。多架构镜像允许你构建并推送可在不同架构(如 amd64arm64)上运行的镜像。这对于将应用程序部署到各种环境(包括云服务器、边缘设备和本地机器)非常有用。

首先,我们需要在 Docker 中启用实验性功能。这能让我们使用 buildx 命令,该命令是构建多架构镜像所必需的。我们可以通过创建或修改 Docker 配置文件来实现这一点。

使用 nano 打开 Docker 配置文件:

nano ~/.docker/config.json

如果该文件不存在,nano 会创建它。将以下内容添加到文件中。如果文件已经存在,则在主 JSON 对象中添加 "experimental": "enabled" 这一行。

{
  "experimental": "enabled"
}

Ctrl + X,然后按 Y,再按 Enter 保存文件。

接下来,我们需要创建一个支持多种架构的新构建器实例。构建器实例是管理构建过程的 Docker 组件。

创建一个名为 mybuilder 的新构建器实例:

docker buildx create --name mybuilder --use

此命令创建一个名为 mybuilder 的新构建器实例,并将其设置为后续构建操作的默认构建器。输出应表明构建器已创建并正在使用。

现在,让我们构建一个简单的多架构镜像。我们将使用一个基本的 Dockerfile,它基于 Alpine Linux 创建一个镜像。

为我们的项目创建一个目录并进入该目录:

mkdir ~/project/multiarch-demo
cd ~/project/multiarch-demo

在这个目录中创建一个 Dockerfile

nano Dockerfile

将以下内容添加到 Dockerfile 中:

FROM alpine:latest
CMD ["echo", "Hello from multi-architecture image!"]

Ctrl + X,然后按 Y,再按 Enter 保存 Dockerfile

现在,为 linux/amd64linux/arm64 架构构建镜像,并将其推送到一个虚拟镜像仓库。我们将使用 localhost:5000 作为镜像仓库的占位符。在实际场景中,你需要将其替换为你实际的镜像仓库地址。

构建并推送多架构镜像:

docker buildx build --platform linux/amd64,linux/arm64 -t localhost:5000/multiarch-demo:latest --push .

此命令为指定的平台(linux/amd64linux/arm64)构建镜像,将其标记为 localhost:5000/multiarch-demo:latest,并将其推送到 localhost:5000 镜像仓库。输出将显示每个架构的构建过程和推送操作。

为镜像创建清单列表

在这一步中,我们将为上一步构建的多架构镜像创建一个清单列表(manifest list)。清单列表是一个镜像清单的集合,每个清单对应一种不同的架构。当你使用清单列表拉取镜像时,Docker 会自动为你的架构选择正确的镜像。

我们将使用 docker manifest create 命令来创建清单列表。该命令需要你指定要创建的清单列表的名称,后面跟着要包含在列表中的镜像名称。

创建一个名为 localhost:5000/multiarch-demo:latest 的清单列表:

docker manifest create localhost:5000/multiarch-demo:latest \
  localhost:5000/multiarch-demo:latest@sha256:$(docker buildx imagetools inspect localhost:5000/multiarch-demo:latest | grep 'Digest:' | awk '{print $2}' | head -n 1) \
  localhost:5000/multiarch-demo:latest@sha256:$(docker buildx imagetools inspect localhost:5000/multiarch-demo:latest | grep 'Digest:' | awk '{print $2}' | tail -n 1)

让我们来拆解一下这个命令:

  • docker manifest create localhost:5000/multiarch-demo:latest:这指定了我们要创建的清单列表的名称。
  • localhost:5000/multiarch-demo:latest@sha256:...:这些是我们要添加到清单列表中的镜像。我们使用镜像名称,后面跟着 @sha256: 和镜像的摘要(digest)。摘要可以唯一标识一个特定的镜像层。
  • $(docker buildx imagetools inspect localhost:5000/multiarch-demo:latest | grep 'Digest:' | awk '{print $2}' | head -n 1):这个命令链用于获取 docker buildx imagetools inspect 列出的第一个镜像的摘要。
  • $(docker buildx imagetools inspect localhost:5000/multiarch-demo:latest | grep 'Digest:' | awk '{print $2}' | tail -n 1):这个命令链用于获取 docker buildx imagetools inspect 列出的第二个镜像的摘要。

docker manifest create 命令的输出将是新创建的清单列表的摘要。

检查已创建的清单列表

在这一步中,我们将检查上一步创建的清单列表(manifest list)。检查清单列表可以让你查看列表中包含哪些镜像及其详细信息,例如架构和操作系统。

我们将使用 docker manifest inspect 命令来查看清单列表的详细信息。

检查清单列表 localhost:5000/multiarch-demo:latest

docker manifest inspect localhost:5000/multiarch-demo:latest

此命令的输出将是一个描述清单列表的 JSON 文档。你应该会看到一个 "manifests" 数组,每个元素代表一个不同架构的镜像。在每个清单条目中查找 "platform" 字段,以查看架构和操作系统信息。你应该会看到 linux/amd64linux/arm64 的条目。

这次检查确认了我们的清单列表正确包含了为不同架构构建的镜像。

将清单列表推送到镜像仓库

在这一步中,我们将把创建好的清单列表(manifest list)推送到镜像仓库(registry)。推送清单列表后,其他人就可以拉取这个多架构镜像了。当有人使用清单列表的标签拉取镜像时,Docker 会自动为他们系统的架构下载正确的镜像。

我们将使用 docker manifest push 命令来推送清单列表。

将清单列表 localhost:5000/multiarch-demo:latest 推送到镜像仓库:

docker manifest push localhost:5000/multiarch-demo:latest

这个命令会将清单列表以及它引用的所有镜像推送到指定的镜像仓库(localhost:5000)。由于我们在第一步中已经使用 docker buildx build --push 推送了各个镜像,所以这个命令主要是推送清单列表本身。

输出会显示清单列表的推送进度。

推送清单列表后,你可以验证它是否已在镜像仓库中可用。虽然在这个实验环境中我们没有运行中的镜像仓库来直接查询,但 docker manifest push 命令的成功执行表明清单列表已准备好推送。

为了模拟拉取多架构镜像并验证 Docker 是否选择了正确的架构,你可以尝试在不同架构的系统上拉取该镜像(如果有条件的话)。不过,在这个实验环境中,我们可以依靠推送命令的成功执行和之前的检查步骤来确认清单列表已准备就绪。

总结

在这个实验中,我们学习了如何使用 Docker 准备多架构镜像。这包括在 Docker 中启用实验性功能以使用 buildx 命令,该命令对于构建与 amd64arm64 等不同架构兼容的镜像至关重要。我们通过修改 config.json 文件来配置 Docker 客户端,以启用实验性功能。随后,我们使用 docker buildx create --name mybuilder --use 创建了一个名为 mybuilder 的新构建器实例,它能够管理多架构构建。最后,我们设置了一个基本的项目目录,并基于 Alpine Linux 创建了一个简单的 Dockerfile,作为构建多架构镜像的基础。