如果你现在工作在一个arm 架构的服务器,生成一个该架构下的docker镜像是比较顺其自然的事情,可是这里经常会有个矛盾,我们日常的工作平台,比如桌面电脑或服务器需要比较强的性能,通常采用x86架构,把生成的docker镜像跑在一些不需要很强性能的arm服务器上,长期提供一些服务,x86工作平台默认只能运行该架构下的基础镜像,无法直接运行arm架构组件。
实现在x86平台运行arm程序的基本思路是利用模拟器,涉及的原理和过程比较复杂,本人没有相关的深厚理论基础,无法讲深讲透,只分享一下怎么在操作上实现。
1、安装qemu-arm运行环境
QEMU是一个处理器模拟软件,可以用来在一个平台中模拟其他操作系统架构,如在PC中实现ARM、MIPS等多种架构的软硬件运行环境。QEMU主要有两种模拟模式:
System模式中,它可以在一个主机环境中虚拟不同的虚拟计算机系统,比如可以在Ubuntu系统中虚拟出一个MIPS架构的Debian系统。
User模式中,它可以运行一个为其他处理器编写的应用程序,比如可以在X64-Ubuntu系统中直接运行一个MIPS-Linux的应用程序。
1.1 所以,我们需要安装一个可以模拟arm平台的系统环境,使用ubuntu的基础系统,可以非常方便地实现一条命令完成相关功能的安装,不需要以前采用原码编译等。
apt-get install qemu-user-static
这条命令安装了一个用户模式的arm模拟器,可以通过qemu-arm等命令方式运行arm指令。
1.2 在linux内核启用binfmt模式,让linux直接识别arm指令并调用arm模拟器来运行该指令。
qemu的基本原理是将arm 指令翻译成x86命令,再由宿主系统,如linux来执行翻译出来的指令,最终成功运行arm。这个过程本来没有什么问题,就是每次运行arm指令需要通过明确指定通过qemu-arm来运行,麻烦一些。其实linux内核有binfmt模式,通过该模式,在系统内核注册arm指令,这样系统遇到arm指令能识别并自动调用qemu-arm来运行它。
apt-get install binfmt-support
2、运行一个arm架构基础容器
这样做的意图是通过这个基础容器,直接建立一个较为纯粹的arm工作环境,不用考虑各种arm架构的库和依赖,避免直接在宿主机执行docker构建的各种操作,减少因依赖等问题导致的失败。
docker pull docker.io/arm64v8/ubuntu:20.04
docker images
docker run -it e784f03641c9
通过以上命令,我们就在x86的ubuntu系统上运行了一个arm内核架构的dcoker容器。
3、将配置好的arm架构docker 容器导出为arm架构容器
进入创建好的ubuntu容器,直接在其中安装必要的功能,其中所有的安装都将基于其arm架构,可以保证容器中是一个干净的arm环境。
docker exec -it xxxxxxx bash
将搭建好的容器导出为arm架构docker镜像
docker export -o test.tar a7db52903c32
这样将得到一个.tar的arm架构docker 镜像文件,将该文件传递到其它arm平台,导入系统将正常运行。