前言

由于目前大环境要求, 公司开始逐步使用国产化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中一定要给该文件赋权
    在这里插入图片描述
Logo

一起探索未来云端世界的核心,云原生技术专区带您领略创新、高效和可扩展的云计算解决方案,引领您在数字化时代的成功之路。

更多推荐