本文主要介紹如何在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