aarch64 部署实战:从 JDK、MySQL 到 Docker 的 ARM 架构迁移避坑指南
简介这份资源面向需要在ARM架构aarch64操作系统上部署Java项目的运维与开发人员尤其适用于政府内网等无法使用yum在线安装的封闭环境。作者将实际部署中所需的各类离线安装包与自写教程整合成包涵盖C标准库、MySQL、Java、Redis以及地理信息系统所用的GeoServer并附上资源整合说明、各组件安装步骤和一个可检索aarch64所需rpm的地址帮助读者绕开网络限制完成环境搭建。压缩包为rar格式共828个文件约697.3MB其中以292个jar、214个xml、72个png及shp、dbf、prj等GIS数据文件为主另有sh脚本、properties配置、gz压缩包与少量rpm覆盖应用依赖、地图服务与部署脚本等用途。目前已有1717人学习下载适合作为内网ARM服务器部署的离线参考能直接获取可用的安装包、配置样例与排错思路。1. aarch64 部署这件事为什么 x86 上跑得好好的换到 ARM 就翻车同一个 Spring Boot 项目在 x86 服务器上docker compose up一把过换到一台鲲鹏或者飞腾的 aarch64 机器上镜像拉下来直接exec format error离线环境里apt install nginx卡在源不可达MySQL 5.7 的官方镜像根本没有 arm64 标签。这不是玄学是架构差异在部署链路上被逐层放大的结果。aarch64 操作系统项目部署资源整合说的就是把「CPU 架构 → 操作系统 → 运行时 → 中间件 → 应用」这条链上每一环的 ARM 版本找齐、装对、跑通。适合手里有 ARM 服务器、开发板或国产化环境需要把已有项目迁过去或从零搭一套的工程师。下面按我实际踩过的顺序把选型、命令、参数和坑一次讲清。2. 先搞清楚你的 aarch64 环境到底长什么样2.1 三条命令确认架构、系统与内核很多人拿到机器第一件事就是装软件结果装到一半发现是 32 位用户态跑在 64 位内核上。先花两分钟确认清楚后面能省两小时。uname -m # 期望输出 aarch64如果是 armv7l 说明是 32 位用户态 uname -r # 内核版本决定能装哪些驱动和容器特性 cat /etc/os-release # 发行版与版本号决定包管理器和软件源 getconf LONG_BIT # 期望 64输出 32 说明用户态是 32 位 dpkg --print-architecture # Debian/Ubuntu 系看包架构期望 arm64uname -m返回aarch64只代表内核是 64 位getconf LONG_BIT才反映用户态位宽。两者不一致时你下载的 arm64 包会装不上报的错还特别隐晦。/etc/os-release里的VERSION_ID要和后面软件源里的发行版代号对上比如 Ubuntu 22.04 对应jammy麒麟 V10 对应它自己的源不能混用。2.2 发行版选型服务器、开发板、国产化环境各选什么选型不是看哪个新是看你的软件生态在哪边最全。下面这张表是我在几类场景下的实际取舍。场景推荐系统理由注意云上 ARM 服务器Ubuntu 22.04/24.04 arm64软件源最全Docker 官方支持好别用最小化镜像缺基础库国产化信创麒麟 V10 / 统信 UOS arm64合规要求驱动适配完整源要配内网镜像公网源常不通开发板验证Debian arm64包管理干净社区文档多内核可能较老注意容器特性纯内网离线任意 LTS 本地源稳定优先别追新提前把依赖树拉全国产麒麟系统上装 Node 18 及以上是个典型痛点系统自带源里的 Node 版本往往停在 12 或 14。常见做法是去 Node 官方下载node-v18.x.x-linux-arm64.tar.xz解压后软链到/usr/local/bin而不是硬去改系统源。这样不污染系统包管理升级也干净。2.3 离线环境的软件源与依赖预拉取纯内网 aarch64 装 nginx最容易翻车的地方是apt update直接超时。正确姿势是在一台能联网的同架构机器上把 deb 包和依赖全下下来。# 在联网的同架构机器上下载 nginx 及其全部依赖到本地目录 apt-get install -y --download-only --reinstall nginx mkdir -p /tmp/offline-debs cp /var/cache/apt/archives/*.deb /tmp/offline-debs/ # 打包带走拷到内网机器 tar czf nginx-offline-arm64.tar.gz -C /tmp offline-debs # 内网机器上安装 tar xzf nginx-offline-arm64.tar.gz dpkg -i offline-debs/*.deb || apt-get install -f -y--download-only只下载不安装--reinstall保证已装的包也会重新拉一份避免漏依赖。dpkg -i失败时用apt-get install -f补依赖但前提是本地源里得有这些依赖包。所以更稳的做法是提前用apt-rdepends nginx把依赖树列全一次性下完。这一步偷懒后面就会在内网机器上反复来回拷包血泪经验。3. 运行时与中间件的 aarch64 落地JDK、Node、MySQL、Docker3.1 JDK 与 Node 的 arm64 安装与版本对齐JDK 11 在 aarch64 上首选发行版自带的 OpenJDK或者用 Eclipse Temurin 的 arm64 包。别去下 Oracle 的 x86 包装完java -version能跑但一加载 native 库就崩。# Ubuntu/Debian arm64 安装 JDK 11 apt-get install -y openjdk-11-jdk java -version # 确认输出里带 aarch64 或 arm64 字样 # 手动安装 Temurin arm64离线场景 tar xzf OpenJDK11U-jdk_aarch64_linux_hotspot_11.0.x.tar.gz -C /opt echo export JAVA_HOME/opt/jdk-11.0.x /etc/profile echo export PATH$JAVA_HOME/bin:$PATH /etc/profile source /etc/profileJAVA_HOME一定要指向解压后的真实目录别指向软链某些构建工具解析软链会出问题。Node 同理node -p process.arch必须返回arm64返回x64说明你装错了包后面跑前端构建会报非法指令。3.2 MySQL 5.7 在 aarch64 上的获取与替代方案MySQL 5.7 官方没有 arm64 的通用二进制包这是很多人卡住的地方。三条路一是用发行版源里的mysql-server版本可能是 8.0二是用 MariaDB 10.x 的 arm64 包协议兼容度对多数项目够用三是找第三方编译好的 arm64 包但来源要可信。# 方案一发行版源安装版本可能非 5.7 apt-get install -y mysql-server mysqld --version # 方案二MariaDB arm64 apt-get install -y mariadb-server mysql --version如果项目强依赖 5.7 的某些行为先确认是不是真的非 5.7 不可多数情况改配置就能跑在 8.0 或 MariaDB 上。硬找 5.7 arm64 包往往来源不明装完还得自己修依赖性价比很低。Docker 部署时更简单直接找有 arm64 标签的镜像docker manifest inspect 镜像名能看支持的架构列表没有 arm64 就别硬拉。3.3 Docker 与容器化部署的架构匹配Docker 在 aarch64 上跑核心原则是「镜像架构必须和宿主机一致」。x86 镜像在 ARM 上跑不了除非用 QEMU 模拟但模拟性能差且容易出玄学问题生产别用。# 确认 Docker 与宿主机架构 docker version docker info | grep -i architecture # 查看镜像支持哪些架构 docker manifest inspect nginx:latest | grep architecture # 构建 arm64 镜像在 arm64 机器上直接 build 即可 docker build -t myapp:arm64 . docker run -d --name myapp -p 8080:8080 myapp:arm64docker manifest inspect输出里出现arm64才能用。多阶段构建时基础镜像每一层都要有 arm64 版本中间某一层是 x86整个镜像就跑不起来。Spring Boot 项目打包成镜像前先确认java -version在容器里也是 arm64否则就是白忙。4. 应用部署实操Spring Boot、前后端分离与商城类项目4.1 Spring Boot 打 arm64 镜像并跑起来Spring Boot 项目本身是字节码跨架构没问题问题出在基础镜像和 native 依赖上。# 使用 arm64 基础镜像 FROM arm64v8/eclipse-temurin:11-jre WORKDIR /app COPY target/myapp.jar app.jar EXPOSE 8080 ENTRYPOINT [java, -jar, app.jar]FROM那行必须显式用 arm64 基础镜像或者用多架构镜像让 Docker 自动选。构建命令docker build -t myapp:arm64 .在 arm64 机器上执行产物就是 arm64。启动后docker logs看有没有UnsatisfiedLinkError有的话就是某个 native 库没 arm64 版本得换实现或找替代库。4.2 前后端分离项目在 aarch64 上的 Nginx 与 Tomcat 配置前后端分离通常是 Nginx 托管前端静态文件反向代理到后端。aarch64 上 Nginx 装好后配置和 x86 一样但要注意路径和权限。server { listen 80; server_name _; location / { root /var/www/frontend; try_files $uri $uri/ /index.html; } location /api/ { proxy_pass http://127.0.0.1:8080/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }try_files那行是给前端路由用的少了它刷新页面就 404。proxy_pass结尾的斜杠决定路径怎么拼/api/配http://127.0.0.1:8080/会把/api/user转成/user配错就是 404。Tomcat 部署 war 包时JAVA_HOME和CATALINA_HOME都要指向 arm64 的 JDK否则启动脚本里的 native 调用会失败。4.3 tpshop 这类 PHP 商城项目的 aarch64 部署要点tpshop 是 PHP 项目aarch64 上装 PHP Nginx MySQL 即可但扩展要装对。apt-get install -y php-fpm php-mysql php-gd php-curl php-mbstring # 确认 PHP 架构 php -i | grep -i architecturePHP 扩展里gd、mbstring这些如果有 native 依赖必须装 arm64 版本。装完改 Nginx 配置把.php转给 php-fpmfastcgi_pass指向正确的 socket 或端口。商城项目附件路径错误是常见问题根源往往是open_basedir或目录权限不是架构问题但排查时容易往架构上想绕远路。5. 避坑与排查aarch64 部署里最容易翻车的五件事5.1 镜像或二进制架构不匹配现象exec format error或cannot execute binary file。原因拉了 x86 镜像或下了 x86 二进制。解决docker manifest inspect确认镜像有 arm64file 二进制名确认是ARM aarch64。别靠猜用命令看。5.2 离线源依赖缺失导致安装中断现象dpkg -i报依赖未满足apt-get install -f也修不好。原因本地源里缺依赖包。解决联网机器上用apt-rdepends把依赖树拉全一次性下载别只下主包。内网机器上先dpkg -i再apt-get install -f顺序别反。5.3 JDK 或 Node 装成 x86 版本现象java -version能跑但项目启动报UnsatisfiedLinkError或非法指令。原因装的是 x86 包在 ARM 上靠模拟跑native 库对不上。解决java -XshowSettings:properties -version 21 | grep os.arch确认是aarch64Node 用node -p process.arch确认是arm64。5.4 容器内时区或字体缺失导致应用异常现象应用日志时间不对或报表导出中文乱码。原因基础镜像没设时区、没装中文字体。解决Dockerfile 里加ENV TZAsia/Shanghai装fontconfig和文泉驿等中文字体。开发板 Qt 项目缺文泉字体也是同类问题提前装好。5.5 国产系统源配置错误导致全部安装失败现象apt update报 404 或连接超时。原因源地址写的是公网源内网不通或发行版代号写错。解决换成内网镜像源/etc/apt/sources.list里的代号和os-release里的VERSION_CODENAME对齐。改完先apt update验证再装软件。6. 验证与进阶怎么确认你的 aarch64 部署真的稳了部署完不是能访问就算完得验证架构链路每一环都对得上。我一般按这个顺序过一遍uname -m确认内核getconf LONG_BIT确认用户态java -XshowSettings:properties -version确认 JDK 架构node -p process.arch确认 Nodedocker info确认容器架构docker manifest inspect确认镜像架构。六项全对才算链路干净。再进一步用ldd看关键二进制的动态库依赖有没有缺失ldd $(which nginx) | grep not found ldd $(which java) | grep not found有not found就是缺库装对应的 arm64 库即可。这个命令比看日志快能直接定位到缺哪个.so。性能验证上aarch64 和 x86 的差异主要在单核性能和某些指令集优化上。用sysbench cpu run和sysbench memory run做个基线和 x86 机器对比心里有数。如果发现某个操作特别慢先看是不是走了 QEMU 模拟docker inspect 容器名 | grep -i qemu能看出来。最后一个习惯所有 arm64 的包和镜像下载后先file或docker manifest inspect确认架构再往生产环境放。这个动作花十秒能省掉后面几小时的排查。我吃过亏现在成了肌肉记忆。希望帮到你。本文还有配套的精品资源点击获取
上一篇/下一篇内容由系统自动关联
返回资讯列表 →