一、为什么要关注异构和 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/arm64、linux/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通常都要提前准备 - 目标平台要在构建器能力范围内
- 复制二进制文件时必须确认架构兼容
- 推送仓库前,镜像标签要写成完整目标仓库地址
掌握这套思路后,你就不只是“会推镜像”,而是开始具备跨架构镜像交付能力了。对云原生平台、边缘计算和混合硬件环境来说,这是一项越来越重要的基础能力。