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平台镜像运行

步骤

  1. 使用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​镜像,随后运行容器镜像操作,容器在运行结束后会自行销毁

  2. 创建我们需要运行的镜像,有两种方式:

    • 运行通用平台镜像,指定目标平台(推荐使用这种方式),会自动根据指定平台下载对应平台的镜像

      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
      

参考资料

官方文档:Multi-platform images

x86 平台利用 qemu-user-static 实现 arm64 平台 docker 镜像的运行和构建