没有arm64 cpu, 在本地amd64环境上如何制作arm64架构下可用的镜像

用 Docker Buildx 并启用 QEMU 用户态模拟。

一句话流程:

  1. 在 amd64 机器上安装 qemu-user-static 并注册 binfmt

    bash 复制代码
    sudo 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
  2. 创建并启用一个支持多平台的 buildx 构建器

    bash 复制代码
    docker buildx create --name cross-builder --driver docker-container --use
    docker buildx inspect --bootstrap
  3. 写 Dockerfile 时把基础镜像写成 多平台官方镜像 (如 python:3.11-slim),或者自己在 FROM 后加 --platform=$TARGETPLATFORM,让 buildx 自动拉对应架构的基础层。

  4. 执行跨平台构建

    bash 复制代码
    docker buildx build \
      --platform linux/arm64 \
      -t your.repo/app:arm64 \
      --push .          # 或 --load 本地加载(单平台)
      
      
      # 或者 (我本人使用的方法)
      docker build -t test1 --platform linux/arm64 .
  5. 构建完成后,可以直接运行,它就是一个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 用户态模拟即可。

相关推荐
苏三说技术14 分钟前
继PHP之后,Java也爆出了重大安全漏洞!
后端
程序猿乐锅2 小时前
【从0-1学习Python | 第七篇】Python 面向对象基础
开发语言·笔记·后端·python·学习·1024程序员节
code2cat2 小时前
Java高级篇之Hibernate:让对象映射到表,理解持久化与事务
java·后端·hibernate·1024程序员节
Younglina2 小时前
三个晚上,我和 WorkBuddy 做了个生图网站
前端·后端·ai编程
金銀銅鐵3 小时前
[Java] 用 CLI 展示 EnumSet 增减元素时的内部变化(下)
java·后端·ai编程
陈随易3 小时前
副业搞钱点子之收入查看器
前端·后端
Profile排查笔记3 小时前
浏览器指纹逆向怎么分析:从网络请求追踪到 JavaScript 采集链
前端·人工智能·后端·自动化
lazy H4 小时前
【计算机网络】第 5 篇:TCP 和 UDP 有什么区别?从 Java 后端场景理解两种传输协议
经验分享·后端·网络协议·tcp/ip·计算机网络·1024程序员节
东宇科技4 小时前
crmeb开源版本安装步骤2026-10-20
后端·php·crmeb
IT_Octopus4 小时前
Apollo 配置中心入门:一所“小学校“读懂 Portal、Meta Server、Config Service
java·后端·spring