• openEuler 22.03 x86架构下docker运行arm等架构的容器——筑梦之路


    为什么要这样做?

    随着国产化的普及,国家政策对信创产业的支持,尤其一些金融证券行业、政府单位等,逐渐开始走国产化信创的路线,越来越多接触到国产 CPU (arm 平台,比如华为的鲲鹏处理器)

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

    环境说明

     1. 操作系统版本: 华为openEuler 22.03 lts  x86_64

     2. docker版本:20.10.12  二进制方式安装

     3. buildx插件版本:0.9.1

    Docker二进制方式安装和buildx插件安装

    1. 二进制方式安装docker并配置

    1. # 二进制方式安装docker并配置
    2. #下载二进制离线压缩包
    3. wget https://download.docker.com/linux/static/stable/x86_64/docker-20.10.12.tgz
    4. #解压文件
    5. tar -zxvf docker-20.10.12.tgz
    6. chmod +x docker/*
    7. #将二进制文件拷贝到/usr/bin/
    8. cp docker/* /usr/bin/
    9. #注册到系统服务
    10. vim /usr/lib/systemd/system/docker.service
    11. [Unit]
    12. Description=Docker Application Container Engine
    13. Documentation=https://docs.docker.com
    14. After=network-online.target firewalld.service
    15. Wants=network-online.target
    16. [Service]
    17. Type=notify
    18. #指定docker存储目录/TRS/APP/docker/lib
    19. ExecStart=/usr/bin/dockerd --graph /APP/docker/
    20. ExecReload=/bin/kill -s HUP $MAINPID
    21. LimitNOFILE=infinity
    22. LimitNPROC=infinity
    23. LimitCORE=infinity
    24. asksMax=infinity
    25. TimeoutStartSec=0
    26. Delegate=yes
    27. KillMode=process
    28. Restart=on-failure
    29. StartLimitBurst=3
    30. StartLimitInterval=60s
    31. [Install]
    32. WantedBy=multi-user.target
    33. #重载
    34. mkdir -p /APP/docker/lib
    35. systemctl daemon-reload
    36. #启动服务并加入开机启动
    37. systemctl enable docker --now
    38. #检查
    39. systemctl status docker
    40. # 配置
    41. mkdir -p /etc/docker
    42. cat > /etc/docker/daemon.json <<EOF
    43. {
    44. "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"],
    45. "exec-opts": ["native.cgroupdriver=systemd"],
    46. "experimental": true,
    47. "log-driver": "json-file",
    48. "log-opts": {
    49. "max-size": "100m"
    50. },
    51. "storage-driver": "overlay2",
    52. "storage-opts": [
    53. "overlay2.override_kernel_check=true"
    54. ]
    55. }
    56. EOF

    2. 安装docker-buildx插件

    1. # 创建目录
    2. mkdir -p ~/.docker/cli-plugins/
    3. # 下载插件并改名
    4. wget -c https://github.com/docker/buildx/releases/download/v0.9.1/buildx-v0.9.1.linux-amd64
    5. mv buildx-v0.9.1.linux-amd64 docker-buildx
    6. chmod +x docker-buildx
    7. mv docker-buildx ~/.docker/cli-plugins/
    8. # 检查验证
    9. docker buildx version
    10. docker buildx ls

    注册可支持的架构解释器

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

    1. docker run --rm \
    2. > --privileged \
    3. > multiarch/qemu-user-static:register \
    4. > --reset

    ls  /proc/sys/fs/binfmt_misc/ 

    1. cat /proc/sys/fs/binfmt_misc/qemu-mips64el
    2. cat /proc/sys/fs/binfmt_misc/qemu-aarch64
    3. cat /proc/sys/fs/binfmt_misc/qemu-ppc64le

     启动arm架构的容器

    1. 下载qemu-aarch64-static

    GitHub - multiarch/qemu-user-static: :earth_africa: `/usr/bin/qemu-*-static`

    1. wget -c https://github.com/multiarch/qemu-user-static/releases/download/v7.2.0-1/qemu-aarch64-static
    2. # 其他架构
    3. https://github.com/multiarch/qemu-user-static/releases/download/v7.2.0-1/qemu-arm-static
    4. https://github.com/multiarch/qemu-user-static/releases/download/v7.2.0-1/qemu-mips-static
    5. https://github.com/multiarch/qemu-user-static/releases/download/v7.2.0-1/qemu-mips64-static
    6. https://github.com/multiarch/qemu-user-static/releases/download/v7.2.0-1/qemu-mipsel-static
    7. https://github.com/multiarch/qemu-user-static/releases/download/v7.2.0-1/qemu-ppc64-static
    8. https://github.com/multiarch/qemu-user-static/releases/download/v7.2.0-1/qemu-s390x-static
    9. https://github.com/multiarch/qemu-user-static/releases/download/v7.2.0-1/qemu-x86_64-static
    chmod +x qemu-aarch64-static

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

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

    简单测试

    1. # 进运行一条命令查看架构
    2. docker run -t --rm --platform arm64 -v `pwd`/qemu-aarch64-static:/usr/bin/qemu-aarch64-static alpine uname -m
    3. docker run -i --rm --platform arm64 -v `pwd`/qemu-aarch64-static:/usr/bin/qemu-aarch64-static debian:11 uname -m
    4. # 创建一个容器并开启一个终端
    5. docker run -it --rm --platform arm64 -v `pwd`/qemu-aarch64-static:/usr/bin/qemu-aarch64-static debian:11 /bin/bash

     同理,启动ppc64le架构的镜像如下:

    1. wget -c https://github.com/multiarch/qemu-user-static/releases/download/v7.2.0-1/qemu-ppc64le-static
    2. chmod +x qemu-ppc64le-static
    3. # 简单测试
    4. docker run -t \
    5. --rm \
    6. --platform ppc64le \
    7. -v $(pwd)/qemu-ppc64le-static:/usr/bin/qemu-ppc64le-static \
    8. alpine \
    9. uname -m

    以上测试了两种非x86架构的镜像,均可以正常运行,其他架构的类似,这里就不再赘述。 

    龙芯架构这里,做特别说明

    loongarch 架构的支持

    1. 注册解释器

    1. wget https://gitee.com/michael0066/qemu-loongarch64-static/blob/master/qemu-loongarch64-static
    2. chmod +x qemu-loongarch64-static
    1. # 注册
    2. echo ":qemu-loongarch64:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x02\x01:\xff\xff\xff\xff\xff\xfe\xfe\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-loongarch64-static:" > /proc/sys/fs/binfmt_misc/register
    3. # 查看
    4. ls /proc/sys/fs/binfmt_misc/ |grep loonqemu-loongarch64

    2.  简单测试

    1. docker run --rm \
    2. --platform loongarch64 -t \
    3. -v `pwd`/qemu-loongarch64-static:/usr/bin/qemu-loongarch64-static \
    4. loongsongd/debian10_loongarch64_x64:e15.0 \
    5. uname -m

    参考资料:

    x86 架构运行 其他架构镜像 - 简书

    https://hub.docker.com/r/loongsongd/debian10_loongarch64_x64

    构建arm镜像

     以构建arm64镜像为例来说明如何构建其他平台架构的镜像。

    1. 编写Dockerfile

    1. FROM centos:7.9.2009
    2. COPY ./qemu-aarch64-static /usr/bin/qemu-aarch64-static
    3. RUN yum install -y net-tools gcc gcc-c++ make vim && \
    4. yum clean all

    2. 构建镜像

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

    3. 检查验证

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

     

    另一种方式: 

    1. docker build --rm -t "arm64v8/redis_new" -<<EOF
    2. FROM multiarch/qemu-user-static:x86_64-aarch64 as qemu
    3. FROM arm64v8/redis
    4. COPY --from=qemu /usr/bin/qemu-aarch64-static /usr/bin
    5. EOF
    6. docker run --rm -t "arm64v8/redis_new" uname -m
    7. #aarch64

    这里没有使用buildx插件来构建其他架构的镜像,提供了另外一种构建其他架构镜像的思路和方法,但在云原生一般场景下构建多架构的docker镜像还是推荐使用docker buildx方式,效率更高。

  • 相关阅读:
    [量化投资-学习笔记001]Python+TDengine从零开始搭建量化分析平台-数据存储
    JavaWeb学习(4)注解案例:简单的测试框架
    GoLang接口---中
    C++函数模板
    [附源码]java毕业设计校园环境保护监督系统
    微信小程序开发引入RUM,实现小程序监控
    微信公众号消息接入(普通消息+模板消息)
    搭建自己的以图搜图系统(二):深入优化搭建生产级别的图搜系统
    [请回答C++] C++11&&auto&&右值引用&&移动语义&&完美转发
    HTML CSS JS 及上下左右键变化
  • 原文地址:https://blog.csdn.net/qq_34777982/article/details/134056598