虚拟机中间件部署_Nacos 部署单机模式
- [Nacos 2.3.1](#Nacos 2.3.1)
-
- [安装 Nacos](#安装 Nacos)
- [启动 Nacos](#启动 Nacos)
-
- 启动方式理解:
-
- [问题1:启动和 docker compose 的关系](#问题1:启动和 docker compose 的关系)
- [问题2:Nacos 启动流程的理解【镜像和容器】](#问题2:Nacos 启动流程的理解【镜像和容器】)
- 问题3:能不能直接镜像执行启动命令?
- [1、修改 standalone-mysql-8.yaml 启动脚本](#1、修改 standalone-mysql-8.yaml 启动脚本)
- [2、 安装 docker-compose 工具【暂不需要】](#2、 安装 docker-compose 工具【暂不需要】)
- 3、其他命令
- [4、浏览器访问 nacos 成功](#4、浏览器访问 nacos 成功)
- 配置鉴权【增加账号密码登录】
-
- [修改 nacos-standlone-mysql.env 配置文件](#修改 nacos-standlone-mysql.env 配置文件)
Nacos 2.3.1
安装 Nacos
部署理解
如官网所示,nacos 有三种部署方式。
1、nacos(最常见理解:直接拉取官方镜像 nacos/nacos-server,单机或简单集群)
2、nacos docker(指使用 docker-compose 部署,通常是集群模式)
3、nacos kubernetes(在 K8s 集群里部署 Nacos)
这都是同一个nacos,只不过有三种部署方法。我这里选择的是 nacos docker 的部署方式。这里就需要涉及到 docker-compose。

1、下载源码方法
1-1:命令拉取 nacos-docker 源码
下载最新版nacos源码:
git clone https://github.com/nacos-group/nacos-docker.git
下载不了的话,找到对应版本的压缩包的链接地址,wget命令获取,下载的位置就是当前目录的位置
wget https://github.com/nacos-group/nacos-docker/archive/refs/tags/v2.3.1.zip


1-2:windows 上传到 linux
如果命令拉取不成功,就直接下载到本地,然后在PowerShell用 scp 命令复制上传到linux。
PowerShell 是 Windows 的"超级命令行终端",类似 Linux 的 Bash。

删除掉刚刚测试上传的test文件夹
rm -rf /home/ljh/nfturbo/middleware/nacos/test
2、解压文件
1、解压
unzip v2.3.1.zip
2、unzip 是解压 .zip 压缩文件的命令行工具,类似 Windows 双击解压,没有的话的就安装一个
sudo apt install unzip

3、修改配置文件
因为nacos的配置数据也是需要进行持久化的,也就意味着需要有个数据库来存放这些数据,可以单独搞个数据库来存放。
env 里面主要放置环境配置相关的文件。
主要修改:
MYSQL_SERVICE_HOST 数据库 连接地址 192.168.209.129
MYSQL_SERVICE_DB_NAME 数据库库名 nacos-mysql
MYSQL_SERVICE_USER 数据库用户名 ljh
MYSQL_SERVICE_PASSWORD 数据库用户密码 @Ljh123456@
等几个为你自己的数据链接信息:
配置文件位置:
/home/ljh/nfturbo/middleware/nacos/nacos-docker-2.3.1/env 的 nacos-standlone-mysql.env
一开始是这样的:

修改配置:
先创建一个【nacos-mysql】的数据库,用来持久化nacos的数据

因为我是单机测试,所以账号密码写出来也没关系。

4、初始化数据
创建名称为nacos-mysql的数据库后,需要初始化表结构,就是nacos需要的基础表结构。
建表语句在下面
(请找你自己安装的版本对应的SQL文件,我的版本是 2.3.1 )


启动 Nacos
启动方式理解:
启动方式可以参考官网的 Nacos Docker 快速开始

命令的出处就是这里。

问题1:启动和 docker compose 的关系
我目前自己的理解是我在虚拟机上下载了nacos2.3.1版本的源码并解压,现在要来启动,然后官网是使用docker-compose来启动。此时我就不理解的点是,
docker-compose 是 Docker 官方提供的一个工具,专门用来定义、运行和管理多个 Docker 容器组成的应用程序。
(它让你用一个配置文件(通常叫 docker-compose.yml 或 compose.yaml),就能一次性启动、停止、配置一整套互相协作的容器,而不是一条条手动敲 docker run 命令)
我的nacos是安装在linux的,并没有安装在docker容器中,为什么需要docker-compose来启动。
因为我以为docker-compose是需要nacos安装在docker里面才能用docker-compose启动的。
理解:
就是我现在下载解压的nacos-docker-2.3.1,并不是一个完整的应用软件(如:没有 nacos-server.jar、没有 bin/startup.sh、没有 conf/application.properties 这些真正能让 Nacos 运行的文件,完整的软件得有 bin/、conf/、lib/ 等目录 )
下载的这个 nacos-docker-2.3.1.zip 只是"Docker 专用部署工具包",它的存在目的就是:帮助你通过 Docker + docker-compose 快速拉起 Nacos(而不是让你手动去下载、解压、配置 Java 环境)
目前docker ps 是什么东西都没有的,看启动之后有什么。

启动之后:

问题2:Nacos 启动流程的理解【镜像和容器】
从第一个问题到这里就可以明白,上面的压缩包就是一些启动nacos的相关配置文件和启动脚本而已,通过启动脚本启动之后,docker 就会去远程仓库拉取nacos的镜像,然后通过镜像创建真正的 Nacos 服务容器实例,然后在实例里面执行 nacos 的进程。
注意:
容器 不等同于 Nacos。
容器只是:运行环境、隔离空间、进程沙箱。
真正的 Nacos 是:容器里的 Java 进程【如执行了 java 的 nacos-server.jar】
Nacos 是用 Java 写的服务器软件,所以运行时必须启动 Java 进程

可以看到成功启动nacos之后,提示的启动信息:
Image nacos/nacos-server:v2.3.1 Pulled
Network example_default Created
Container nacos-standalone-mysql Created
理解:
这个输出是 Docker Compose 启动流程的完整执行日志
【Image → Network → Container → 服务运行 这条链路】
逐条分析:
1、Image nacos/nacos-server:v2.3.1
这个表示 Docker 从远程仓库下载了 Nacos 服务镜像;
2、Network example_default
是 Docker 自动创建了一个 虚拟网络;
为什么要网络?
因为 Nacos 容器要访问 MySQL 容器,容器之间不能用 localhost,Docker 内部用虚拟网络通信
3、Container nacos-standalone-mysql
表示用 Image 创建了一个 容器实例。
------------------------------------------
完整流程就是:
1. 下载 Nacos 镜像
2. 创建 Docker 网络
3. 创建 Nacos 容器
4. 容器内部启动 Java Nacos 服务
Nacos Docker 容器 真实启动 nacos服务: ->
容器里面的 startup.sh 启动脚本文件里面最终会执行类似:
java -Xms512m -Xmx512m \
-jar nacos-server.jar
问题3:能不能直接镜像执行启动命令?
镜像本身是 静态的文件系统 + 元数据,不能直接运行程序。
因为镜像 没有运行中的 Linux 内核和进程空间。
你必须先 创建容器,容器提供运行环境,然后才能执行命令。
镜像 = 静态模板,容器 = 动态实例,进程 = 运行中的服务。
想执行 Nacos,一定要在容器里执行。
1、修改 standalone-mysql-8.yaml 启动脚本
启动脚本修改
nacos需要依赖mysql,我上面已经在 nacos-standlone-mysql.env 配置文件修改成自己的mysql了,所以这里nacos的启动脚本中关于默认依赖mysql的地方需要修改下。
因为我的nacos是依赖mysql8的,所以用这个standalone-mysql-8.yaml 启动脚本。
standalone-mysql-8.yaml 这是一个启动脚本,是 docker-compose的一个文件。

如果这么修改掉。

启动命令
注意:
要在nacos-docker-2.3.0/example目录下执行:
docker compose -f standalone-mysql-8.yaml up
我自己的目录位置:
/home/ljh/nfturbo/middleware/nacos/nacos-docker-2.3.1/example
要让nacos能在后台运行,就执行这个命令,我习惯让其后台运行:
docker compose -f standalone-mysql-8.yaml up -d
但是因为这个启动脚本是需要 docker-compose这个工具来启动的,所以还需要安装这个工具。

命令解释
因为 docker-compose 这个写法是属于旧版本的,其实安装docker时已经自己集成了compose了,只是版本比价高。
需要把这个命令:
docker-compose -f standalone-mysql-8.yaml up -d
改成:
docker compose -f standalone-mysql-8.yaml up -d
即可。
只是把 docker-compose 改成 docker compose 就行了
2、 安装 docker-compose 工具【暂不需要】
阿里云官方文档:安装并使用Docker和Docker Compose

先看下我docker的版本
docker --version
返回:Docker version 29.2.1, build a5c7197
查看下自己服务器的操作系统
cat /etc/os-release
或者
hostnamectl
或者 ubuntu 操作系统的查看命令:
lsb_release -a
输出:
Ubuntu 24.04.3 LTS

安装docker的时候,会自动安装 compose 的
查看新版本compose 是否存在的命令
sudo docker compose version
docker compose version
查看旧版本compose 是否存在的命令
docker-compose --version

3、其他命令
docker-compose up #启动所有容器
docker-compose up -d #后台启动并运行
docker-compose stop #停止容器
docker-compose start #启动容器
docker-compose down #停止并销毁容器
4、浏览器访问 nacos 成功
http://服务器ip地址:8848/nacos/index.html
如:http://192.168.209.129:8848/nacos/index.html
可以看到成功访问 Nacos

注意:
我这里访问的时候不需要账号密码进行登录
配置鉴权【增加账号密码登录】

问题:standalone-mysql-8.yaml 和 nacos-standlone-mysql.env 的关联。
从外部文件加载环境变量。
env_file 告诉 Docker Compose:启动容器时把这个文件里的环境变量注入容器。
standalone-mysql-8.yaml 是 容器的骨架,而 nacos-standlone-mysql.env 是 容器的灵魂配置。yaml 告诉 Docker 用谁、挂哪里、映射哪些端口,env 文件告诉 Nacos "我怎么启动,连哪台 MySQL,用什么密码,是否启用鉴权"

修改 nacos-standlone-mysql.env 配置文件
需要先开启登录鉴权
在 /home/ljh/nfturbo/middleware/nacos/nacos-docker-2.3.1/env 的
nacos-standlone-mysql.env 文件添加开启鉴权的配置
# ===== Web 登录鉴权 =====
# 开启 Nacos 的鉴权系统(登录验证)
NACOS_AUTH_ENABLE=true
# 指定使用哪一套鉴权插件,目前官方只支持 nacos 这一种(基本不用改)
NACOS_AUTH_SYSTEM_TYPE=nacos
# 用于签名和验证用户登录后生成的临时 accessToken(JWT)的密钥,必须设置!
Nacos 的 JWT 密钥必须≥ 32 字节,必须是 Base64 编码的字符串
NACOS_AUTH_TOKEN_SECRET_KEY=XNP3fBftJoPR6slokALEX1SJP78HXcMsN65jJOMMEYI=
这个 NACOS_AUTH_TOKEN_SECRET_KEY 配置项值不这么写,还是写成原来的 NACOS_AUTH_TOKEN,因为 application.properties 写的配置项值就是写 NACOS_AUTH_TOKEN。

后面改成这样

命令生成随机32位的密钥
openssl rand -base64 32

到这个位置执行重新删除和启动的命令
/home/ljh/nfturbo/middleware/nacos/nacos-docker-2.3.1/example
down = 彻底停止 + 清理
docker compose -f standalone-mysql-8.yaml down
docker compose -f standalone-mysql-8.yaml up -d

报错问题【查看日志及解决】
docker logs -f nacos-standalone-mysql
启动容器后第一次访问控制台会用默认账号
username: nacos
password: nacos
但是一直报错,NACOS_AUTH_TOKEN_SECRET_KEY 说这个key 是 0 bit,secretKey 是空字符串,说 Nacos 拿到的 JWT secret key = "" 空字符串

java
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.alibaba.nacos.plugin.auth.impl.token.impl.JwtTokenManager]: Constructor threw exception; nested exception is java.lang.IllegalArgumentException: the length of secret key must great than or equal 32 bytes; And the secret key must be encoded by base64.Please see https://nacos.io/zh-cn/docs/v2/guide/user/auth.html
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:226)
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:117)
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:306)
... 112 common frames omitted
Caused by: java.lang.IllegalArgumentException: the length of secret key must great than or equal 32 bytes; And the secret key must be encoded by base64.Please see https://nacos.io/zh-cn/docs/v2/guide/user/auth.html
at com.alibaba.nacos.plugin.auth.impl.token.impl.JwtTokenManager.processProperties(JwtTokenManager.java:80)
at com.alibaba.nacos.plugin.auth.impl.token.impl.JwtTokenManager.<init>(JwtTokenManager.java:66)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:213)
... 114 common frames omitted
Caused by: java.lang.IllegalArgumentException: The specified key byte array is 0 bits which is not secure enough for any JWT HMAC-SHA algorithm. The JWT JWA Specification (RFC 7518, Section 3.2) states that keys used with HMAC-SHA algorithms MUST have a size >= 256 bits (the key size must be greater than or equal to the hash output size). See https://tools.ietf.org/html/rfc7518#section-3.2 for more information.
at com.alibaba.nacos.plugin.auth.impl.jwt.NacosJwtParser.<init>(NacosJwtParser.java:49)
at com.alibaba.nacos.plugin.auth.impl.token.impl.JwtTokenManager.processProperties(JwtTokenManager.java:76)
... 120 common frames omitted
2026-02-16 15:55:30,993 WARN [ThreadPoolManager] Start destroying ThreadPool
然后再看看 application.properties 配置文件

可以看到
nacos.core.auth.plugin.nacos.token.secret.key=${NACOS_AUTH_TOKEN:}
而nacos-standlone-mysql.env配置文件里面原本的 NACOS_AUTH_TOKEN 被我注释掉了,
改成了
NACOS_AUTH_TOKEN_SECRET_KEY


问题:
为什么application.properties的写法${NACOS_AUTH_TOKEN:}能拿到nacos-standlone-mysql.env里面的数据?
回答:
因为 nacos-standlone-mysql.env 里的内容,被 Docker 注入成了容器的 Linux 环境变量,而 Spring Boot 的 ${NACOS_AUTH_TOKEN} 就是从 Linux 环境变量读取的。

到这个位置执行重新删除和启动的命令
/home/ljh/nfturbo/middleware/nacos/nacos-docker-2.3.1/example
down = 彻底停止 + 清理
docker compose -f standalone-mysql-8.yaml down
docker compose -f standalone-mysql-8.yaml up -d
成功
如图,现在登录就需要账号密码了

用默认的账号密码登录:nacos 和 nacos

后面要怎么修改个人密码这样就可以了
