公司 二开版 Nacos Docker 镜像构建

公司 二开版 Nacos Docker 镜像构建

记录时间:2026-08-06
环境:Docker 20.10+ / Docker Compose / 信创 ARM64 + x86 混合部署
版本:Nacos 2.4.3 技术二开版

背景:二开代码是技术直接丢过来的(仓库 http://192.168.111.14:9980/xxx/gzeportnacos),没给任何说明,只要求构建成 Docker 镜像。只能自己对着官方 nacos-docker 的构建方式搭,本文档按「编译 → 构建 → 运行」全流程整理,照着走就能复现,遇到问题看文末常见问题。

基于 Nacos 2.4.3 技术二开版(适配 Oracle/达梦/金仓等多数据库 + 定制”xxxx统一配置中心”控制台界面),构建方式对齐官方 nacos-docker v2.4.3

与官方唯一差异:官方镜像通过 curl 下载官方编译好的 nacos-server.tar.gz,本二开版改为 COPY 本地编译产物 console/target/nacos-server.jar(二开 jar 必须由本项目源码编译产出)。

一、与官方 nacos-docker 的差异

镜像主体与官方 nacos-docker v2.4.3 一致,仅以下 4 处因二开需求调整:

位置 官方做法 二开做法 原因
Dockerfile curl 下载官方 nacos-server.tar.gz 解压 COPY console/target/nacos-server.jar 二开 jar 必须由本项目源码编译产出
application.properties db 段 jdbc:mysql://${MYSQL_SERVICE_HOST}:port/db 拼接 ${DB_URL} 整串占位 兼容 Oracle/达梦/金仓/MySQL,URL 格式各异,无法用 host/port 拼接
application.properties 鉴权忽略路径 /console-fe/public/** /console-ui/public/** 二开前端目录名为 console-ui

其余配置项(server / auth / metrics / naming.distro / cmdb / console 等)与环境变量均与官方完全一致。

二、目录结构

项目根/
├── .dockerignore                  # 构建上下文排除清单(排除大体积 tar.gz/zip、IDE、日志等)
└── build/
    ├── Dockerfile                 # 镜像构建文件(基于 alpine + openjdk8-jre)
    ├── bin/
    │   └── docker-startup.sh      # 启动脚本(源自官方,环境变量驱动)
    ├── conf/
    │   └── application.properties # Docker 专用配置(主体对齐官方,db 段保留二开适配)
    ├── env/
    │   └── nacos.env              # 环境变量示例(数据库 / JVM / 鉴权)
    ├── docker-compose.yml         # 单机编排示例(默认 Derby)
    ├── docker-compose-cluster.yml # 集群编排示例(3 节点)
    ├── docker-compose-mysql.yaml  # 单机 + MySQL(无外部库时临时验证)
    ├── docker-compose-kb.yaml     # 单机 + 金仓 Kingbase(外部库)
    └── README.md                  # 本文档

镜像内布局(与官方一致,BASE_DIR=/home/nacos):

/home/nacos/
├── bin/docker-startup.sh
├── conf/application.properties
├── target/nacos-server.jar
└── logs/

三、前置条件

  1. 已安装 Docker(建议 20.10+)和 Docker Compose。
  2. 已完成源码编译,产出 console/target/nacos-server.jar
  3. 数据库:默认使用内嵌 Derby(零依赖,无需额外准备)。若要切换外部数据库(Oracle/MySQL/达梦/金仓),需先建库并执行对应脚本(如 Oracle 用 distribution/conf/nacos-oracle.sql、MySQL 用 mysql-schema.sql)。

四、编译源码(产出 nacos-server.jar)

项目根目录执行:

⚠️ PowerShell 下 -D 参数必须加引号,否则会被错误拆分(详见常见问题 Q1)。

# Windows PowerShell
mvn -Prelease-nacos "-Dmaven.test.skip=true" clean install -U

# Windows cmd / Linux bash
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U

编译成功后确认产物存在:

Test-Path console\target\nacos-server.jar   # 应输出 True

构建产物:console/target/distribution/ 两个 jar 的关系

编译后会出现两个 nacos-server.jar,它们是同一个文件(MD5 完全一致),只是位置和用途不同:

路径 身份 来源
console/target/nacos-server.jar 源头 console 模块 mvn package 直接产出(console/pom.xmlfinalName=nacos-server
distribution/target/nacos-server-2.4.3/nacos/target/nacos-server.jar 组装副本 distributionmaven-assembly-pluginrelease-nacos.xml)把上面的 jar 复制进发行包
  • distribution/.../nacos/完整发行包目录(含 bin/ conf/ target/jar LICENSE NOTICE),模拟官方 nacos-server.tar.gz 解压结构,供”传统 tar 包部署”使用;
  • 复制关系见 distribution/release-nacos.xml<source>../console/target/nacos-server.jar</source>

Docker 构建用 console/target/nacos-server.jar(本 Dockerfile 即采用此路径):路径短、不依赖 assembly 长路径、mvn package 即可产出;镜像的 bin/ conf/build/ 目录单独提供,不需要整个发行包。

验证两者一致性:

md5sum console/target/nacos-server.jar distribution/target/nacos-server-2.4.3/nacos/target/nacos-server.jar

五、构建镜像

项目根目录gzeportnacos-main/)执行:

docker build -f build/Dockerfile -t gzeport/nacos-server:2.4.3 .
  • -f build/Dockerfile:指定 Dockerfile 路径。
  • -t gzeport/nacos-server:2.4.3:镜像名与标签,需与 docker-compose.yml 中的 image 一致。
  • 末尾 .:构建上下文为项目根目录(受 .dockerignore 约束)。

构建成功后确认镜像已生成:

docker images gzeport/nacos-server:2.4.3   # 应列出对应镜像及大小

多架构构建(buildx,amd64 + arm64)

如需同时产出 linux/amd64linux/arm64 镜像(x86 服务器与 Apple Silicon / ARM 服务器混用),使用 docker buildx

前提:Docker Desktop(Mac/Win)已内置 buildx 与跨架构模拟(qemu binfmt),可直接使用;Linux 需先开启 binfmt:

# 仅 Linux 需要;Mac/Windows Docker Desktop 可跳过
docker run --privileged --rm tonistiigi/binfmt --install all

创建 builder 并构建推送(多架构镜像必须 --push,不能 --load 到本地):

# 创建专用 builder(一次性)
docker buildx create --use --name multiarch --driver docker-container

# 多架构构建并推送,镜像名需带 registry 前缀
docker buildx build \
  --platform linux/amd64,linux/arm64 \
  -f build/Dockerfile \
  -t <你的registry>/gzeport/nacos-server:2.4.3 \
  --push .

验证多架构产物

docker manifest inspect <你的registry>/gzeport/nacos-server:2.4.3
# 输出应包含 "architecture": "amd64" 与 "arm64" 两个 platform

注意事项:
arm64 构建慢 3~5 倍(qemu 模拟 apk install openjdk8),请耐心等待。
建议先单测 arm64 再合构建:docker buildx build --platform linux/arm64 -f build/Dockerfile -t test/nacos-arm64 .,确认能过 JDK 安装步骤。
arm64 风险点:当前基础镜像 alpine + apk openjdk8-jre-base 在 arm64 上若报 JDK 安装失败,需切换到 eclipse-temurin:8-jre-alpine,详见常见问题 Q4。

六、运行

⚠️ 任何方式都必须传入 NACOS_AUTH_TOKEN(Base64,解码 ≥ 32 字节)。Nacos 2.2.1+ 启动时强制校验 token,缺失或过短会直接启动失败(与是否开启鉴权无关)。下列方式 A/B/C 均经 env/nacos.env 提供;方式 B2 演示用 -e 直接传入。

方式 A:docker-compose(推荐)

cd build
docker-compose up -d

查看日志 / 停止:

docker-compose logs -f
docker-compose down

compose 已内置健康检查(/nacos/v1/console/health/readiness,间隔 10s,起始等待 30s),可用 docker inspectdocker-compose ps 观察状态。

方式 B:docker run(Linux)

# 方式 B1:用 env-file(推荐,NACOS_AUTH_TOKEN 等已在 env/nacos.env 配好)
docker run -d --name gzeport-nacos \
  -p 8848:8848 -p 9848:9848 -p 9849:9849 \
  --env-file build/env/nacos.env \
  -e MODE=standalone \
  gzeport/nacos-server:2.4.3

# 方式 B2:不挂 env-file,直接传关键变量(至少要有 NACOS_AUTH_TOKEN,否则启动失败)
docker run -d --name gzeport-nacos \
  -p 8848:8848 -p 9848:9848 -p 9849:9849 \
  -e MODE=standalone \
  -e NACOS_AUTH_TOKEN=VGhpc0lzTXlDdXN0b21TZWNyZXRLZXkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkw \
  gzeport/nacos-server:2.4.3

方式 C:集群模式(3 节点)

cd build
docker-compose -f docker-compose-cluster.yml up -d

集群模式要点:
NACOS_SERVERS 已在 compose 中配置为三节点容器名(nacos1 nacos2 nacos3),容器间通过 Docker 内置 DNS 以 hostname 寻址。
– 三节点必须使用同一外部数据库(Oracle/MySQL/达梦/金仓,需在 env/nacos.env 配置 DB_* + DB_NUM=1),集群模式不支持 Derby 嵌入式存储。
– 仅 nacos1 映射宿主 8848/9848/9849,nacos2/nacos3 映射到 8858/9858、8868/9868 避免端口冲突。
– 节点扩缩容:修改 docker-compose-cluster.yml 增减 service,并同步更新每个节点的 NACOS_SERVERS

访问控制台:http://localhost:8848/nacos (默认账号 nacos / nacos

七、端口说明

端口 用途
8848 HTTP 接口与 Web 控制台
9848 客户端 gRPC(Nacos 2.x 客户端主要通信端口,必须映射
9849 服务端间 Raft gRPC(集群模式需要)

八、数据库配置

镜像内置 application.properties 主体对齐官方 nacos-docker v2.4.3server / auth / metrics / naming.distro / cmdb / console 等配置项与环境变量完全一致),仅 db 连接段因二开需兼容 Oracle / 达梦 / 金仓 / MySQL 而保留整串 DB_URL 占位。官方为 MySQL 专属的 jdbc:mysql://${MYSQL_SERVICE_HOST}:... 拼接式,无法覆盖 Oracle 等 URL 格式。

默认行为:不配置任何 DB_* 变量时,Nacos 单机自动走内嵌 Derby(零依赖,对齐官方默认)。配置下列变量后才会启用外部数据库,无需重建镜像即可切换

支持的数据库类型

数据库 SPRING_DATASOURCE_PLATFORM DB_DRIVER 建库脚本 JDBC URL 示例 适用
Derby(内嵌,默认) 空(不配) 不配 derby-schema.sql(自动) 不需要 单机零依赖,不支持集群
MySQL mysql com.mysql.cj.jdbc.Driver mysql-schema.sql jdbc:mysql://host:3306/nacos?... 单机/集群
Oracle oracle oracle.jdbc.OracleDriver nacos-oracle.sql jdbc:oracle:thin:@host:1521:sid 单机/集群
达梦 DM dm dm.jdbc.driver.DmDriver nacos-dm.sql jdbc:dm://host:5236?schema=NACOS 单机/集群
金仓 Kingbase kingbase com.kingbase8.Driver nacos-kingbase.sql jdbc:kingbase8://host:54321/db?schema=NACOS&... 单机/集群

所有外部数据库驱动(Oracle ojdbc8 + orai18n / 达梦 / 金仓)均已通过 Maven 依赖打进 nacos-server.jar,镜像内无需单独放置驱动。

建库 SQL 来源:本镜像 distribution/conf/ 已自带各库建库脚本。官方各数据库适配插件及最新 SQL 位于 nacos-group/nacos-plugin 仓库:

数据库 二开自带脚本(distribution/conf/ 官方插件模块参考
Derby derby-schema.sql(内嵌自动初始化,无需手动执行) 随 Nacos 主仓库
MySQL mysql-schema.sql 随 Nacos 主仓库
Oracle nacos-oracle.sql nacos-oracle-datasource-plugin-ext/schema
达梦 DM nacos-dm.sql nacos-dm-datasource-plugin-ext/schema/nacos-dm.sql
金仓 Kingbase nacos-kingbase.sql nacos-kingbase-datasource-plugin-ext/schema

其他国产库(SQL Server / OceanBase / openGauss / 虚谷 / 崖山等)可在该仓库找到对应 nacos-{db}-datasource-plugin-ext 模块的 schema/ 目录。

启用外部数据库(除 Derby 外)需配置以下变量:

环境变量 默认值(Derby 模式下为空) 说明
DB_NUM 0 >0 才启用外部存储;Derby 模式保持 0
SPRING_DATASOURCE_PLATFORM 数据库平台:oracle / mysql / dm / kingbase
DB_URL JDBC 连接串
DB_USER 数据库用户名
DB_PASSWORD 数据库密码
DB_DRIVER org.apache.derby.jdbc.EmbeddedDriver JDBC 驱动类(外部库必须配,官方要求;Derby 模式默认内嵌驱动)
DB_CONNECTION_TEST_QUERY 连接探活 SQL(可选)

Derby 模式下 DB_DRIVER 默认内嵌驱动;切换外部库时必须配置 DB_DRIVER官方文档 要求 driverClassName 必填)。

切换到 MySQL 的示例(修改 env/nacos.env):

DB_NUM=1
SPRING_DATASOURCE_PLATFORM=mysql
DB_URL=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
DB_USER=root
DB_PASSWORD=your_password
DB_DRIVER=com.mysql.cj.jdbc.Driver
DB_CONNECTION_TEST_QUERY=SELECT 1

达梦 / 金仓同理,驱动已打进 nacos-server.jar,切换平台 + URL + 驱动即可。

参考文档

九、关键环境变量(节选)

变量 默认值 说明
MODE cluster 启动模式,单机必须设为 standalone
NACOS_APPLICATION_PORT 8848 Nacos HTTP 端口(对齐官方)
SERVER_SERVLET_CONTEXTPATH /nacos Web 上下文路径(对齐官方)
PREFER_HOST_MODE ip 集群寻址 ip / hostname
NACOS_SERVERS 集群节点列表,空格分隔,如 ip1:8848 ip2:8848
JVM_XMS / JVM_XMX / JVM_XMN 1g / 1g / 512m 堆内存参数
NACOS_AUTH_ENABLE false 是否开启鉴权
NACOS_AUTH_TOKEN 鉴权 Token(Base64),开启鉴权时必须设置
NACOS_AUTH_IDENTITY_KEY / VALUE 服务端身份标识,开启鉴权时必须设置

完整变量列表参考 官方属性配置列表

十、常见问题

Q1:PowerShell 执行 mvnUnknown lifecycle phase ".test.skip=true"

PowerShell 会把 -Dmaven.test.skip=true 错误拆分。解决:给 -D 参数加引号,或用 --% 停止解析:

mvn -Prelease-nacos "-Dmaven.test.skip=true" clean install -U
# 或
mvn --% -Prelease-nacos -Dmaven.test.skip=true clean install -U

Q2:容器启动报 bin/docker-startup.sh: not found\r 相关错误

Windows 下 git 可能将 *.sh 换行转成 CRLF。本 Dockerfile 已内置 sed -i 's/\r$//' 兜底,正常不触发;若仍出现:

# 建议在 .gitattributes 中固定 *.sh 为 LF,或执行 dos2unix
dos2unix build/bin/docker-startup.sh

Q3:启动卡住或报数据库连接失败(如 ORA-12541[db-load-error]

确认数据库实例可达、账号密码正确、对应建库脚本已执行(Oracle 用 nacos-oracle.sql、MySQL 用 mysql-schema.sql)。容器内可 docker exec -it gzeport-nacos sh 排查。若暂无外部数据库,单机模式默认走内嵌 Derby(零依赖),无需任何 DB 配置。

Q4:多架构构建 arm64 报 openjdk8-jre-base 安装失败

当前基础镜像 alpine + apk openjdk8-jre-base(对齐官方)。alpine 的 openjdk8 在 arm64 可能不可用,切到多架构原生 JDK 镜像:

FROM eclipse-temurin:8-jre-alpine          # 替换 alpine:latest
RUN apk add --no-cache curl iputils ncurses vim libcurl bash   # 删去 openjdk8-jre-base
ENV JAVA_HOME=/opt/java/openjdk            # temurin 路径
ENV JAVA=/opt/java/openjdk/bin/java

其余 COPY、启动脚本、配置无需改动,nacos-server.jar 是 Java 字节码,天然跨架构。

实测 amd64/arm64 下 apk openjdk8-jre-base 均安装成功,本节作兜底方案保留。

Q5:启动报 Failed to load driver class / db.pool.config 绑定 HikariDataSource 失败

根因db.pool.config.driverClassName 值为空字符串,HikariCP 的 setDriverClassName("") 抛异常。官方数据源插件文档明确:外置数据库必须配置 driverClassName(PostgreSQL/Oracle 示例均显式配置)。

本镜像处理(兼顾 Derby 默认与外部库必填):

db.pool.config.driverClassName=${DB_DRIVER:org.apache.derby.jdbc.EmbeddedDriver}
  • Derby 内嵌模式DB_NUM=0,默认):DB_DRIVER 不配 → 默认 org.apache.derby.jdbc.EmbeddedDriver(nacos-server.jar 自带),HikariCP 正常
  • 外部库DB_NUM=1):必须用 DB_DRIVER 指定驱动类(如 oracle.jdbc.OracleDriver),满足官方必填要求

遇到的问题:曾尝试删除 driverClassName 行(以为 HikariCP 能按 URL 自动推断驱动),Derby 模式虽可启动,但违背了官方对外部库的必填要求。最终纠正为”默认 EmbeddedDriver + DB_DRIVER 覆盖”:Derby 模式有有效默认值不报错,外部库显式配 DB_DRIVER 满足官方要求。

排查:若仍报错,检查 DB_DRIVER 拼写、对应驱动是否打进 jar(Oracle/达梦/金仓驱动已在 nacos-server.jar)。

十一、参考资料

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇