一、为什么要关注异构和 ARM 镜像

随着 ARM 云服务器、边缘设备和 Apple 芯片设备越来越普及,镜像只支持单一平台已经不够用了。

多架构镜像的核心目标是:

  • 让同一套镜像交付能力适配不同 CPU 架构
  • 避免只在 amd64 环境可用
  • 为云上异构部署、边缘场景和混合架构环境提供支持

二、buildx 是多架构构建的关键入口

传统 docker build 在多平台构建上能力有限,而 docker buildx 可以配合 BuildKit 和构建器实现更灵活的跨架构镜像制作。

在实战中,通常会经历下面几个步骤:

  • 准备待复制文件或构建上下文
  • 查看当前默认构建器
  • 创建新的多平台构建器
  • 启用构建器并安装 binfmt 支持
  • 编写 Dockerfile
  • 使用 buildx build 指定平台构建并推送

三、构建前要先完成哪些准备

原始示例先在本地准备一个目录作为演示构建上下文:

mkdir files
touch files/{a..d}
tree files

这一步虽然简单,但它说明了多架构构建与普通构建并没有本质区别:构建上下文仍然是所有镜像制作的起点

四、先看懂默认构建器状态

执行下面的命令查看默认构建器:

docker builder ls

如果只看到默认平台主要是 linux/amd64,就说明当前环境还没有准备好多架构构建能力。

五、如何创建新的多平台构建器

示例命令如下:

docker buildx create --name mybuilder --use \
  --platform linux/amd64,linux/arm64 \
  --driver docker-container

然后再次检查:

docker builder ls | grep mybuilder

接着执行:

docker buildx inspect --bootstrap

这样就完成了新构建器的初始化和激活。

六、为什么还要安装 binfmt

只创建构建器还不够,多架构模拟通常还需要借助 binfmt 支持。

示例命令:

docker run --privileged --rm tonistiigi/binfmt --install all

安装完成后,再次查看构建器平台列表,通常就能看到 linux/arm64linux/arm 等平台已经处于可用状态。

七、Dockerfile 需要注意什么

原始示例 Dockerfile 很简单:

FROM centos:7
COPY files /mnt/files

但这里有一个非常重要的注意点:如果你复制的是二进制文件,那么这个二进制本身也必须能在目标架构运行

也就是说:

  • 复制普通文本文件问题不大
  • 复制已编译可执行文件时,一定要确认目标平台兼容

八、如何把 ARM 镜像构建并推送到阿里云仓库

示例构建命令:

docker buildx build --platform linux/arm64 \
  -t registry.cn-hangzhou.aliyuncs.com/abroad_images/buildx:v2 \
  --push -f ./Dockerfile .

如果你不仅要构建 arm64,还想同时支持 amd64,可以把平台列表扩展成:

linux/arm64,linux/amd64

如果只想本地构建并加载,而不是立即推送,则可以考虑配合 --load 使用。

九、为什么构建成功不等于本机就能直接运行

原始示例在 amd64 环境中运行 arm64 镜像时,出现了平台不匹配警告:

The requested image's platform (linux/arm64) does not match the detected host platform (linux/amd64/v4)

这说明一个常见误区:

  • 镜像能构建出来
  • 不代表当前主机就一定能原生运行它

因此多架构镜像验证时,一定要把“构建成功”和“目标平台可运行”区分开来。

十、做异构镜像交付时最值得记住的几个点

把 Day005 里这部分内容浓缩后,最值得记住的其实就是下面几条:

  • buildx 是多架构构建的核心入口
  • 新构建器和 binfmt 通常都要提前准备
  • 目标平台要在构建器能力范围内
  • 复制二进制文件时必须确认架构兼容
  • 推送仓库前,镜像标签要写成完整目标仓库地址

掌握这套思路后,你就不只是“会推镜像”,而是开始具备跨架构镜像交付能力了。对云原生平台、边缘计算和混合硬件环境来说,这是一项越来越重要的基础能力。