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

打印 上一主题 下一主题

主题 515|帖子 515|积分 1545

为什么要这样做?

   随着国产化的遍及,国家政策对信创产业的支持,尤其一些金融证券行业、政府单位等,逐渐开始走国产化信创的门路,越来越多打仗到国产 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.   
  17. [Service]
  18. Type=notify
  19. #指定docker存储目录/TRS/APP/docker/lib
  20. ExecStart=/usr/bin/dockerd --graph /APP/docker/
  21. ExecReload=/bin/kill -s HUP $MAINPID
  22. LimitNOFILE=infinity
  23. LimitNPROC=infinity
  24. LimitCORE=infinity
  25. asksMax=infinity
  26. TimeoutStartSec=0
  27. Delegate=yes
  28. KillMode=process
  29. Restart=on-failure
  30. StartLimitBurst=3
  31. StartLimitInterval=60s
  32.   
  33. [Install]
  34. WantedBy=multi-user.target
  35.   
  36. #重载
  37. mkdir -p /APP/docker/lib
  38. systemctl daemon-reload
  39. #启动服务并加入开机启动
  40. systemctl enable docker --now
  41. #检查
  42. systemctl status docker
  43. # 配置
  44. mkdir -p /etc/docker
  45. cat > /etc/docker/daemon.json <<EOF
  46. {
  47.   "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"],
  48.   "exec-opts": ["native.cgroupdriver=systemd"],
  49.   "experimental": true,
  50.   "log-driver": "json-file",
  51.   "log-opts": {
  52.     "max-size": "100m"
  53.   },
  54.   "storage-driver": "overlay2",
  55.   "storage-opts": [
  56.     "overlay2.override_kernel_check=true"
  57.   ]
  58. }
  59. 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
复制代码

  1. 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
复制代码
  1. 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. 检查验证

  1. 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方式,效率更高。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

农妇山泉一亩田

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表