qemu+docker的跨平台镜像构建与容器运行
构建跨平台的镜像
支持如下平台
- x86-64 (
linux/amd64
,linux/i386
) - ARM architectures (
linux/arm/v5
,linux/arm/v6
,linux/arm/v7
,linux/arm64
) - PowerPC and IBM Z (
linux/ppc64le
,linux/s390x
)
安装依赖
如果您在没有Docker Desktop的Linux上运行Docker Engine,则必须安装静态编译的QEMU二进制文件并将其注册到binfmt_misc
。这使QEMU能够执行非本机文件格式进行仿真。
# 目前发现不需要执行
docker run --privileged --rm tonistiigi/binfmt --install all
开始构建
docker build --platform linux/amd64,linux/arm64 .
使用qemu进行arm64平台镜像运行
步骤
-
使用
multiarch/qemu-user-static
进行配置跨平台运行的环境docker run --rm --privileged multiarch/qemu-user-static --reset -p yes # 输出如下 #Setting /usr/bin/qemu-alpha-static as binfmt interpreter for alpha #Setting /usr/bin/qemu-arm-static as binfmt interpreter for arm #Setting /usr/bin/qemu-armeb-static as binfmt interpreter for armeb #Setting /usr/bin/qemu-sparc-static as binfmt interpreter for sparc #Setting /usr/bin/qemu-sparc32plus-static as binfmt interpreter for sparc32plus #Setting /usr/bin/qemu-sparc64-static as binfmt interpreter for sparc64 #Setting /usr/bin/qemu-ppc-static as binfmt interpreter for ppc #Setting /usr/bin/qemu-ppc64-static as binfmt interpreter for ppc64 #Setting /usr/bin/qemu-ppc64le-static as binfmt interpreter for ppc64le #Setting /usr/bin/qemu-m68k-static as binfmt interpreter for m68k #Setting /usr/bin/qemu-mips-static as binfmt interpreter for mips #Setting /usr/bin/qemu-mipsel-static as binfmt interpreter for mipsel #Setting /usr/bin/qemu-mipsn32-static as binfmt interpreter for mipsn32 #Setting /usr/bin/qemu-mipsn32el-static as binfmt interpreter for mipsn32el #Setting /usr/bin/qemu-mips64-static as binfmt interpreter for mips64 #Setting /usr/bin/qemu-mips64el-static as binfmt interpreter for mips64el #Setting /usr/bin/qemu-sh4-static as binfmt interpreter for sh4 #Setting /usr/bin/qemu-sh4eb-static as binfmt interpreter for sh4eb #Setting /usr/bin/qemu-s390x-static as binfmt interpreter for s390x #Setting /usr/bin/qemu-aarch64-static as binfmt interpreter for aarch64 #Setting /usr/bin/qemu-aarch64_be-static as binfmt interpreter for aarch64_be #Setting /usr/bin/qemu-hppa-static as binfmt interpreter for hppa #Setting /usr/bin/qemu-riscv32-static as binfmt interpreter for riscv32 #Setting /usr/bin/qemu-riscv64-static as binfmt interpreter for riscv64 #Setting /usr/bin/qemu-xtensa-static as binfmt interpreter for xtensa #Setting /usr/bin/qemu-xtensaeb-static as binfmt interpreter for xtensaeb #Setting /usr/bin/qemu-microblaze-static as binfmt interpreter for microblaze #Setting /usr/bin/qemu-microblazeel-static as binfmt interpreter for microblazeel #Setting /usr/bin/qemu-or1k-static as binfmt interpreter for or1k #Setting /usr/bin/qemu-hexagon-static as binfmt interpreter for hexagon
此时会拉取
multiarch/qemu-user-static
镜像,随后运行容器镜像操作,容器在运行结束后会自行销毁 -
创建我们需要运行的镜像,有两种方式:
-
运行通用平台镜像,指定目标平台(推荐使用这种方式),会自动根据指定平台下载对应平台的镜像
docker run --rm \ --platform arm64 \ -v /usr/bin/qemu-aarch64-static:/usr/bin/qemu-aarch64-static \ ubuntu:focal uname -m # 相当于拉取了arm64/ubuntu:focal # 输出 #aarch64
-
直接运行目标平台的镜像
docker run --rm -t arm64v8/ubuntu --platform arm64 uname -m # 输出。可能会有警告,但是结果应该一致,我省略了警告 #aarch64
-