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…
一个回应
实战:
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:~$