Docker与QEMU协同实现跨架构构建

QEMU是什么?

QEMU 是一款开源的跨架构模拟器 / 虚拟化工具,核心功能是「模拟非当前主机的 CPU 架构」(比如在 x86_64 架构的服务器上,模拟 arm64 架构的 CPU 指令集)。

Docker 与 QEMU 的协同关系(如何实现跨架构构建)

Docker 本身(包括 buildx 插件)没有跨架构指令模拟的能力,它的 buildx 插件只是提供了「跨架构镜像构建的调度能力」,而真正实现「指令集兼容」的是 QEMU,二者分工明确:
QEMU 负责「底层指令模拟」:安装后,会在主机系统中注册「二进制格式处理程序」(就是你之前看到的 /proc/sys/fs/binfmt_misc/ 目录下的 qemu 相关文件),当系统遇到非本机架构的二进制文件(比如 arm64 架构的程序)时,会自动调用 QEMU 进行指令翻译;
Docker buildx 负责「上层构建调度」:识别 --platform linux/arm64 等参数,借助 QEMU 提供的跨架构模拟能力,将镜像构建过程中的所有指令,都通过 QEMU 翻译为当前主机能执行的指令,最终生成对应架构的镜像;
协同流程:docker buildx build --platform linux/arm64 → buildx 调用系统二进制格式处理程序 → 发现是 arm64 架构 → 调用 QEMU 翻译指令 → 执行构建步骤 → 生成 arm64 镜像。

1.安装 QEMU(支持跨架构构建,识别linux/arm64

解决/proc/sys/fs/binfmt_misc/qemu-aarch64不存在的问题,执行以下命令一键安装:
# 特权模式运行QEMU镜像,安装跨架构支持(一次性配置,重启后仍有效)
docker run --rm --privileged tonistiigi/binfmt:latest --install all

2.验证 QEMU 跨架构支持是否生效

# 查看是否生成qemu相关配置文件
ls /proc/sys/fs/binfmt_misc/ | grep qemu

# 验证arm64架构是否被支持
cat /proc/sys/fs/binfmt_misc/qemu-aarch64

3.初始化buildx构建器(启用跨架构构建功能)

# 1. 创建并使用自定义构建器(命名为mybuilder)
docker buildx create --name mybuilder --use

# 2. 引导构建器(加载配置,完成初始化)
docker buildx inspect mybuilder --bootstrap

# 3. 再次验证构建器状态(确认支持多架构)
docker buildx ls

done…

类别:

一个回应

  1. Lidaye说道:

    实战:
    ubuntu@VM-0-12-ubuntu:~$ docker run –rm –privileged tonistiigi/binfmt:latest –install all
    Unable to find image ‘tonistiigi/binfmt:latest’ locally
    latest: Pulling from tonistiigi/binfmt
    f4700b809f99: Pull complete
    2adec5d296ac: Pull complete
    Digest: sha256:30cc9a4d03765acac9be2ed0afc23af1ad018aed2c28ea4be8c2eb9afe03fbd1
    Status: Downloaded newer image for tonistiigi/binfmt:latest
    installing: arm64 OK
    installing: ppc64le OK
    installing: loong64 OK
    installing: mips64le OK
    installing: mips64 OK
    installing: arm OK
    installing: s390x OK
    installing: riscv64 OK
    {
    “supported”: [
    “linux/amd64”,
    “linux/amd64/v2”,
    “linux/amd64/v3”,
    “linux/arm64”,
    “linux/riscv64”,
    “linux/ppc64le”,
    “linux/s390x”,
    “linux/386”,
    “linux/mips64le”,
    “linux/mips64”,
    “linux/loong64”,
    “linux/arm/v7”,
    “linux/arm/v6”
    ],
    “emulators”: [
    “python3.10”,
    “qemu-aarch64”,
    “qemu-arm”,
    “qemu-loongarch64”,
    “qemu-mips64”,
    “qemu-mips64el”,
    “qemu-ppc64le”,
    “qemu-riscv64”,
    “qemu-s390x”
    ]
    }
    ubuntu@VM-0-12-ubuntu:~$ ls /proc/sys/fs/binfmt_misc/ | grep qemu
    qemu-aarch64
    qemu-arm
    qemu-loongarch64
    qemu-mips64
    qemu-mips64el
    qemu-ppc64le
    qemu-riscv64
    qemu-s390x
    ubuntu@VM-0-12-ubuntu:~$ cat /proc/sys/fs/binfmt_misc/qemu-aarch64
    enabled
    interpreter /usr/bin/qemu-aarch64
    flags: POCF
    offset 0
    magic 7f454c460201010000000000000000000200b700
    mask ffffffffffffff00fffffffffffffffffeffffff
    ubuntu@VM-0-12-ubuntu:~$ docker buildx create –name mybuilder –use
    mybuilder
    ubuntu@VM-0-12-ubuntu:~$ docker buildx inspect mybuilder –bootstrap
    [+] Building 4.2s (1/1) FINISHED
    => [internal] booting buildkit 4.2s
    => => pulling image moby/buildkit:buildx-stable-1 3.6s
    => => creating container buildx_buildkit_mybuilder0 0.6s
    Name: mybuilder
    Driver: docker-container
    Last Activity: 2026-01-19 07:21:00 +0000 UTC

    Nodes:
    Name: mybuilder0
    Endpoint: unix:///var/run/docker.sock
    Status: running
    Buildkit: v0.26.3
    Platforms: linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/mips64le, linux/mips64, linux/loong64, linux/arm/v7, linux/arm/v6
    Labels:
    org.mobyproject.buildkit.worker.executor: oci
    org.mobyproject.buildkit.worker.hostname: a7ce0e09f7ce
    org.mobyproject.buildkit.worker.network: host
    org.mobyproject.buildkit.worker.oci.process-mode: sandbox
    org.mobyproject.buildkit.worker.selinux.enabled: false
    org.mobyproject.buildkit.worker.snapshotter: overlayfs
    GC Policy rule#0:
    All: false
    Filters: type==source.local,type==exec.cachemount,type==source.git.checkout
    Keep Duration: 48h0m0s
    GC Policy rule#1:
    All: false
    Keep Duration: 1440h0m0s
    Keep Bytes: 9.313GiB
    GC Policy rule#2:
    All: false
    Keep Bytes: 9.313GiB
    GC Policy rule#3:
    All: true
    Keep Bytes: 9.313GiB
    ubuntu@VM-0-12-ubuntu:~$ docker buildx ls
    NAME/NODE DRIVER/ENDPOINT STATUS BUILDKIT PLATFORMS
    mybuilder * docker-container
    mybuilder0 unix:///var/run/docker.sock running v0.26.3 linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/mips64le, linux/mips64, linux/loong64, linux/arm/v7, linux/arm/v6
    default docker
    default default running v0.22.0 linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/386, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/mips64le, linux/mips64, linux/loong64, linux/arm/v7, linux/arm/v6
    ubuntu@VM-0-12-ubuntu:~$

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注