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

这篇具有很好参考价值的文章主要介绍了x86 平台利用 qemu-user-static 实现 arm64 平台 docker 镜像的运行和构建。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

因为国产化的普及,尤其一些证券和银行行业,已经开始走信创的路线,后期也许会接触到国产 CPU (arm 平台,比如华为的鲲鹏处理器)

自己买 arm 平台的 CPU,这个成本着实吃不消,于是尝试 x86 平台运行 arm 平台的容器来降本增效

关于 docker 版本

  • docker 运行其他平台容器,需要使用 --platform 参数来指定平台
  • docker 19.03.9 及以上的版本才支持 --platform 参数
  • 默认没有开启 --platform 参数,需要手动开启,直接执行,会有下面的报错
"--platform" is only supported on a Docker daemon with experimental features enabled

查看是否开启 experimental 功能

--platform 参数需要 experimentaltrue,通过下面的命令可以验证是否开启

docker info | grep -i 'experimental'

开启 experimental 功能

修改 daemon.json 文件,增加下面的参数

"experimental": true

下面的 daemon.json 文件仅供参考

{
  "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "experimental": true,
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ]
}

修改完成后,重启 docker 来验证

systemctl restart docker
docker info | grep -i 'experimental'

查看当前环境平台

uname -m

我的平台返回下面的内容

x86_64

拉取一个 arm 平台的容器

docker pull --platform arm64 debian:11

查看镜像使用的平台

docker inspect debian:11 | grep -i 'architecture'

预期返回的结果如下

        "Architecture": "arm64",

如果不加 --platform 参数,默认拉取自己当前 CPU 平台的镜像

如果本地有相同 tag 的镜像,只是平台不同的情况下,需要注意区分 tag ,不然直接 docker pull 就会覆盖掉之前的镜像,之前的镜像 tag 会变为 <none>

运行一个 arm 平台的容器

在没有 qemu-user-static 的帮助下,单靠 --platform 参数是无法启动非本机平台的镜像的

docker run --platform arm64 -t debian:11 uname -m

返回的报错如下,是因为 CPU 平台不同

standard_init_linux.go:211: exec user process caused "exec format error"

整一个 qemu-user-static

multiarch/qemu-user-static - github

注册可支持的架构解释器

不指定 CPU 平台,使用 register 来注册可支持的架构解析器

docker run --rm \
--privileged \
multiarch/qemu-user-static:register \
--reset

执行成功后,会返回类似如下的结果来表明支持的架构解析器

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

尝试启动 arm64 镜像

下载 qemu-aarch64-static

wget https://github.com/multiarch/qemu-user-static/releases/download/v5.2.0-1/qemu-aarch64-static && \
chmod +x qemu-aarch64-static

启动容器时将 qemu-aarch64-static 带入到容器内

注意 qemu-aarch64-static 二进制文件的路径,可以自己归纳到指定的路径,只需要带入到容器内的 /usr/bin 目录下就好了

docker run -t \
--rm \
--platform arm64 \
-v $(pwd)/qemu-aarch64-static:/usr/bin/qemu-aarch64-static \
debian:11 \
uname -m

正常情况下,返回 aarch64 后容器就会被销毁了(因为加了 --rm 参数

尝试启动 ppc64le 镜像

下载 qemu-ppc64le-static

wget https://github.com/multiarch/qemu-user-static/releases/download/v5.2.0-1/qemu-ppc64le-static && \
chmod +x qemu-ppc64le-static

启动 ppc64le 平台的镜像

docker run -t \
--rm \
--platform ppc64le \
-v $(pwd)/qemu-ppc64le-static:/usr/bin/qemu-ppc64le-static \
alpine:3.17.2 \
uname -m

正常情况下,返回 ppc64le 后容器就会被销毁了(因为加了 --rm 参数

后台运行 arm64 容器

sleep 315360000 让容器在后台睡眠 100 年(因为容器能在后台运行的方法就是要有一个常驻前台的进程

docker run -d \
--rm \
--platform arm64 \
-v $(pwd)/qemu-aarch64-static:/usr/bin/qemu-aarch64-static \
--name centos_7.9_arm64 \
centos:7.9.2009 \
sleep 315360000

进入容器

docker exec -it centos_7.9_arm64 bash

在容器内执行 yum 命令,可以看到一切都是正常的,并且是 aarch64

yum install -y vim

qemu-user-static,ARM64,Docker,docker,容器,运维,arm64

build 一个 arm64 镜像

  • 准备一个 Dockerfile
  • 需要将 qemu-aarch64-static 带入到容器内的 /usr/bin 目录下才可以实现构建
  • 不然会返回 standard_init_linux.go:211: exec user process caused "no such file or directory" 这样的报错
FROM centos:7.9.2009
ADD ./qemu-aarch64-static /usr/bin/qemu-aarch64-static
RUN yum install -y net-tools gcc gcc-c++ make vim && \
    yum clean all

开始构建

docker build \
--platform arm64 \
-t centos_make:7.9_aarch64 .

构建完成后会返回两个 Successfully

qemu-user-static,ARM64,Docker,docker,容器,运维,arm64

构建完成后,可以使用下面的命令验证容器内的平台是否是 arm64

docker inspect centos_make:7.9_aarch64 | grep -i 'architecture'

qemu-user-static,ARM64,Docker,docker,容器,运维,arm64

到这里,x86 平台运行和构建其他平台镜像的学习就结束了,下面有一篇关于多架构支持的文章,有兴趣的可以看一看(我是真的看麻了,太难了吧,果然还是开发改变世界)


参考文档

容器镜像多架构支持介绍文章来源地址https://www.toymoban.com/news/detail-781807.html

到了这里,关于x86 平台利用 qemu-user-static 实现 arm64 平台 docker 镜像的运行和构建的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ubuntu22.04 x86环境上使用QEMU搭建arm虚拟机

    apt-get -y install qemu apt-get -y install bridge-utils apt-get -y install vnc4server apt-get -y install qemu-kvm apt install -y qemu-system-arm apt-get -y install libvirt0 apt-get -y install libvirt-daemon apt-get -y install libvirt-daemon-system 安装完成后检查: virsh version ls /usr/bin/|grep qemu wget http://releases.linaro.org/components/kernel/

    2024年02月07日
    浏览(90)
  • 在x86下运行的Ubuntu系统上部署QEMU用于模拟RISC-V硬件系统

    下载地址: 建议选择stable版本,arch选择riscv64-lp64d,libc选择常用的glibc。 下载后解压,然后将bin目录加入PATH环境变量中。 下载地址: 建议选择稳定版本,下载后解压,然后make --enable-virtfs 用户虚拟机和宿主机之间共享文件 Linux内核下载地址: 选择稳定的版本,下载完后解

    2024年02月13日
    浏览(58)
  • 基于x86架构的CentOS7虚拟机通过qemu安装ARM架构CentOS7虚拟机_centos7 arm 网络配置

    【原文连接】基于x86架构的CentOS7虚拟机通过qemu安装ARM架构CentOS7虚拟机_centos7 arm_redrose2100的博客-CSDN博客 试过很多版本的在win10系统直接qemu安装arm版linux都失败了,也看到了别人也说这个方式不行得用虚拟机套虚拟机才行的方式,因为我没有ubunto所以搜到大佬的centos虚拟机套

    2024年02月09日
    浏览(66)
  • x86 平台运行 arm 的方法

    参考: https://github.com/multiarch/qemu-user-static 核心是使用 binfmt_misc 设定运行 arm 的默认程序为 qemu-aarch64-static 1.先下载 arm64 即 aarch64 的运行文件 2.设置默认打开方式, 即设置 binfmt_misc 以支持 arm64 程序的运行 # --reset 会删除同名条目后重新设置 3.测试 4.不用映射qemu-*-static也可以使用

    2024年02月12日
    浏览(222)
  • x86平台SIMD编程入门(2):通用指令

    虽然128位的XMM寄存器在硬件上只是256位YMM寄存器的下半部分,但在C++中它们是不同的类型。有一些intrinsic函数可以将它们重新解释为不同的类型,如下表所示,行代表源类型,列代表目标类型。 __m128 __m128d __m128i __m256 __m256d __m256d __m128 = _mm_castps_pd _mm_castps_si128 _mm256_castps128_p

    2024年02月06日
    浏览(41)
  • x86平台SIMD编程入门(3):浮点指令

    算术类型 函数示例 备注 加 _mm_add_sd 、 _mm256_add_ps 减 _mm_sub_sd 、 _mm256_sub_ps 乘 _mm_mul_sd 、 _mm256_mul_ps 除 _mm_div_sd 、 _mm256_div_ps 平方根 _mm_sqrt_sd 、 _mm256_sqrt_ps 倒数 _mm_rcp_ss 、 _mm_rcp_ps 、 _mm256_rcp_ps 快速计算32位浮点数的近似倒数(1/x),最大相对误差小于 (1.5times 2^{-12}) 。 倒数

    2024年02月06日
    浏览(40)
  • docker在x86平台下载arm的镜像

    6、进入该arm版本的详细页面,在该页面的上方有本版本镜像的sha校验值。 7、复制该值,使用如下命令在x86平台上进行下载即可。 docker pull nginx:latest@sha256:687e0e4a235ee770533f6c25fb5791b14d7b6aa603ba4ed724abbd2ed51ee11a 8、完成下载,如图:

    2024年02月12日
    浏览(78)
  • x86平台SIMD编程入门(5):提示与技巧

    访问内存的成本非常高,一次缓存未命中可能会耗费100~300个周期。L3缓存加载需要40~50个周期,L2缓存大约需要10个周期,即使L1缓存的访问速度也明显慢于寄存器。所以要尽量保持数据结构对SIMD友好,优先选择 std::vector 、 CAtlArray 、 eastl::vector 等容器,按照顺序读取数据以提

    2024年02月06日
    浏览(45)
  • x86平台SIMD编程入门(4):整型指令

    算术类型 函数示例 加 _mm_add_epi32 、 _mm256_sub_epi16 减 _mm_sub_epi32 、 _mm256_sub_epi16 乘 _mm_mul_epi32 、 _mm_mullo_epi32 除 无 水平加/减 _mm_hadd_epi16 、 _mm256_hsub_epi32 饱和加/减 _mm_adds_epi8 、 _mm256_subs_epi16 最大/最小值 _mm_max_epu8 、 _mm256_min_epi32 绝对值 _mm_abs_epi16 、 _mm256_abs_epi32 平均值 _mm

    2024年02月06日
    浏览(39)
  • x86平台SIMD编程入门(1):SIMD基础知识

    SIMD(Single Instruction, Multiple Data)是一种并行计算技术,它通过向量寄存器存储多个数据元素,并使用单条指令同时对这些数据元素进行处理,从而提高了计算效率。SIMD已被广泛应用于需要大量数据并行计算的领域,包括图像处理、视频编码、信号处理、科学计算等。许多现代处

    2024年02月06日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包