Nacos 2.4.3 ARM64 Docker镜像构建与部署实战指南
2026/9/19 6:17:15 网站建设 项目流程

简介:面向Kylin V10信创环境下的arm64架构服务器,Nacos 2.4.3 Docker镜像离线包提供了开箱即用的微服务基础设施。该镜像专为ARM处理器优化,可直接通过docker load导入,免去联网拉取或自行编译的适配过程,适用于国产化环境中的服务注册、发现与配置管理场景。压缩包内共有23个文件,包括9个json配置/清单文件、7个version版本信息文件以及7个layer.tar镜像分层文件,整体大小约215.64MB,文件布局与标准Docker镜像导出结构一致,便于实现完整性校验与离线分发。目前已有266人学习下载,适合在信创合规要求下从事Spring Cloud微服务开发或运维的工程师使用。借助该资源,团队成员无需手动解决arm64平台兼容性问题,即可快速启动Nacos服务,将部署耗时从小时级压缩到分钟级,同时获得稳定的命名空间隔离、动态配置更新等能力,显著提升微服务架构的交付与维护效率。 这阵子折腾 Nacos 2.4.3 的 ARM64 架构 Docker 镜像包,算是把从“直接拉镜像”到“自己动手构建”这条路完整踩了一遍。官方 nacos-server 镜像在 Docker Hub 上虽然热度很高,但有不少版本只有 x86_64 的构建产物,拿到 Apple Silicon、ARM 云主机或者是各种 ARM 开发板上一跑,要么架构不匹配被 Docker 默不作声地模拟执行,要么性能差到让人怀疑人生。如果你也正在给 ARM 环境找一个能直接用的 Nacos 2.4.3 镜像包,或者想彻底搞清楚 arm64 和 amd64 那点区别,那这篇实操记录应该能帮你省不少时间。


1. 为什么非要 ARM64 版 Nacos

1.1 amd64 和 arm64,差的不只是几个字母

很多同学第一次意识到架构问题,是在 Windows 下载软件时看到 “download for windows amd64” 和 “download for windows arm64” 两个选项。这两个选项核心区别就是 CPU 指令集:amd64 对应 Intel 和 AMD 的 x86 系处理器,arm64 对应高通、苹果、飞腾、鲲鹏这类使用 ARM 指令集的芯片。程序在运行时,最终都要变成 CPU 能识别的机器指令,选错架构最直观的结果就是装不上,或者装上后在兼容层里龟速运行。

到了 Docker 世界里,这个逻辑会被进一步放大。Docker 镜像里打包的不只是应用代码,还包括底层基础系统、运行时环境,每个镜像都有一个architecture标记。当你在 ARM 机器上执行docker run一个 amd64 镜像时,Docker 不会直接报错说“不能跑”,而是通过 QEMU 模拟层去执行,表面看着容器起来了,实际上每一条指令都在翻译,一旦遇到 JNI、网络 IO 密集或者并发高的场景,性能和稳定性都会出问题。所以在 ARM 环境部署服务,最正确的做法就是找对应的 arm64 镜像包。

1.2 官方 Nacos 2.4.3 镜像的坑

Nacos 官方在 Docker Hub 上维护的nacos/nacos-server镜像,热门版本很多,但对于 ARM64 的支持一直不太稳定。我实际拉取nacos/nacos-server:2.4.3之后用docker manifest inspect看了一下,镜像的架构层里边主要就是 amd64,并没有完整提供 arm64 的构建产物。如果你直接在一台纯 ARM 机器上去拉,Docker 能拉下来,但跑起来其实是模拟执行,内存占用会飙得离谱,服务启动到一半就各种诡异报错。

这里有个常见的误区:在 Mac 的 Docker Desktop 上跑官方镜像看起来没问题,不代表镜像兼容 ARM64。因为 Docker Desktop 默认会带一层轻量虚拟机,底层帮你做了架构转换,所以很多问题在 Mac 上被掩盖了。换到真正的 ARM Linux 实例上,才会原形毕露。这也是为什么我们需要一个真正面向 Linux/arm64 的 Nacos 2.4.3 镜像包。


2. 先判断架构,再决定镜像获取方式

2.1 如何确认当前环境的架构

别凭感觉猜,直接看命令输出最快。在 Linux 或者 macOS 上执行uname -m,返回aarch64就是 ARM64,返回x86_64就是 amd64;在服务器上也可以用docker info --format '{{.Architecture}}'来确认 Docker 看到的宿主架构。

命令输出架构说明
x86_64amd64Intel/AMD 处理器
aarch64arm64ARM 处理器(含 Apple Silicon Mac)
armv7larm/v732 位 ARM,不适合直接跑 Nacos

有个小细节值得注意:在 Apple Silicon Mac 上,uname -m返回的是arm64,但如果你是在 Rosetta 模拟的终端里执行,可能返回x86_64。所以判断的依据要以目标部署机器的实际架构为准,而不是构建机。

2.2 镜像获取的三种路径

拿到架构信息后,获取 Nacos 2.4.3 ARM64 镜像包基本就三条路:

  • 官方已经提供 arm64 版本:直接docker pull nacos/nacos-server:2.4.3,拉完用docker inspect确认架构。
  • 官方没有对应架构:自己从源码构建,这是本文重点。
  • 内部私有仓库已经有同事构建好的:直接docker pull内网地址,省去全部编译工作。

判断一个远程镜像是否包含 arm64 层,最简单的方式是执行:

docker manifest inspect nacos/nacos-server:2.4.3 --verbose

输出里会有architecture字段。如果只有amd64,那就老老实实进入下一步,自己构建。这个方法对任何镜像都适用,建议收藏。


3. 手工构建 Nacos 2.4.3 ARM64 镜像包的完整流程

3.1 构建环境准备

Nacos 本身是 Java 项目,Java 编译出来的 jar 包是跨架构的,所以构建 ARM64 镜像没有想象中复杂,核心是将编译好的 Nacos 服务打进一个 ARM64 基础镜像里。需要准备的环境如下:

  • Linux/ARM64 机器,或者 x86 机器上装了 Docker Buildx
  • JDK 17
  • Maven 3.6 以上
  • Git
java -version mvn -version

如果你的构建机就是目标 ARM 服务器,那最省事。如果只有 x86 机器,也可以用 Docker Buildx 的--platform linux/arm64来交叉构建,代价是第一次构建要下载 ARM 模拟层,编译耗时更长。

3.2 源码拉取与 Maven 编译

Nacos 的源码仓库结构很清晰,直接切到 2.4.3 标签,然后用官方的 release 配置编译。

git clone -b 2.4.3 https://github.com/alibaba/nacos.git cd nacos mvn -Prelease-nacos -DskipTests -Drat.skip=true clean install

这里的-Prelease-nacos会激活完整的打包配置,生成发布版目录;-DskipTests跳过测试,避免本地环境不一致导致测试失败;-Drat.skip=true跳过 Apache 的源码版权检查,这个检查在部分环境下会误伤构建。

编译完成后,产物在distribution/target/目录下:

ls distribution/target/ # 输出里能看到 nacos-server-2.4.3.tar.gz

解压出nacos目录,后续 Docker 构建直接用这个目录:

cd distribution/target tar -xzf nacos-server-2.4.3.tar.gz mv nacos-server-2.4.3 nacos

3.3 编写一份适配 ARM64 的 Dockerfile

基础镜像我选的是eclipse-temurin:17-jre-jammy。这个镜像在 Docker Hub 上同时提供 amd64 和 arm64 多个架构的构建,而且基于 Ubuntu Jammy,Java 17 的运行时对 Nacos 2.4.x 的兼容性很好。如果你对 JDK 8 有执念,也可以换成arm64v8/openjdk:8-jre,但建议优先用 17,省得后续升级版本时踩坑。

FROM eclipse-temurin:17-jre-jammy ENV NACOS_HOME=/home/nacos ENV MODE=standalone WORKDIR ${NACOS_HOME} # 将上一步解压出来的 nacos 目录复制进镜像 COPY nacos/ ${NACOS_HOME}/ EXPOSE 8848 9848 9849 ENTRYPOINT ["bash", "bin/startup.sh", "-m", "standalone"]

这个 Dockerfile 看起来简单,但有几个点值得展开。Nacos 的startup.sh脚本会根据环境变量JVM_XMSJVM_XMX等来调整堆内存,如果没有专门设置,默认配置是 512m 起,对于 ARM64 的小内存服务器可能会偏紧张。建议在运行时通过-e JVM_XMS=256m -e JVM_XMX=256m来控制,而不是在镜像里写死。另一个点是端口,Nacos 2.x 不止 8848 一个端口,9848 和 9849 分别是客户端 gRPC 和集群通信端口,Dockerfile 里必须一并暴露,否则容器跨主机通信必出问题。

3.4 构建镜像并导出

在 ARM64 构建机上,直接执行:

docker build -t nacos-server:2.4.3-arm64 .

在 x86 机器上交叉构建,则需要初始化 buildx 并指定平台:

docker buildx create --use docker buildx build --platform linux/arm64 -t nacos-server:2.4.3-arm64 --load .

--load参数会把构建结果加载进本地镜像列表,方便直接导出。如果你要把镜像包分发到离线环境,用docker save导出并压缩,这一步在镜像包交付时很常用:

docker save nacos-server:2.4.3-arm64 | gzip > nacos-2.4.3-arm64.tar.gz

目标机器上导入和解包一条命令搞定:

docker load < nacos-2.4.3-arm64.tar.gz

4. 部署实战:从单机到 MySQL 持久化

4.1 单机模式快速验证

镜像构建好了,先在单机模式跑起来验证一下。单机模式使用 Nacos 内置的 Derby 数据库,不依赖外部存储,适合先确认镜像本身没问题。

docker run -d --name nacos \ -p 8848:8848 \ -p 9848:9848 \ -p 9849:9849 \ -e MODE=standalone \ -e NACOS_AUTH_ENABLE=true \ nacos-server:2.4.3-arm64

启动后稍等几秒,访问控制台地址http://localhost:8848/nacos,默认用户名密码是nacos/nacos。首次登录如果看到 403 或者账号无法认证,多半是鉴权相关参数没有配全,这种情况可以把NACOS_AUTH_ENABLE先关掉,等确认功能正常后再逐步把鉴权、密钥这些安全性配置加上。

这里强调一下:用docker run部署时,8848 是控制台和配置接口端口,9848 是客户端 gRPC 主端口,9849 是服务端通信端口。只映射 8848 的话,服务注册和配置拉取都会超时,这是新手最容易踩的坑。

4.2 接入 MySQL 持久化

单机模式的内置 Derby 存储只适合临时验证。生产环境哪怕只有单个节点,也强烈建议接 MySQL。原因很简单:Derby 的数据文件在容器里,容器一删数据就没了,而且 Nacos 集群模式下 Derby 的分布式协调能力并不适合实际生产。

先在 MySQL 里建好库,并导入 Nacos 的建表脚本:

CREATE DATABASE nacos_config DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

建表脚本在刚才解压的nacos/conf/mysql-schema.sql里,执行:

mysql -h 127.0.0.1 -u root -p nacos_config < nacos/conf/mysql-schema.sql

然后启动容器,通过环境变量指定数据库连接信息:

docker run -d --name nacos \ -p 8848:8848 \ -p 9848:9848 \ -p 9849:9849 \ -e MODE=standalone \ -e SPRING_DATASOURCE_PLATFORM=mysql \ -e MYSQL_SERVICE_HOST=127.0.0.1 \ -e MYSQL_SERVICE_PORT=3306 \ -e MYSQL_SERVICE_DB_NAME=nacos_config \ -e MYSQL_SERVICE_USER=root \ -e MYSQL_SERVICE_PASSWORD=yourpassword \ nacos-server:2.4.3-arm64

接入 MySQL 后,Nacos 启动时会自动检测数据源。如果库表结构不对或者连接信息有误,日志里会明确报出Ensure that the current user has permissions to access the database之类的错误,这时候回头检查建表脚本是否完整执行即可。

4.3 端口、内存和鉴权参数说明

生产部署时,下面这几个参数需要单独确认。

参数/端口默认值说明
8848控制台 + HTTP API必须暴露,供浏览器和客户端访问
9848客户端 gRPC 端口必须暴露,服务注册发现主要走这个端口
9849服务端通信端口集群模式下必须暴露
JVM_XMS / JVM_XMX512m / 512m内存紧张时可以调成 256m
NACOS_AUTH_TOKEN开启鉴权后必须设置一个 32 位以上的密钥
MODEcluster单机部署必须显式改为 standalone

如果容器运行在 NAT 网络环境下,服务注册到注册中心的 IP 可能会变成容器内网 IP,导致其他机器访问不到。此时需要设置NACOS_SERVER_IP环境变量,指定宿主机对外 IP,这个问题在云服务器和虚拟机部署时特别常见。


5. 常见问题和排查实录

5.1 镜像拉下来一启动就崩溃

这种情况十有八九是架构不匹配。ARM 机器上强行跑 amd64 镜像,启动日志往往会出现Exec format error或者 JVM 无法加载的提示。排查方式很简单:查看镜像架构,确认自己的机器架构,两者必须一致。

docker inspect nacos-server:2.4.3-arm64 --format '{{.Os}}/{{.Architecture}}'

如果你用的是docker-compose部署,检查服务定义里有没有限制平台,比如platform: linux/arm64,如果写成linux/amd64,即使本地有 arm64 镜像也会强制拉取 amd64 版本。

5.2 控制台能打开,但服务注册不上

控制台能打开说明 8848 端口没问题,服务注册不上问题基本出在 9848 端口上。Nacos 2.x 客户端和服务端之间的 gRPC 长连接默认用的是主端口加 1000 的偏移,也就是 9848。如果云安全组、防火墙或者 docker 端口映射只开了 8848,客户端连接会被断开,报错信息里会出现Connection refused或者Client not connected字样。

解决办法是把 9848 和 9849 都加入防火墙白名单,并确保容器端口映射完整。还有一个小概率原因是服务端 IP 识别错误,在NACOS_SERVER_IP没有设置的情况下,Nacos 可能把注册地址识别成容器内网 IP,客户端连不上,这时候手动指定宿主机 IP 即可。

5.3 Maven 编译时依赖下载太慢

从源码构建 Nacos 2.4.3 时,Maven 要拉取大量依赖。如果你的网络环境访问 Maven Central 速度不理想,可以在~/.m2/settings.xml里配置阿里云镜像仓库,这是国内开发者最常用的加速方式,和 Docker 的镜像加速器是两回事,但解决问题的思路一致。

<mirror> <id>aliyunmaven</id> <mirrorOf>*</mirrorOf> <name>Aliyun Public Maven Repository</name> <url>https://maven.aliyun.com/repository/public</url> </mirror>

注意配置之后如果构建报证书或者仓库访问失败,把<mirrorOf>*改成central,只代理 Maven Central,避免影响其他插件仓库的解析。

5.4 Docker 拉取基础镜像速度慢

Dockerfile 里用的eclipse-temurin:17-jre-jammy体积不小,拉取慢会影响整体构建效率。可以给 Docker daemon 配置加速器,在/etc/docker/daemon.json里添加 registry-mirrors 配置,重启 Docker 后生效。这块属于基础设施常规优化,实际操作时注意把你自己的镜像源放在最前面,加速效果会更明显。


最后再分享一个实际操作中的小习惯:镜像构建成功后,我会在镜像的 tag 里明确标注架构,比如nacos-server:2.4.3-arm64而不是只写2.4.3。因为在团队协作时,x86 的同事很可能把你导出的 arm64 包直接拉去跑,然后反馈“你的镜像怎么起不来”。标注清楚架构,再配合docker save打成 tar 包分发,能省掉很多无意义的沟通成本。另外,如果你打算长期在不同架构之间切换部署,建议学会用docker manifest工具检查远程仓库的架构支持情况,这个技能在维护内部镜像仓库时非常实用。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询