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

相关推荐
952365 小时前
MyBatis
后端·spring·mybatis
uzong8 小时前
9 种 RAG 架构,每位 AI 开发者必学:完整实战指南
后端
小江的记录本8 小时前
【Kafka核心】架构模型:Producer、Broker、Consumer、Consumer Group、Topic、Partition、Replica
java·数据库·分布式·后端·搜索引擎·架构·kafka
止语Lab8 小时前
从手动到框架:Go DI 演进的三个拐点
开发语言·后端·golang
Daybreak11 小时前
Elasticsearch 里的索引和 Mapping,到底是什么关系?
后端
Lee川11 小时前
Prisma 实战指南:像搭积木一样设计古诗词数据库
前端·数据库·后端
李小狼lee11 小时前
深入浅出sse协议,用代码自己实现
后端
SamDeepThinking12 小时前
并发量就算只有2,该上锁还得上呀
java·后端·架构