用 Docker Buildx 并启用 QEMU 用户态模拟。
一句话流程:
-
在 amd64 机器上安装
qemu-user-static
并注册 binfmtbashsudo apt install -y qemu qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager usermod -aG libvirt,kvm root sudo apt install -y qemu-user-static binfmt-support docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
-
创建并启用一个支持多平台的 buildx 构建器
bashdocker buildx create --name cross-builder --driver docker-container --use docker buildx inspect --bootstrap
-
写 Dockerfile 时把基础镜像写成 多平台官方镜像 (如
python:3.11-slim
),或者自己在FROM
后加--platform=$TARGETPLATFORM
,让 buildx 自动拉对应架构的基础层。 -
执行跨平台构建
bashdocker buildx build \ --platform linux/arm64 \ -t your.repo/app:arm64 \ --push . # 或 --load 本地加载(单平台) # 或者 (我本人使用的方法) docker build -t test1 --platform linux/arm64 .
-
构建完成后,可以直接运行,它就是一个arm64镜像
bash
root@76:~# uname -m
x86_64
root@76:~# docker run -it test1:latest uname -m
WARNING: The requested image's platform (linux/arm64) does not match the detected host platform (linux/amd64/v2) and no specific platform was requested
aarch64
尽管有一个warning信息,但是在最后你可以看到一个表示cpu构架是arm64的 aarch64信息
关键点
- 不是"amd64 的 Docker"本身能编译出 arm64,而是 buildx + QEMU 把 arm64 指令集翻译成 amd64 指令,交叉编译/交叉打包完成。
- 如果 Dockerfile 里包含
RUN go build
、npm install
等编译步骤,只要基础镜像提供的是跨平台工具链(Go、Node、Rust 等都支持),就能直接编译出 arm64 二进制;否则需要显式安装交叉工具链。 - 性能比原生慢 5--10 倍,但只做打包 CI 完全够用;生产镜像建议 push 到仓库后,在 arm64 机器上再跑测试。
结论:
amd64 主机完全可以构建出 arm64 原生镜像, 并且也可以运行,只要用 Docker Buildx 并提前装好 QEMU 用户态模拟即可。