没有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 buildnpm install 等编译步骤,只要基础镜像提供的是跨平台工具链(Go、Node、Rust 等都支持),就能直接编译出 arm64 二进制;否则需要显式安装交叉工具链。
  • 性能比原生慢 5--10 倍,但只做打包 CI 完全够用;生产镜像建议 push 到仓库后,在 arm64 机器上再跑测试。

结论:
amd64 主机完全可以构建出 arm64 原生镜像, 并且也可以运行,只要用 Docker Buildx 并提前装好 QEMU 用户态模拟即可。

相关推荐
J_liaty8 小时前
Redis公共方法详解
spring boot·redis·后端
小北方城市网8 小时前
生产级 Spring Boot + MyBatis 核心配置模板
java·spring boot·redis·后端·spring·性能优化·mybatis
a努力。9 小时前
蚂蚁Java面试被问:流批一体架构的实现和状态管理
java·后端·websocket·spring·面试·职场和发展·架构
计算机学姐9 小时前
基于SpringBoot的在线骑行网站系统
java·vue.js·spring boot·后端·mysql·spring·tomcat
BlockChain8889 小时前
Spring框架终极入门指南(12000字深度解析)
java·后端·python·spring
学嵌入式的小杨同学9 小时前
【嵌入式 C 语言实战】栈、队列、二叉树核心解析:存储原理 + 应用场景 + 实现思路
linux·c语言·网络·数据结构·数据库·后端·spring
❀͜͡傀儡师10 小时前
SpringBoot与Artemis整合,实现航空行李追踪消息中枢系统
java·spring boot·后端
qq_2562470510 小时前
AG-UI:让 AI 走出聊天框的“界面革命”
后端
麦兜*10 小时前
SpringBoot Actuator监控端点详解,打造生产级应用健康检查
java·spring boot·后端
无限进步_10 小时前
二叉搜索树(BST)详解:从原理到实现
开发语言·数据结构·c++·ide·后端·github·visual studio