[用友技术中台]使用x86服务器编译ARM容器镜像的解决方案
前言
在用友技术中台的国产化服务器适配工作中,经常会碰到这种情况,我们需要在ARM架构的硬件环境下编译和运行容器应用,但是由于项目进度等制约因素,ARM架构的服务器还在采购中,俗话说”巧妇难为无米之炊”,在没有ARM服务器的情况下,我们寻找出了一套解决方案,让传统x86服务器可以编译和运行ARM架构的容器镜像,为用友技术中台的软件交付周期可以提前,提高整体CI/CD的生命周期。
一、 环境需求和准备阶段
1)什么是qemu
qemu是一个开源项目,使用者可以通过qemu完成跨平台的仿真模拟,类似vm虚拟化,qemu虚拟机是一个用户空间的进程,是一种软件虚拟化的实现。qemu有user和system两种模式,在用user模式下,qemu可以将其他体系结构的二进制代码作为主机的进程,同时也可以将任何模拟系统调用转换为主机系统的调用。
2)在docker环境中运行qemu-user-static
首先检查系统环境确保linux内核版本在4.0以上,并在x86的服务器上安装docker程序。
然后在docker中的特权模式下运行qemu-user-static容器,命令如下:
docker run --rm --privileged multiarch/qemu-user-static --reset --persistent yes
二、 编译ARM容器镜像
编写ARM架构的dockerfile,例如编译arm架构的nginx容器镜像。
FROM arm64v8/alpine:3.9 ENV.UTF-8 \ LANGUAGE=en_US.UTF-8 \ LC_CTYPE=en_US.UTF-8 \ LC_ALL=en_US.UTF-8 \ TZ="Asia/Shanghai" \ BASE_IMAGE=alpine:3.9-arm64v8 RUN set -x \ && sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/' /etc/apk/repositories \ && echo 'http://mirrors.aliyun.com/alpine/edge/testing' >> /etc/apk/repositories \ && apk update \ && addgroup -g 101 -S nginx \ && adduser -S -D -H -u 101 -h /var/cache/nginx -s /sbin/nologin -G nginx -g nginx nginx \ && apk add --no-cache --allow-untrusted \ wget vim curl binutils\ openssh-client git less \ bash bash-doc bash-completion \ htop iftop \ tmux fish mdocml-apropos \ busybox-extras \ coreutils \ ca-certificates \ tzdata \ libtool \ apk-tools \ netcat-openbsd \ bind-tools \ nginx \ && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ && echo "Asia/Shanghai" > /etc/timezone \ && chown -R nginx:nginx /var/lib/nginx \ && mkdir /run/nginx \ && /bin/rm -rf /tmp/* /var/cache/apk/* EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]
执行编译命令
docker build -t iuap/arm64v8-nginx:v1.1 .
运行编译完成的arm架构的容器镜像
docker run -d -P iuap/arm64v8-nginx:v1.1
使用exec命令进入该容器,可以看到改容器是ARM架构的
三、 结束语
虽然使用qemu来虚拟ARM环境性能会有所损耗,但是可以在项目项目开始之前就开始ARM应用的集成构建工作,比等待ARM硬件资源就绪再开展工作要快的多,同时再配合用友技术中台的DevOps流水线,加快企业软件的交付周期。
现在ARM版本的容器镜像已经加入用友开发者中心的基础镜像仓库中,方便ARM环境下的构建工作。
同时用友技术中台也将容器云中的ARM版本的组件开源出来,方便大家下载和使用。
- 点赞
- 收藏
- 关注作者
评论(0)