本文主要介绍如何在x86机器上模拟arm架构指令来构建arm架构的镜像。
问题
通常,我们在x86架构的主机上制作x86架构的Docker镜像,在arm架构主机上制作arm架构的Docker镜像。这样会存在一个问题,非常浪费资源,如果需要制作什么架构的Docker镜像,就需要什么架构的主机。那么可以在最流行的x86架构主机上制作其它架构的Docker镜像吗?答案是肯定的,下面将详细描述在x86架构主机上制作arm架构Docker镜像的详细方案。
实现思想
因为x86架构的主机上无法执行arm架构上的指令,所以需要一个模拟仿真软件能把arm架构上的指令解释为x86架构主机上能够执行的指令。这里选择了multiarch/qemu-user-static工具来实现在x86主机上模拟arm环境。
制作arm架构Docker镜像
这里为了更加形象和具体的阐述制作arm架构Docker镜像的过程,就是基于centos的jdk镜像为例讲述。
首先,需要在x86架构主机上执行如下命令,开启x86架构环境上仿真arm架构环境。
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
其次,下载arm架构版的oracle jdk或者openjdk,在参考链接章节可以找到下载地址。
再次,编写Dockerfile内容,如下
FROM centos:centos7.9.2009@sha256:864a7acea4a5e8fa7a4d83720fbcbadbe38b183f46f3600e04a3f8c1d961ed87
# add jdk
ADD jdk-8u371-linux-aarch64.tar.gz /usr/local/
ENV JAVA_HOME /usr/local/jdk1.8.0_371
ENV PATH ${PATH}:${JAVA_HOME}/bin
这里需要注意的是dockerhub上centos的官方镜像已经下架了arm架构的镜像。
然后,执行镜像构建命令
docker build localhost/arm64v8-jdk:8u371 .
这里需要注意的是jdk-8u371-linux-aarch64.tar.gz文件需要和Dockerfile文件同目录。
最后,验证是否arm架构镜像制作是否成功。
# 进入容器里面
docker run -it localhost/arm64v8-jdk:8u371 /bin/bash
# 查看架构
uname -m
# 查看是否有javac命令
javac
# 查看是否有java命令
java