Docker 安装 Nacos 详细步骤
一 Linux
1 拉取镜像
docker pull nacos/nacos-server:v2.5.0
2 创建存储nacos数据信息的目录
在根目录下创建/data/docker/nacos目录,用于挂载存储nacos的数据信息
mkdir -p /user/lzl/tool/docker/nacos/nacos_v2.5.0/home
3 nacos配置文件获取
3.1 提前运行一个nacos容器
目的: 把nacos容器中的配置文件拷贝到宿主机中对应的目录下
3.2 创建nacos容器
docker run -d --name nacos_test
-p 8848:8848
-p 9848:9848
-p 9849:9849
--privileged=true
--restart=always
-v /etc/localtime:/etc/localtime:ro
-e TZ=Asia/Shanghai
-e LANG=en_US.UTF-8
-e JVM_XMS=256m
-e JVM_XMX=256m
-e MODE=standalone
nacos/nacos-server:v2.5.0
3.3 拷贝容器中的数据到宿主机对应的目录下
docker cp nacos_test:/home/nacos/conf /user/lzl/tool/docker/nacos/nacos_v2.5.0/home/conf
3.4 停止&删除容器
docker rm -f nacos_test
4 修改 application.properties 配置文件
4.1 编辑配置文件
vim /data/docker/nacos/conf/application.properties
一般主要修改下面配置文件中标红部分
推荐开启如下配置
# 开启鉴权功能
nacos.core.auth.enabled=${NACOS_AUTH_ENABLE:true}
# 关闭使用user-agent判断服务端请求并放行鉴权的功能
nacos.core.auth.enable.userAgentAuthWhite=false
# 配置自定义身份识别的key和value,这两个属性是auth的白名单,用于标识来自其它服务器的请求。
nacos.core.auth.server.identity.key=authKey
nacos.core.auth.server.identity.value=shigzh
# 自定义用于生成JWT令牌的密钥,注意:原始密钥长度不得低于32字符,且一定要进行Base64编码,否则无法启动节点。
nacos.core.auth.plugin.nacos.token.secret.key=bmFjb3NfMjAyNTAyMDJfbHpsX25hY29zX3Rlc3RfdG9rZW4=
# 权限缓存开关,开启后权限缓存的更新默认有15秒的延迟,默认 : false
nacos.core.auth.caching.enabled=true
# 数据库相关配置
spring.sql.init.platform=${SPRING_DATASOURCE_PLATFORM:mysql}
db.url.0=jdbc:mysql://${MYSQL_SERVICE_HOST:test.test}:${MYSQL_SERVICE_PORT:testPort}/${MYSQL_SERVICE_DB_NAME:testDbName}?${MYSQL_SERVICE_DB_PARAM:characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false}
db.user.0=${MYSQL_SERVICE_USER:root}
db.password.0=${MYSQL_SERVICE_PASSWORD:root@12345678}
需要注意的是,nacos.core.auth.enabled=${NACOS_AUTH_ENABLE:true}
这个配置在配置文件中并不存在(v2.5.0),需要自己添加
nacos.core.auth.enabled=${NACOS_AUTH_ENABLE:true}
4.2 鉴权配置简介(参考文章 官方文档)
4.2.1 nacos开启鉴权
- 2.2.2版本之前的Nacos默认控制台,无论服务端是否开启鉴权,都会存在一个登录页,这就导致很多用户被误导认为Nacos默认是存在鉴权的。
- 在社区安全工程师的建议下,Nacos自2.2.2版本开始,在未开启鉴权时,默认控制台将不需要登录即可访问,同时在控制台中给予提示,提醒用户当前集群未开启鉴权,在用户开启鉴权后,控制台才需要进行登录访问。
- 开启鉴权功能之后,访问Nacos服务端API和控制台都需要输入用户名和密码(默认的用户名和密码都是nacos,可以登录控制台进行修改密码),可以提高Nacos的安全性,如果客户端(其它服务或者控制台用户)无法提供正确的用户名和密码,将无法访问Nacos Server,这样可以防止服务端被非授权访问,所以对于生产环境中的Nacos Server推荐设置为true。
- 如果Nacos禁用鉴权功能,此时访问Nacos服务端API和控制台不需要任何登录即可匿名访问。
4.2.2 修改nacos配置文件(application.properties)
如果 nacos.core.auth.enabled
设置为true,必须添加以下nacos.core.auth.server.identity.key
、nacos.core.auth.server.identity.value
、nacos.core.auth.plugin.nacos.token.secret.ke
y配置,否则无法启动节点。
推荐开启如下配置
# 开启鉴权功能
nacos.core.auth.enabled=true
# 关闭使用user-agent判断服务端请求并放行鉴权的功能
nacos.core.auth.enable.userAgentAuthWhite=false
# 配置自定义身份识别的key和value,这两个属性是auth的白名单,用于标识来自其它服务器的请求,具体实现见 com.alibaba.nacos.core.auth.AuthFilter。
nacos.core.auth.server.identity.key=authKey
nacos.core.auth.server.identity.value=shigzh
# 自定义用于生成JWT令牌的密钥,注意:原始密钥长度不得低于32字符,且一定要进行Base64编码,否则无法启动节点。
nacos.core.auth.plugin.nacos.token.secret.key=bmFjb3NfMjAyNTAyMDJfbHpsX25hY29zX3Rlc3RfdG9rZW4=
# 权限缓存开关,开启后权限缓存的更新默认有15秒的延迟,默认 : false
nacos.core.auth.caching.enabled=true
4.2.3 自定义生成JWT令牌的密钥
注意:原始密钥长度不得低于32字符,且一定要进行Base64编码,否则无法启动节点。
/**
*
* nacos中JWT令牌密钥生成器
* 生成 nacos.core.auth.plugin.nacos.token.secret.key 的值
*
* @author shigzh
* @since 2024/1/10 13:41
*/
public class NacosSecretUtil {
public static void main(String[] args) {
// 自定义生成JWT令牌的密钥
String nacosSecret = "nacos_20240110_shigzh_nacos_token";
// 输出密钥长度,要求不得低于32字符,否则无法启动节点。
System.out.println("密钥长度》》》" + nacosSecret.length());
// 密钥进行Base64编码
byte[] data = nacosSecret.getBytes(StandardCharsets.UTF_8);
System.out.println("密钥Base64编码》》》" + Base64Utils.encodeToString(data));
}
}
5 初始化nacos数据库
5.1 用navicat创建数据库,库名为nacos
5.2 获取数据库脚本文件
有如下3种方式进行获取
- 通过nacos容器目录
/home/nacos/conf
下获取数据库脚本文件mysql-schema.sql。 - 通过宿主机目录
/user/lzl/tool/docker/nacos/nacos_v2.5.0/home/conf
下获取数据库脚本文件mysql-schema.sql。 - 直接通过 https://www.cnblogs.com/shigzh/p/17941250 获取数据库脚本文件。
6 运行容器
6.1.1 运行命令
docker run -d --name nacos__v2.5.0
-p 8848:8848
-p 9848:9848
-p 9849:9849
--privileged=true
--restart=always
-v /user/lzl/tool/docker/nacos/nacos_v2.5.0/home/logs/:/home/nacos/logs
-v /user/lzl/tool/docker/nacos/nacos_v2.5.0/home/data/:/home/nacos/data
-v /user/lzl/tool/docker/nacos/nacos_v2.5.0/home/conf/:/home/nacos/conf
-v /etc/localtime:/etc/localtime:ro
-e TZ=Asia/Shanghai
-e LANG=en_US.UTF-8
-e JVM_XMS=256m
-e JVM_XMX=256m
-e MODE=standalone
-e PREFER_HOST_MODE=hostname
nacos/nacos-server:v2.5.0
6.1.2 命令解释
6.1.2.1 容器名称
docker run -d --name nacos__v2.5.0
-d
:以 后台模式 运行容器(detached)。--name nacos__v2.5.0
:将容器命名为nacos__v2.5.0
,方便管理。
6.1.2.2 端口映射
-p 8848:8848
-p 9848:9848
-p 9849:9849
-p 8848:8848
:暴露 Nacos Web 管理控制台(默认端口8848
)。-p 9848:9848
:Nacos gRPC 服务端口,用于支持 gRPC 远程调用(主要用于 Nacos 2.x 及以后)。-p 9849:9849
:用于 Nacos 2.x 的 Raft 协议(集群模式才需要,单机模式下不会用到)。
1.指定端口映射,注意这里的p不能大写,大写是随机端口映射。
2.“:”前为宿主机端口号,“:”后为容器端口号。
2.nacos客户端2.x后增加了9848、9849这两个端口来进行gRPC通信,是主端口通过一定偏移量自动生成的(即8848 + 1000 和 8848 + 1001),如果nacos对外暴露的主端口是其它(默认是8848),那么这两个端口就需要用暴露的主端口分别+1000 和 +1001进行获取并暴露。
4.9848端口,是指客户端gRPC请求服务端端口,用于客户端向服务端发起连接和请求,与主端口的偏移量为1000(即8848+1000)
5.9849端口,是指服务端gRPC请求服务端端口,用于服务间同步等,与主端口的偏移量为1001(即8848+1001)
6.1.2.3 权限与重启策略
--privileged=true
--restart=always
--privileged=true
:允许容器获得宿主机的 特权权限(通常不推荐在生产环境中使用)。--restart=always
:容器在意外停止或重启 Docker 进程时,会 自动重启。
6.1.2.4 数据与日志挂载
-v /user/lzl/tool/docker/nacos/nacos_v2.5.0/home/logs/:/home/nacos/logs
-v /user/lzl/tool/docker/nacos/nacos_v2.5.0/home/data/:/home/nacos/data
-v /user/lzl/tool/docker/nacos/nacos_v2.5.0/home/conf/:/home/nacos/conf
-v /etc/localtime:/etc/localtime:ro
-
-v /user/lzl/tool/docker/nacos/nacos_v2.5.0/home/logs/:/home/nacos/logs
- 日志持久化:将
Nacos
日志文件挂载到宿主机,以防止容器删除后日志丢失。
- 日志持久化:将
-
-v /user/lzl/tool/docker/nacos/nacos_v2.5.0/home/data/:/home/nacos/data
- 数据持久化:Nacos 的数据目录,存储配置信息、服务信息等。
-
-v /user/lzl/tool/docker/nacos/nacos_v2.5.0/home/conf/:/home/nacos/conf
- 配置文件持久化:允许修改
application.properties
或nacos.cfg
后容器生效。
- 配置文件持久化:允许修改
-
-v /etc/localtime:/etc/localtime:ro
- 时区同步:使用宿主机的时区,确保时间同步,
ro
表示只读模式。
- 时区同步:使用宿主机的时区,确保时间同步,
6.1.2.5 环境变量
-e TZ=Asia/Shanghai
-e LANG=en_US.UTF-8
TZ=Asia/Shanghai
:设置时区为 中国上海(东八区)。LANG=en_US.UTF-8
:使用 UTF-8 编码,防止乱码。
6.1.2.6 JVM 资源限制
-e JVM_XMS=256m
-e JVM_XMX=256m
JVM_XMS=256m
:初始堆内存 设置为256MB
。JVM_XMX=256m
:最大堆内存 也是256MB
,防止内存占用过高(适用于轻量级环境)。
6.1.2.7 Nacos 运行模式
-e MODE=standalone
-e PREFER_HOST_MODE=hostname
MODE=standalone
:以 单机模式 运行 Nacos,不需要 MySQL(生产环境通常用 cluster 模式)。PREFER_HOST_MODE=hostname
:Nacos 内部服务发现优先使用 主机名(通常在 Kubernetes 或 Docker Swarm 中有用)。
6.1.2.8 Nacos 镜像
nacos/nacos-server:v2.5.0
- 运行 官方 Nacos 2.5.0 镜像,提供 配置管理、服务发现 及 动态配置 能力。
6.1.2.9 总结
你的 docker run
命令:
- 运行 Nacos 2.5.0,使用 standalone 模式,不需要数据库(适合开发/测试)。
- 开放端口(8848、9848、9849)用于 Web、gRPC 服务等。
- 挂载本地目录,持久化日志、数据、配置,防止容器重启后数据丢失。
- 限制 JVM 内存(256MB),适用于低资源环境。
- 使用
privileged
模式 可能有安全隐患(生产建议关闭)。 - 使用
restart=always
,确保容器异常退出后自动重启。
如果你要在 生产环境 运行,建议:
✅ 使用 cluster
模式,连接外部 MySQL 数据库。
✅ 调整 JVM 内存,建议至少 512MB~1GB
。
✅ 移除 --privileged=true
,提高安全性。
✅ 使用 Nginx 或 Spring Cloud Gateway 代理 Nacos,避免直接暴露。
7 访问nacos
http://ip地址:8848/nacos/index.html
自2.4.0版本开始,Nacos构建时不再提供管理员用户nacos的默认密码,需要在首次开启鉴权后,通过API或Nacos控制台进行管理员用户nacos的密码初始化
具体操作:官方文档
8 参考文章
- Docker部署Nacos(配置文件映射)
- Nacos开启鉴权配置
- 官方文档
二 Windows
1 拉取镜像
docker pull nacos/nacos-server:v2.5.0
2 创建存储nacos数据信息的目录
在根目录下创建/data/docker/nacos目录,用于挂载存储nacos的数据信息
mkdir -p /user/lzl/tool/docker/nacos/nacos_v2.5.0/home
3 nacos配置文件获取
3.1 提前运行一个nacos容器
目的: 把nacos容器中的配置文件拷贝到宿主机中对应的目录下
3.2 创建nacos容器
docker run -d `
--name nacos_test `
-p 8848:8848 `
-p 9848:9848 `
-p 9849:9849 `
--privileged=true `
--restart=always `
-e TZ=Asia/Shanghai `
-e LANG=en_US.UTF-8 `
-e JVM_XMS=256m `
-e JVM_XMX=256m `
-e MODE=standalone `
nacos/nacos-server:v2.5.0
3.3 拷贝容器中的数据到宿主机对应的目录下
记得提前创建相应目录
docker cp nacos_test:/home/nacos/conf D:Tooldockernacosnacos_v2.5.0home
3.4 停止&删除容器
docker rm -f nacos_test
4 修改 application.properties 配置文件
4.1 编辑配置文件
application.properties
一般主要修改下面配置文件中标红部分
推荐开启如下配置
# 开启鉴权功能
nacos.core.auth.enabled=${NACOS_AUTH_ENABLE:true}
# 关闭使用user-agent判断服务端请求并放行鉴权的功能
nacos.core.auth.enable.userAgentAuthWhite=false
# 配置自定义身份识别的key和value,这两个属性是auth的白名单,用于标识来自其它服务器的请求。
nacos.core.auth.server.identity.key=authKey
nacos.core.auth.server.identity.value=shigzh
# 自定义用于生成JWT令牌的密钥,注意:原始密钥长度不得低于32字符,且一定要进行Base64编码,否则无法启动节点。
nacos.core.auth.plugin.nacos.token.secret.key=bmFjb3NfMjAyNTAyMDJfbHpsX25hY29zX3Rlc3RfdG9rZW4=
# 权限缓存开关,开启后权限缓存的更新默认有15秒的延迟,默认 : false
nacos.core.auth.caching.enabled=true
# 数据库相关配置
spring.sql.init.platform=${SPRING_DATASOURCE_PLATFORM:mysql}
db.url.0=jdbc:mysql://${MYSQL_SERVICE_HOST:test.test}:${MYSQL_SERVICE_PORT:testPort}/${MYSQL_SERVICE_DB_NAME:testDbName}?${MYSQL_SERVICE_DB_PARAM:characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&allowPublicKeyRetrieval=true&useSSL=false}
db.user.0=${MYSQL_SERVICE_USER:root}
db.password.0=${MYSQL_SERVICE_PASSWORD:root@12345678}
需要注意的是,nacos.core.auth.enabled=${NACOS_AUTH_ENABLE:true}
这个配置在配置文件中并不存在(v2.5.0),需要自己添加
nacos.core.auth.enabled=${NACOS_AUTH_ENABLE:true}
提示1: MYSQL_SERVICE_HOST 写宿主机IP 不要写 localhost,在 Windows PowerShell 使用 ipconfig 命令查询
提示2:MYSQL_SERVICE_DB_PARAM 这个也做了修改
4.2 鉴权配置简介(参考文章 官方文档)
4.2.1 nacos开启鉴权
- 2.2.2版本之前的Nacos默认控制台,无论服务端是否开启鉴权,都会存在一个登录页,这就导致很多用户被误导认为Nacos默认是存在鉴权的。
- 在社区安全工程师的建议下,Nacos自2.2.2版本开始,在未开启鉴权时,默认控制台将不需要登录即可访问,同时在控制台中给予提示,提醒用户当前集群未开启鉴权,在用户开启鉴权后,控制台才需要进行登录访问。
- 开启鉴权功能之后,访问Nacos服务端API和控制台都需要输入用户名和密码(默认的用户名和密码都是nacos,可以登录控制台进行修改密码),可以提高Nacos的安全性,如果客户端(其它服务或者控制台用户)无法提供正确的用户名和密码,将无法访问Nacos Server,这样可以防止服务端被非授权访问,所以对于生产环境中的Nacos Server推荐设置为true。
- 如果Nacos禁用鉴权功能,此时访问Nacos服务端API和控制台不需要任何登录即可匿名访问。
4.2.2 修改nacos配置文件(application.properties)
如果 nacos.core.auth.enabled
设置为true,必须添加以下nacos.core.auth.server.identity.key
、nacos.core.auth.server.identity.value
、nacos.core.auth.plugin.nacos.token.secret.ke
y配置,否则无法启动节点。
推荐开启如下配置
# 开启鉴权功能
nacos.core.auth.enabled=true
# 关闭使用user-agent判断服务端请求并放行鉴权的功能
nacos.core.auth.enable.userAgentAuthWhite=false
# 配置自定义身份识别的key和value,这两个属性是auth的白名单,用于标识来自其它服务器的请求,具体实现见 com.alibaba.nacos.core.auth.AuthFilter。
nacos.core.auth.server.identity.key=authKey
nacos.core.auth.server.identity.value=shigzh
# 自定义用于生成JWT令牌的密钥,注意:原始密钥长度不得低于32字符,且一定要进行Base64编码,否则无法启动节点。
nacos.core.auth.plugin.nacos.token.secret.key=bmFjb3NfMjAyNTAyMDJfbHpsX25hY29zX3Rlc3RfdG9rZW4=
# 权限缓存开关,开启后权限缓存的更新默认有15秒的延迟,默认 : false
nacos.core.auth.caching.enabled=true
4.2.3 自定义生成JWT令牌的密钥
注意:原始密钥长度不得低于32字符,且一定要进行Base64编码,否则无法启动节点。
/**
*
* nacos中JWT令牌密钥生成器
* 生成 nacos.core.auth.plugin.nacos.token.secret.key 的值
*
* @author shigzh
* @since 2024/1/10 13:41
*/
public class NacosSecretUtil {
public static void main(String[] args) {
// 自定义生成JWT令牌的密钥
String nacosSecret = "nacos_20240110_shigzh_nacos_token";
// 输出密钥长度,要求不得低于32字符,否则无法启动节点。
System.out.println("密钥长度》》》" + nacosSecret.length());
// 密钥进行Base64编码
byte[] data = nacosSecret.getBytes(StandardCharsets.UTF_8);
System.out.println("密钥Base64编码》》》" + Base64Utils.encodeToString(data));
}
}
5 初始化nacos数据库
5.1 用navicat创建数据库,库名为nacos
5.2 获取数据库脚本文件
有如下3种方式进行获取
- 通过nacos容器目录
/home/nacos/conf
下获取数据库脚本文件mysql-schema.sql。 - 通过宿主机目录
/user/lzl/tool/docker/nacos/nacos_v2.5.0/home/conf
下获取数据库脚本文件mysql-schema.sql。 - 直接通过 https://www.cnblogs.com/shigzh/p/17941250 获取数据库脚本文件。
6 运行容器
6.1.1 运行命令
docker run -d `
--name nacos_v2.5.0 `
-p 8848:8848 `
-p 9848:9848 `
-p 9849:9849 `
--privileged=true `
--restart=always `
-v "D:Tooldocker
acos
acos_v2.5.0homelogs:/home/nacos/logs" `
-v "D:Tooldocker
acos
acos_v2.5.0homedata:/home/nacos/data" `
-v "D:Tooldocker
acos
acos_v2.5.0homeconf:/home/nacos/conf" `
-e "TZ=Asia/Shanghai" `
-e "LANG=en_US.UTF-8" `
-e "JVM_XMS=256m" `
-e "JVM_XMX=256m" `
-e "MODE=standalone" `
-e "PREFER_HOST_MODE=hostname" `
nacos/nacos-server:v2.5.0
7 访问nacos
http://localhost:8848/nacos/index.html
自2.4.0版本开始,Nacos构建时不再提供管理员用户nacos的默认密码,需要在首次开启鉴权后,通过API或Nacos控制台进行管理员用户nacos的密码初始化
具体操作:官方文档
8 参考文章
- Docker部署Nacos(配置文件映射)
- Nacos开启鉴权配置
- 官方文档
本文地址:https://www.vps345.com/15110.html