没有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 用户态模拟即可。

相关推荐
nnerddboy40 分钟前
Rust教程04:引用、借用与切片
开发语言·后端·rust
Rain的Java大神之路1 小时前
线上接口负载满了如何解决
java·数据库·redis·后端·缓存·面试·架构
weixin_431600442 小时前
NestJS 入门(7):生命周期钩子——构造函数和 `OnModuleInit` 差在哪?
前端·后端·学习·node.js·nest.js
小强库计算机毕业设计2 小时前
基于 Spring Boot + Vue3 的校园管理系统
java·spring boot·后端·项目实战·管理系统·技术分享·校园管理系统实战
canonical_entropy3 小时前
关于《Mission Driver:Loop Engineering 的一种通用参考实现》的补充说明
后端·agent·ai编程
__zRainy__3 小时前
Node系列 · Node基础:Node.js 概述
后端·node.js
星火10243 小时前
【LangChain4j系列06】ChatMemory 对话记忆管理
人工智能·后端
netCode3 小时前
Git一文带你理解如何使用
后端
睡觉时不困4424 小时前
12.LangChain 1.0+ 第二篇:Prompt、结构化输出与 LCEL 组件组合.发布清单
后端
SomeB1oody4 小时前
【RustyML入门】2.13. 孤立森林
开发语言·后端·机器学习·rust·教程