docker 部署 nacos 3.x系列问题及解决

问题描述

感悟:部署应用方面可能博客比ai更好用
https://blog.csdn.net/wolfpirelee/article/details/147750590 直接看这篇博客就可以解决问题了!本篇博客用于记录解决问题的过程。

当我使用部署nacos 2.x时的命令:

docker run -d \
  --name nacos \
  -p 8848:8848 \
  -e MODE=standalone \
  nacos/nacos-server:2.5.1

出现了问题,浏览器无法访问nacos控制台,于是尝试排查:

sudo docker ps # 查看正在运行的容器,发现没有nacos

sudo docker ps -a # 查看所有容器包括停止的容器,找到nacos了

sudo docker start nacos # nacos是容器名,尝试启动容器

# 注意启动失败,控制台也不会报错

sudo docker ps -a | grep nacos # 查看nacos容器,注意观察STATUS状态
# 发现状态为 exited(255),即nacos启动后发生异常退出

查看日志,进一步定位错误:

sudo docker logs nacos # 查看日志

# 日志一大堆,直接发给ai看
# 自己看也行,一大堆看不懂的没关系,关键点往往是你看得到的一两句英语

这里日志出现的关键句子是:echo'NACOS_AUTH_TOKEN must be set with Base64 String'

NACOS_AUTH_TOKEN

于是,知道了问题:docker run时需要指定一个参数,并且是Base64的字符串

echo -n "my-secret-token-here" | base64 # 控制台会返回一个token,记下它
sudo docker rm nacos # 删除配置错误的容器

sudo docker ps -a | grep nacos   # 检查容器删除成功,正常应该无输出

添加上新参数,尝试创建容器,发现仍然失败

NACOS_AUTH_INDENTITY_KEY 与 NACOS_AUTH_IDENTITY_VALUE

查看日志,发现缺少NACOS_AUTH_INDENTITY_KEY 与 NACOS_AUTH_IDENTITY_VALUE这两个参数
询问豆包这两个参数怎么配,删除旧容器,重新创建容器,成功!

终于,在最后豆包跟我说了掏心窝的话:上面缺少的参数是nacos2.2.3+的新加的安全机制,必须配置这些安全参数才能正确启动
后来后来,我灵机一动,浏览器搜索nacos 3.x docker配置,映入眼帘的就是本文开头链接的博文,一切讲得清清楚楚明明白白!
反思:我真傻,真的,我单知道docker可以一键配置,可我不知道不同版本间配置方法可会有差异啊。我应该首先去带着版本号去搜索相关博客的,我还应该首先把我使用的版本告诉ai的,我因为前几天刚配了2.x版本,于是惯性思维就使用了以前的方法。
这些是后话了,这个惯性思维又带来了新问题,localhost:8848怎么访问不了nacos控制台??!

无法访问nacos控制台问题

经过刚才一番折腾,我对豆包失去了信任,GPT登场!~

我在主机应该如何访问虚拟机的nacos服务呢?我开始以为是ip地址问题,于是先获取虚拟机ip

ip a | grep inet

# 找到带有scope global dynamic的那一行,那行inet 后面的就是虚拟机ip
# 然后访问 ip:8080/nacos即可

尝试访问,失败

GPT料事如神,说注意不要用172.17.0.2这是docker内部网络,外部无法访问,我最开始就看错了
修改后尝试访问,失败

我仍然怀疑是ip地址问题,于是尝试主机ping虚拟机ip,成功
我决定在虚拟机内部浏览器尝试访问,使用localhost:8080/nacos,失败

于是我将豆包给的创建容器命令,和nacos日志发给gpt,gpt指出问题:
创建容器时没有映射8080端口,导致外部无法访问web uI控制台 这是对的
但同时gpt也给我挖了个坑,他说NACOS_AUTO_TOKEN应该传明文,而不是base64编码后的 这是错的 这会导致容器启动失败,浪费我不少时间

# 这是我最后创建容器的命令 
# token是自行生成的,命令为:
openssl rand -base64 32

sudo docker run -d \
  --name nacos \
  -p 8848:8848 \
  -p 8081:8080 \
  -e MODE=standalone \
  -e NACOS_AUTH_ENABLE=true \
  -e NACOS_AUTH_TOKEN=/XdqFX/j+wky5OWFhWeeanXpDaKkq7SZROKKQlzc2EE= \
  -e NACOS_AUTH_IDENTITY_KEY=test_key \
  -e NACOS_AUTH_IDENTITY_VALUE=test_value \
  --memory=2g \
  nacos/nacos-server:latest

这时后,我产生了疑问,我记得xxl-job也需要访问控制台,那是否也需要8080端口,是否会冲突呢?
gpt给出答案,不会!因为docker run时配置了端口映射,可以将虚拟机的不同端口,映射到多个容器的8080端口,容器之间相互隔离。访问时,访问虚拟机的端口即可。

另一种获取虚拟机ip地址方法

ip a
# 在输出中,找到eth0 或者 ens33 或者 enp0s3下的 inet之后的ip

虚拟机中可以通过,虚拟机ip:8081/index.html 或者 localhost:8081/index.html 访问(8081是创建容器时映射到容器8080端口的虚拟机端口)

主机可以通过, 虚拟机ip:8081 访问nacos

posted @ 2025-07-20 22:04  violet0evergarden  阅读(417)  评论(0)    收藏  举报