国产化arm架构镜像构建及部署注意事项
前言
由于目前大环境要求, 公司开始逐步使用国产化aarch64机器代替amd64的机器,之前部署在k8s的镜像需要迁移到arm机器,所有的镜像都需要重新构建。由于很多小伙伴第一次接触arm机器,所以在构建镜像的时候会踩很多坑,并且由于不熟悉新架构,导致镜像无法运行,问题无法解决,故出一个教程供各位参考,如果觉得帮助到你了,就点个赞吧
1.基础环境搭建
- 说明:很多开发者在构建基础镜像的时候直接就在amd架构的机器下进行构建了,然后推送到国产机器运行,会发现docker镜像无法启动,操作系统抛出异常:
exec format error
。出现这个情况的原因根本就是两个架构的操作系统不兼容,导致这个问题的直接原因则可能是以下两点:- 直接将amd架构的镜像推送到arm机器
- 下载了开源的arm镜像,在amd系统下以该镜像作为基础镜像,build新镜像并使用RUN指令执行操作
- 如果能够下载开源的arm镜像,并且满足你的需求的话,可以直接使用开源的镜像,并且amd系统只load导入arm镜像并推送是不会影响镜像的
- 但是需要定制化基础镜像的,需要安装arm操作系统。如果需要windows本地安装arm操作系统的,可以参考我的上一篇博文:
windows安装arm架构虚拟机(国产麒麟系统)
2.构建基础镜像
这里我们以常用的jdk和tomcat镜像为例
2.1 tomcat
tomcat比较简单,dockerhub已经有支持arm架构的公共镜像
注意:在拉取镜像时,docker会直接拉取与执行命令操作系统相同架构的镜像,如果这个镜像支持多个操作系统,拉取的镜像是会随着你的操作系统变的
所以arm操作系统的小伙伴可以直接直接执行docker pull tomcat:tag
。
其他操作系统的就麻烦一点了,我们需要根据镜像的摘要来执行拉取命令:
- 点击上面的tomcat镜像,选择tag
找到你需要的版本, 点击arm对应的digest
进入新页面后复制digest
- 执行pull命令
docker pull node@[你复制的digest]
,例如:docker pull node@sha256:a067d270ccbe4a5bc51077b703c8891083d0466059a0d2a7041a5fd73125bae1
- 如果有的小伙伴因为网络问题无法访问或下载,可以直接用我下载的镜像
链接:https://pan.baidu.com/s/1VFZvryL2fy58L-e_LwlRMQ?pwd=inua
提取码:inua
2.2 jdk1.8
-
jdk1.8目前没有arm架构的公共镜像,你可以使用上面的tomcat镜像,其中已经包括了jdk1.8
-
如果你只想要一个纯净的jdk环境,就需要自己构建镜像了,当然需要在arm系统下构建
-
下载jdk1.8-arm安装包,下载链接: https://www.oracle.com/java/technologies/downloads/
-
上传文件到操作系统,在该文件同级目录下创建Dockerfile文件
FROM centos:centos7 MAINTAINER darlight RUN mkdir /usr/local/jdk WORKDIR /usr/local/jdk ADD jdk-8u401-linux-aarch64.tar.gz /usr/local/jdk ENV JAVA_HOME /usr/local/jdk/jdk1.8.0_401 ENV JRE_HOME /usr/local/jdk/jdk1.8.0_401/jre ENV PATH $JAVA_HOME/bin:$PATH
-
执行命令
docker build -t jdk-8u401-arrch64:1.0 .
-
-
如果你本地无法安装arm环境可以直接下载我构建好的镜像
链接:https://pan.baidu.com/s/1dlXMhJqUYmZaO1rMSn38PQ?pwd=tsos
提取码:tsos -
注意:以上直接下载的镜像tar文件,在导入的时候使用docker load命令
3.部署注意事项
- 构建基础镜像的时候注意,不同操作系统间使用docker build如果使用到了RUN操作执行操作系统命令会导致镜像架构错误,无法启动。但ADD,COPY等命令不影响
- 在编写Dockerfile时,如果执行CMD或者ENTRYPOINT等命令时,命令前要加上
bash -c
- 如果你需要向镜像中添加可执行脚本,例如启动服务的start.sh,那么在Dockerfile中一定要给该文件赋权