前置说明:

        Dokcer部署Nacos官方文档:Nacos Docker 快速开始 | Nacos 官网

一、Nacos版本说明

Nacos 1.x 版本

  • Nacos 1.1.3 :是一个相对稳定的版本,在一段时期内被广泛使用,但目前该版本已经下线,不再单独维护,建议升级至更高版本。

  • Nacos 1.2.1 :从 1.1.3 升级到 1.2.1 版本相对简单,该版本在功能和稳定性上都有一定提升,为后续升级到 2.x 版本奠定了基础。

  • Nacos 1.3.3 :在服务发现、配置管理等方面性能提升显著,如在 100k 服务实例场景下,注册耗时相比 1.2.0 降低了 75%,整体 cpu 使用率降低了 50%;在 10k 配置场景下,推送耗时相比 1.2.0 降低了 60%,整体 cpu 使用率降低了 55%。

Nacos 2.x 版本

  • Nacos 2.0.0 :相比 1.x 版本新增了 gRPC 的通信方式,需增加 2 个端口,客户端拥有相同计算逻辑,使用方式与 1.x 版本基本一致,但 2.0 客户端无法兼容 1.x 服务端。同时,Nacos 2.0 的服务端完全兼容 1.x 客户端。

  • Nacos 2.1.0 :该版本对 Nacos Server 的内存模型进行了优化,通过堆外内存技术,使配置推送耗时平均降低 60%,服务发现推送耗时平均降低 30%,集群整体吞吐量提升了一倍,并发连接数提升到了 100k,同时将堆内存占用降低了 30%。

  • Nacos 2.2.0 :引入了 v2 的 OpenAPI,并且 2.2.0 及以后版本的服务端兼容 Nacos 1.2.0 之后的所有客户端版本。

  • Nacos 2.3.2 :作为 2.3.x 分支的版本,在服务发现模块的性能测试中,99 分位的延迟保持在毫秒级,在 10W 服务实例的规模下,注册和查询的 QPS 提升了 3 倍;在配置模块的性能测试中,推送的平均耗时相比之前的版本提升了 60%,在 10W 配置的规模下,推送耗时相比之前的版本提升了 3.5 倍。

  • Nacos 3.0.1 :同步开源 3.0.1 版本,支持数据源管理功能,可帮助自动轮转应用访问数据源的密钥信息;支持 MCP Registry,能够快速将存量 API 转换成 MCP API;还支持开源控制台默认启用鉴权,以及重制开源控制台管理员密码。

版本兼容性说明

  • 与 Spring Cloud Alibaba 的兼容性 :Nacos 不同版本与 Spring Cloud Alibaba 版本有相应适配关系,例如 Spring Cloud Alibaba 2.2.9.RELEASE 对应 Nacos 2.1.0 版本,而 Spring Cloud Alibaba 2.2.0.RELEASE 对应 Nacos 1.1.4 版本等。

  • 版本升级兼容性 :从 2.2.0 版本开始,Nacos Server 的版本可以平滑升级,新的 Nacos Server 版本可以兼容老版本的 Nacos Client。如从 2.0.0 升级到 2.3.2 版本,服务端理论上可以兼容 2.0.0 的客户端,但仍需查阅官方发布的版本更新日志或升级指南,以获取确切的兼容性信息及可能的注意事项。

Nacos Server 发布历史地址:发布历史 | Nacos 官网

Nacos官网文档:Nacos 配置中心简介, Nacos 是什么 | Nacos 官网

nacos 的架构原理:Nacos架构&原理免费下载_在线阅读_藏经阁-阿里云开发者社区

本文将以Nacos2.3.2版本为例

二、安装Nacos

2.1 拉取镜像

docker pull nacos/nacos-server:v2.3.2

查看镜像:

docker images

2.2 准备宿主机目录(持久化配置)

mkdir -p /docker-nacos  # 创建Nacos的根目录

2.3 复制文件到挂载目录

需要先启动nacos镜像创建容器,才能将容器里面的相关文件复制到挂载目录。

2.3.1 简单启动nacos容器(用于将nacos容器的的相关文件复制到挂载目录)

docker run --name nacos -d -p 8848:8848 -e MODE=standalone  nacos/nacos-server:v2.3.2

2.3.2 复制容器的相关文件到挂载目录

docker cp nacos:/home/nacos/conf/ /docker-nacos
docker cp nacos:/home/nacos/logs/ /docker-nacos
docker cp nacos:/home/nacos/data/ /docker-nacos

 注意:这里copy到宿主机的目录下即可

2.3.3 删除简单启动的nacos容器

docker rm -f nacos 

2.4 配置 MySQL 数据库(可选)

Nacos如何配置数据库,见官方文档:nacos配置mysql数据库 | Nacos 官网

2.4.1创建数据库

方式一:(推荐)

  • 从Nacos的conf目录下找到mysql-schema.sql(针对Nacos 2.x版本),并使用该SQL脚本在你的MySQL数据库中创建所需的表结构。执行脚本前,请确保你连接的是正确的数据库实例。

方式二:

在Mysql中创建数据库,并执行官方SQL脚本:

https://github.com/alibaba/nacos/blob/master/distribution/conf/mysql-schema.sql

如果打不开链接,直接执行下面准备好的SQL:

/** Copyright 1999-2018 Alibaba Group Holding Ltd.** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at**      http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*//******************************************/
/*   表名称 = config_info                  */
/******************************************/
CREATE TABLE `config_info` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',`data_id` varchar(255) NOT NULL COMMENT 'data_id',`group_id` varchar(128) DEFAULT NULL COMMENT 'group_id',`content` longtext NOT NULL COMMENT 'content',`md5` varchar(32) DEFAULT NULL COMMENT 'md5',`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',`src_user` text COMMENT 'source user',`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',`tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',`c_desc` varchar(256) DEFAULT NULL COMMENT 'configuration description',`c_use` varchar(64) DEFAULT NULL COMMENT 'configuration usage',`effect` varchar(64) DEFAULT NULL COMMENT '配置生效的描述',`type` varchar(64) DEFAULT NULL COMMENT '配置的类型',`c_schema` text COMMENT '配置的模式',`encrypted_data_key` text NOT NULL COMMENT '密钥',PRIMARY KEY (`id`),UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info';/******************************************/
/*   表名称 = config_info_aggr             */
/******************************************/
CREATE TABLE `config_info_aggr` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',`data_id` varchar(255) NOT NULL COMMENT 'data_id',`group_id` varchar(128) NOT NULL COMMENT 'group_id',`datum_id` varchar(255) NOT NULL COMMENT 'datum_id',`content` longtext NOT NULL COMMENT '内容',`gmt_modified` datetime NOT NULL COMMENT '修改时间',`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',`tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',PRIMARY KEY (`id`),UNIQUE KEY `uk_configinfoaggr_datagrouptenantdatum` (`data_id`,`group_id`,`tenant_id`,`datum_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='增加租户字段';/******************************************/
/*   表名称 = config_info_beta             */
/******************************************/
CREATE TABLE `config_info_beta` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',`data_id` varchar(255) NOT NULL COMMENT 'data_id',`group_id` varchar(128) NOT NULL COMMENT 'group_id',`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',`content` longtext NOT NULL COMMENT 'content',`beta_ips` varchar(1024) DEFAULT NULL COMMENT 'betaIps',`md5` varchar(32) DEFAULT NULL COMMENT 'md5',`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',`src_user` text COMMENT 'source user',`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',`tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',`encrypted_data_key` text NOT NULL COMMENT '密钥',PRIMARY KEY (`id`),UNIQUE KEY `uk_configinfobeta_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_beta';/******************************************/
/*   表名称 = config_info_tag              */
/******************************************/
CREATE TABLE `config_info_tag` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',`data_id` varchar(255) NOT NULL COMMENT 'data_id',`group_id` varchar(128) NOT NULL COMMENT 'group_id',`tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',`tag_id` varchar(128) NOT NULL COMMENT 'tag_id',`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',`content` longtext NOT NULL COMMENT 'content',`md5` varchar(32) DEFAULT NULL COMMENT 'md5',`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',`src_user` text COMMENT 'source user',`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',PRIMARY KEY (`id`),UNIQUE KEY `uk_configinfotag_datagrouptenanttag` (`data_id`,`group_id`,`tenant_id`,`tag_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_tag';/******************************************/
/*   表名称 = config_tags_relation         */
/******************************************/
CREATE TABLE `config_tags_relation` (`id` bigint(20) NOT NULL COMMENT 'id',`tag_name` varchar(128) NOT NULL COMMENT 'tag_name',`tag_type` varchar(64) DEFAULT NULL COMMENT 'tag_type',`data_id` varchar(255) NOT NULL COMMENT 'data_id',`group_id` varchar(128) NOT NULL COMMENT 'group_id',`tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',`nid` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'nid, 自增长标识',PRIMARY KEY (`nid`),UNIQUE KEY `uk_configtagrelation_configidtag` (`id`,`tag_name`,`tag_type`),KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_tag_relation';/******************************************/
/*   表名称 = group_capacity               */
/******************************************/
CREATE TABLE `group_capacity` (`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',`group_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Group ID,空字符表示整个集群',`quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',`usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',`max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',`max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数,,0表示使用默认值',`max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',`max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',PRIMARY KEY (`id`),UNIQUE KEY `uk_group_id` (`group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='集群、各Group容量信息表';/******************************************/
/*   表名称 = his_config_info              */
/******************************************/
CREATE TABLE `his_config_info` (`id` bigint(20) unsigned NOT NULL COMMENT 'id',`nid` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'nid, 自增标识',`data_id` varchar(255) NOT NULL COMMENT 'data_id',`group_id` varchar(128) NOT NULL COMMENT 'group_id',`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',`content` longtext NOT NULL COMMENT 'content',`md5` varchar(32) DEFAULT NULL COMMENT 'md5',`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',`src_user` text COMMENT 'source user',`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',`op_type` char(10) DEFAULT NULL COMMENT 'operation type',`tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',`encrypted_data_key` text NOT NULL COMMENT '密钥',PRIMARY KEY (`nid`),KEY `idx_gmt_create` (`gmt_create`),KEY `idx_gmt_modified` (`gmt_modified`),KEY `idx_did` (`data_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='多租户改造';/******************************************/
/*   表名称 = tenant_capacity              */
/******************************************/
CREATE TABLE `tenant_capacity` (`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',`tenant_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Tenant ID',`quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',`usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',`max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',`max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数',`max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',`max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',PRIMARY KEY (`id`),UNIQUE KEY `uk_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='租户容量信息表';CREATE TABLE `tenant_info` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',`kp` varchar(128) NOT NULL COMMENT 'kp',`tenant_id` varchar(128) default '' COMMENT 'tenant_id',`tenant_name` varchar(128) default '' COMMENT 'tenant_name',`tenant_desc` varchar(256) DEFAULT NULL COMMENT 'tenant_desc',`create_source` varchar(32) DEFAULT NULL COMMENT 'create_source',`gmt_create` bigint(20) NOT NULL COMMENT '创建时间',`gmt_modified` bigint(20) NOT NULL COMMENT '修改时间',PRIMARY KEY (`id`),UNIQUE KEY `uk_tenant_info_kptenantid` (`kp`,`tenant_id`),KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='tenant_info';CREATE TABLE `users` (`username` varchar(50) NOT NULL PRIMARY KEY COMMENT 'username',`password` varchar(500) NOT NULL COMMENT 'password',`enabled` boolean NOT NULL COMMENT 'enabled'
);CREATE TABLE `roles` (`username` varchar(50) NOT NULL COMMENT 'username',`role` varchar(50) NOT NULL COMMENT 'role',UNIQUE INDEX `idx_user_role` (`username` ASC, `role` ASC) USING BTREE
);CREATE TABLE `permissions` (`role` varchar(50) NOT NULL COMMENT 'role',`resource` varchar(128) NOT NULL COMMENT 'resource',`action` varchar(8) NOT NULL COMMENT 'action',UNIQUE INDEX `uk_role_permission` (`role`,`resource`,`action`) USING BTREE
);INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE);INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN');

我们这边根据《方式一》创建一个数据库名为nacos的数据库,并执行上面的SQL:

2.4.2 修改配置文件

我们要修改/docker-nacos/conf/application.properties这个文件,首先备份一份,防止改坏了。

2.4.3 修改前的配置

修改前的配置如下:

# spring
server.servlet.contextPath=${SERVER_SERVLET_CONTEXTPATH:/nacos}
server.contextPath=/nacos
server.port=${NACOS_APPLICATION_PORT:8848}
server.tomcat.accesslog.max-days=30
server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D %{User-Agent}i %{Request-Source}i
server.tomcat.accesslog.enabled=${TOMCAT_ACCESSLOG_ENABLED:false}
server.error.include-message=ALWAYS
# default current work dir
server.tomcat.basedir=file:.
#*************** Config Module Related Configurations ***************#
### Deprecated configuration property, it is recommended to use `spring.sql.init.platform` replaced.
#spring.datasource.platform=${SPRING_DATASOURCE_PLATFORM:}
spring.sql.init.platform=${SPRING_DATASOURCE_PLATFORM:}
nacos.cmdb.dumpTaskInterval=3600
nacos.cmdb.eventTaskInterval=10
nacos.cmdb.labelTaskInterval=300
nacos.cmdb.loadDataAtStart=false
db.num=${MYSQL_DATABASE_NUM:1}
db.url.0=jdbc:mysql://${MYSQL_SERVICE_HOST}:${MYSQL_SERVICE_PORT:3306}/${MYSQL_SERVICE_DB_NAME}?${MYSQL_SERVICE_DB_PARAM:characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false}
db.user.0=${MYSQL_SERVICE_USER}
db.password.0=${MYSQL_SERVICE_PASSWORD}
## DB connection pool settings
db.pool.config.connectionTimeout=${DB_POOL_CONNECTION_TIMEOUT:30000}
db.pool.config.validationTimeout=10000
db.pool.config.maximumPoolSize=20
db.pool.config.minimumIdle=2
### The auth system to use, currently only 'nacos' and 'ldap' is supported:
nacos.core.auth.system.type=${NACOS_AUTH_SYSTEM_TYPE:nacos}
### worked when nacos.core.auth.system.type=nacos
### The token expiration in seconds:
nacos.core.auth.plugin.nacos.token.expire.seconds=${NACOS_AUTH_TOKEN_EXPIRE_SECONDS:18000}
### The default token:
nacos.core.auth.plugin.nacos.token.secret.key=${NACOS_AUTH_TOKEN:}
### Turn on/off caching of auth information. By turning on this switch, the update of auth information would have a 15 seconds delay.
nacos.core.auth.caching.enabled=${NACOS_AUTH_CACHE_ENABLE:false}
nacos.core.auth.enable.userAgentAuthWhite=${NACOS_AUTH_USER_AGENT_AUTH_WHITE_ENABLE:false}
nacos.core.auth.server.identity.key=${NACOS_AUTH_IDENTITY_KEY:}
nacos.core.auth.server.identity.value=${NACOS_AUTH_IDENTITY_VALUE:}
## spring security config
### turn off security
nacos.security.ignore.urls=${NACOS_SECURITY_IGNORE_URLS:/,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/**}
# metrics for elastic search
management.metrics.export.elastic.enabled=false
management.metrics.export.influx.enabled=false
nacos.naming.distro.taskDispatchThreadCount=10
nacos.naming.distro.taskDispatchPeriod=200
nacos.naming.distro.batchSyncKeyCount=1000
nacos.naming.distro.initDataRatio=0.9
nacos.naming.distro.syncRetryDelay=5000
nacos.naming.data.warmup=true
nacos.console.ui.enabled=true
nacos.core.param.check.enabled=true

2.4.4 配置数据库后的配置

注意:需要加上数据库的类型

修改后的配置如下(数据库信息根据自己的填):

# spring
server.servlet.contextPath=${SERVER_SERVLET_CONTEXTPATH:/nacos}
server.contextPath=/nacos
server.port=${NACOS_APPLICATION_PORT:8848}
server.tomcat.accesslog.max-days=30
server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D %{User-Agent}i %{Request-Source}i
server.tomcat.accesslog.enabled=${TOMCAT_ACCESSLOG_ENABLED:false}
server.error.include-message=ALWAYS
# default current work dir
server.tomcat.basedir=file:.
#*************** Config Module Related Configurations ***************#
### Deprecated configuration property, it is recommended to use `spring.sql.init.platform` replaced.
#spring.datasource.platform=${SPRING_DATASOURCE_PLATFORM:}
spring.sql.init.platform=${SPRING_DATASOURCE_PLATFORM:}
nacos.cmdb.dumpTaskInterval=3600
nacos.cmdb.eventTaskInterval=10
nacos.cmdb.labelTaskInterval=300
nacos.cmdb.loadDataAtStart=false
spring.datasource.platform=mysql
db.num=${MYSQL_DATABASE_NUM:1}
#  这里必须为公网或服务器内网地址,我这里是服务器的内网地址,容器内部没有mysql,绝对不能使用 127.0.0.1和localhost
#  如果nacos启动失败,Nacos Server did not start because dumpservice bean construction failure : No DataSource set
#  加上 &serverTimezone=UTC ,再不行就加上 &allowPublicKeyRetrieval=true
db.url.0=jdbc:mysql://120.27.216.193:13306/nacos?${MYSQL_SERVICE_DB_PARAM:characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false}
db.user.0=root
db.password.0=xxxx
## DB connection pool settings
db.pool.config.connectionTimeout=${DB_POOL_CONNECTION_TIMEOUT:30000}
db.pool.config.validationTimeout=10000
db.pool.config.maximumPoolSize=20
db.pool.config.minimumIdle=2
### The auth system to use, currently only 'nacos' and 'ldap' is supported:
nacos.core.auth.system.type=${NACOS_AUTH_SYSTEM_TYPE:nacos}
### worked when nacos.core.auth.system.type=nacos
### The token expiration in seconds:
nacos.core.auth.plugin.nacos.token.expire.seconds=${NACOS_AUTH_TOKEN_EXPIRE_SECONDS:18000}
### The default token:
nacos.core.auth.plugin.nacos.token.secret.key=${NACOS_AUTH_TOKEN:}
### Turn on/off caching of auth information. By turning on this switch, the update of auth information would have a 15 seconds delay.
nacos.core.auth.caching.enabled=${NACOS_AUTH_CACHE_ENABLE:false}
nacos.core.auth.enable.userAgentAuthWhite=${NACOS_AUTH_USER_AGENT_AUTH_WHITE_ENABLE:false}
nacos.core.auth.server.identity.key=${NACOS_AUTH_IDENTITY_KEY:}
nacos.core.auth.server.identity.value=${NACOS_AUTH_IDENTITY_VALUE:}
## spring security config
### turn off security
nacos.security.ignore.urls=${NACOS_SECURITY_IGNORE_URLS:/,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/**}
# metrics for elastic search
management.metrics.export.elastic.enabled=false
management.metrics.export.influx.enabled=false
nacos.naming.distro.taskDispatchThreadCount=10
nacos.naming.distro.taskDispatchPeriod=200
nacos.naming.distro.batchSyncKeyCount=1000
nacos.naming.distro.initDataRatio=0.9
nacos.naming.distro.syncRetryDelay=5000
nacos.naming.data.warmup=true
nacos.console.ui.enabled=true
nacos.core.param.check.enabled=true

2.5 启动容器

docker run -d --name nacos \
--restart=always \
-p 8848:8848 \
-p 9848:9848 \
-p 9849:9849 \
-e MODE=standalone \
-v /docker-nacos/conf/:/home/nacos/conf \
-v /docker-nacos/logs:/home/nacos/logs \
-v /docker-nacos/data:/home/nacos/data \
nacos/nacos-server:v2.3.2

命令解释:

基础命令

  • docker run:创建并启动一个新容器。

  • -d:以后台模式(detached)运行容器。

  • --name nacos:为容器指定名称 nacos(便于后续管理)。


重启策略

  • --restart=always:当容器退出时自动重启(即使宿主机重启也会重新启动容器)。


端口映射

  • -p 8848:8848:将容器内的 8848 端口(Nacos 控制台/API 端口)映射到宿主机的 8848 端口。

  • -p 9848:9848 -p 9849:9849
    Nacos 2.0+ 新增的 gRPC 通信端口(用于客户端与服务端通信),必须同时暴露:

    • 9848:服务端 Raft 协议端口。

    • 9849:客户端 gRPC 请求端口。

📌 注意:若使用 Nacos 2.x 客户端,必须开放 9848/9849 端口,否则客户端无法连接。


运行模式

  • -e MODE=standalone:设置环境变量,指定以单机模式运行(无需集群,适合开发/测试)。


数据卷挂载(持久化数据)

将容器内目录映射到宿主机路径,防止容器销毁后数据丢失:

  • -v /docker-nacos/conf/:/home/nacos/conf
    挂载配置文件目录(如 application.properties)。

  • -v /docker-nacos/logs:/home/nacos/logs
    挂载日志目录

  • -v /docker-nacos/data:/home/nacos/data
    挂载数据目录(服务注册信息、配置数据等)。

💡 确保宿主机目录已创建(如 mkdir -p /docker-nacos/{conf,logs,data})。


镜像信息

  • nacos/nacos-server:v2.3.2
    使用官方镜像的 v2.3.2 版本(Nacos 2.x 系列)。

查看日志可以看到Nacos正常启动:

接下来我们访问一下地址,发现地址也能正常访问,访问的地址是:Nacos

http://<服务器的 IP 地址>:8848/nacos

由于我们没有开启鉴权模式,所以就直接进入了,没有输入用户名和密码。

2.6 开启鉴权模式

 nacos2.0.0以上的版本需要开启鉴权,详情看这里:配置鉴权 | Nacos 官网

开启后的配置如下:

# spring
server.servlet.contextPath=${SERVER_SERVLET_CONTEXTPATH:/nacos}
server.contextPath=/nacos
server.port=${NACOS_APPLICATION_PORT:8848}
server.tomcat.accesslog.max-days=30
server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D %{User-Agent}i %{Request-Source}i
server.tomcat.accesslog.enabled=${TOMCAT_ACCESSLOG_ENABLED:false}
server.error.include-message=ALWAYS
# default current work dir
server.tomcat.basedir=file:.
#*************** Config Module Related Configurations ***************#
### Deprecated configuration property, it is recommended to use `spring.sql.init.platform` replaced.
#spring.datasource.platform=${SPRING_DATASOURCE_PLATFORM:}
spring.sql.init.platform=${SPRING_DATASOURCE_PLATFORM:}
nacos.cmdb.dumpTaskInterval=3600
nacos.cmdb.eventTaskInterval=10
nacos.cmdb.labelTaskInterval=300
nacos.cmdb.loadDataAtStart=false
spring.datasource.platform=mysql
db.num=${MYSQL_DATABASE_NUM:1}
#  这里必须为公网或服务器内网地址,我这里是服务器的内网地址,容器内部没有mysql,绝对不能使用 127.0.0.1和localhost
#  如果nacos启动失败,Nacos Server did not start because dumpservice bean construction failure : No DataSource set
#  加上 &serverTimezone=UTC ,再不行就加上 &allowPublicKeyRetrieval=true
db.url.0=jdbc:mysql://120.27.216.193:13306/nacos?${MYSQL_SERVICE_DB_PARAM:characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false}
db.user.0=root
db.password.0=xxxx
## DB connection pool settings
db.pool.config.connectionTimeout=${DB_POOL_CONNECTION_TIMEOUT:30000}
db.pool.config.validationTimeout=10000
db.pool.config.maximumPoolSize=20
db.pool.config.minimumIdle=2
### The auth system to use, currently only 'nacos' and 'ldap' is supported:
# 鉴权类型,默认为nacos
nacos.core.auth.system.type=${NACOS_AUTH_SYSTEM_TYPE:nacos}
### worked when nacos.core.auth.system.type=nacos
### The token expiration in seconds:
# 用户登陆临时accessToken的过期时间,默认18000
nacos.core.auth.plugin.nacos.token.expire.seconds=${NACOS_AUTH_TOKEN_EXPIRE_SECONDS:18000}# 是否开启鉴权功能,默认为false
nacos.core.auth.enabled=true### The default token:
# Base64加密前密码  TcmxJw05k$-_zcx.)8EtFC^D^F1W!IPr
# Base64加密后密码  VGNteEp3MDVrJC1femN4Lik4RXRGQ15EXkYxVyFJUHI=
# 加密网站:https://www.qqxiuzi.cn/bianma/base64.htm
# 自定义密钥,在自定义密钥时,推荐将配置项设置为Base64编码的字符串,且原始密钥长度不得低于32字符。
nacos.core.auth.plugin.nacos.token.secret.key=VGNteEp3MDVrJC1femN4Lik4RXRGQ15EXkYxVyFJUHI=
# 默认鉴权插件用于生成用户登陆临时accessToken所使用的密钥,在2.2.0.1后无默认值,必须执行此变更,否则无法启动;其他版本为建议设置。
nacos.core.auth.plugin.nacos.token.secret.key=VGNteEp3MDVrJC1femN4Lik4RXRGQ15EXkYxVyFJUHI=
### Turn on/off caching of auth information. By turning on this switch, the update of auth information would have a 15 seconds delay.
nacos.core.auth.caching.enabled=${NACOS_AUTH_CACHE_ENABLE:false}
# 关闭使用user-agent判断服务端请求并放行鉴权的功能
nacos.core.auth.enable.userAgentAuthWhite=${NACOS_AUTH_USER_AGENT_AUTH_WHITE_ENABLE:false}
# 用于替换useragent白名单的身份识别key,不可为空,2.2.1后无默认值
# 这两个属性是鉴权的白名单,用于识别来自其他服务器的请求。鉴权开启时,这两个参数必须配置,否则会报错
nacos.core.auth.server.identity.key=nacosKey
# 用于替换useragent白名单的身份识别value,不可为空,2.2.1后无默认值
nacos.core.auth.server.identity.value=nacosValue
## spring security config
### turn off security
nacos.security.ignore.urls=${NACOS_SECURITY_IGNORE_URLS:/,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/**}
# metrics for elastic search
management.metrics.export.elastic.enabled=false
management.metrics.export.influx.enabled=false
nacos.naming.distro.taskDispatchThreadCount=10
nacos.naming.distro.taskDispatchPeriod=200
nacos.naming.distro.batchSyncKeyCount=1000
nacos.naming.distro.initDataRatio=0.9
nacos.naming.distro.syncRetryDelay=5000
nacos.naming.data.warmup=true
nacos.console.ui.enabled=true
nacos.core.param.check.enabled=true

重启Nacos:

docker restart nacos

访问Nacos:

当我们按下回车后:

按下回车后,URL会自动补全,而且登录进去后,重新退出来,发现URL变成了http://121.40.159.231:8848/nacos/#/login,没有那个权限不足的弹窗了

以上问题的原因,怀疑是不是nacos-2.3.2这个版本有bug,因为官方说从 nacos-2.2.1版本之后,配置文件里面的auth相关的用户认证的参数需要自己填写值,这个地址:配置鉴权 | Nacos 官网 说明了认证相关的参数怎么配置。

2.7 测试是否持久化到数据库

2.7.1 默认账号密码登录

使用默认账号:nacos  密码:nacos 进行登录:

登录成功:

nacos在数据库存储的加密后为(采用BCrypt 加密算法):$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu

2.7.2 修改密码测试

把密码修改为(未加密前的密码为66666):$2a$10$IhZOFRuMO92LE4/XXL10nuquJJqLiz1mUXxG1JNGGABYTuASKqru2

使用nacos 66666 进行登录:

登录成功:

2.7.3 添加用户测试

数据库也成功持久化:

2.8 踩坑日记

通过上面的配置+命令启动Nacos,发现Nacos一直在重启,并且报错:

从错误日志中可以看出,Nacos 启动失败的核心原因是 JWT 密钥配置问题

问题原因分析

  1. 开启鉴权但缺少密钥

    • 您设置了 -e NACOS_AUTH_ENABLE=true 开启了安全鉴权

    • 但未提供必要的 JWT 密钥配置

  2. Nacos 的密钥要求

    • 密钥长度必须 ≥32 字节(256 位)

    • 密钥必须经过 Base64 编码

    • 参考文档:配置鉴权 | Nacos 官网

查看我们的配置文件,发现确实没有填入对应的密钥:

加入对应的密钥:

### The default token:
# Base64加密前密码  TcmxJw05k$-_zcx.)8EtFC^D^F1W!IPr
# Base64加密后密码  VGNteEp3MDVrJC1femN4Lik4RXRGQ15EXkYxVyFJUHI=
# 加密网站:https://www.qqxiuzi.cn/bianma/base64.htm
nacos.core.auth.plugin.nacos.token.secret.key=VGNteEp3MDVrJC1femN4Lik4RXRGQ15EXkYxVyFJUHI=

改为配置重启后就正常启动了:

其他踩坑问题可以见文章:在docker中安装nacos,很详细_docker安装nacos-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/912418.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/912418.shtml
英文地址,请注明出处:http://en.pswp.cn/news/912418.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

战神授权后台报错:Parse error: syntax error, unexpected end of file in解决办法

问题现象分析 当您在战神授权后台遇到"Parse error: syntax error, unexpected end of file"这个错误时&#xff0c;说明PHP解析器在解析脚本文件时遇到了意外结束的情况。这种错误通常发生在PHP代码结构不完整时&#xff0c;比如缺少闭合的大括号、分号或者PHP结束…

HTML<span>元素详解

HTML<span>元素详解 <span> 是 HTML 中最常用的内联(inline)容器元素&#xff0c;用于对文档中的部分文本或内容进行标记和样式化。 一、基本语法 <span>内容</span>二、主要特点 内联元素&#xff1a;不会独占一行&#xff0c;只占据内容所需宽度无…

vscode ssh远程连接到Linux并实现免密码登录

vscode ssh远程连接到Linux并实现免密码登录 文章目录 vscode ssh远程连接到Linux并实现免密码登录一、安装VSCode扩展二、Linux侧工作三、连接四、实现免密登录 一、安装VSCode扩展 扩展一栏搜索remote找到Remote Development插件直接点击Install安装即可 二、Linux侧工作 U…

超级详细 的 Apache Camel 教程

前言 通过本教程学习 Apache Camel 的基础知识并在 Spring Boot 项目上创建您的第一个 Camel。 想开始使用Apache Camel吗&#xff1f;这是我关于这个流行的 Java 集成框架的教程。 我为完整的初学者编写了这个 Apache Camel 教程。它向您介绍了 Camel 的核心概念&#xff0c;并…

使用GithubActions和腾讯CloudBase自动发布静态网页

腾讯 CloudBase 可以用于托管静态网站&#xff0c;服务开通之后&#xff0c;使用 CloudBase CLI 可以将本地静态网站上传到 CloudBase&#xff0c;并生成相应的访问域名。 配置 Workflow 创建 .github/workflows/deploy.yml 文件, 编辑内容如下&#xff1a; name: Deploy to…

《聊一聊ZXDoc》之汽车标定、台架标定、三高标定

ZXDoc支持XCP/CCP标定功能&#xff0c;标定工作贯穿主机厂与Tier1厂商汽车ECU研发、生产、测试的整个流程&#xff0c;是保障ECU性能达标、功能稳定的关键。 什么是XCP/CCP标定&#xff1f; XCP/CCP标定是汽车电子领域用于ECU标定和测量的核心通信协议&#xff0c;由ASAM组织…

【目标检测】评估指标详解:Precision/Recall/F1-Score

&#x1f9d1; 博主简介&#xff1a;曾任某智慧城市类企业算法总监&#xff0c;目前在美国市场的物流公司从事高级算法工程师一职&#xff0c;深耕人工智能领域&#xff0c;精通python数据挖掘、可视化、机器学习等&#xff0c;发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…

【unity游戏开发——网络】网络协议、TCP vs UDP 本质区别

注意&#xff1a;考虑到热更新的内容比较多&#xff0c;我将热更新的内容分开&#xff0c;并全部整合放在【unity游戏开发——网络】专栏里&#xff0c;感兴趣的小伙伴可以前往逐一查看学习。 文章目录 一、网络协议概述二、OSI七层模型三、TCP/IP四层模型四、核心传输协议对比…

Spark Streaming 与 Flink 实时数据处理方案对比与选型指南

Spark Streaming 与 Flink 实时数据处理方案对比与选型指南 实时数据处理在互联网、电商、物流、金融等领域均有大量应用&#xff0c;面对海量流式数据&#xff0c;Spark Streaming 和 Flink 成为两大主流开源引擎。本文基于生产环境需求&#xff0c;从整体架构、编程模型、容…

鸿蒙HarmonyOS 5小游戏实践:记忆翻牌(附:源代码)

记忆翻牌游戏是一款经典的益智游戏&#xff0c;它能有效锻炼玩家的记忆力和观察能力。本文将详细介绍如何使用鸿蒙&#xff08;HarmonyOS&#xff09;的ArkUI框架开发一款完整的记忆翻牌游戏&#xff0c;涵盖游戏设计、核心逻辑实现和界面构建的全过程。 游戏设计概述 记忆翻牌…

【Linux庖丁解牛】— 文件系统!

1 引⼊"块"概念 其实硬盘是典型的“块”设备&#xff0c;操作系统读取硬盘数据的时候&#xff0c;其实是不会⼀个个扇区地读取&#xff0c;这样 效率太低&#xff0c;⽽是⼀次性连续读取多个扇区&#xff0c;即⼀次性读取⼀个”块”&#xff08;block&#xff09;。…

如何通过自动化减少重复性工作

通过自动化减少重复性工作的关键策略包括&#xff1a;1、识别可被规则化操作的任务、2、引入RPA&#xff08;机器人流程自动化&#xff09;工具、3、整合AI与业务流程系统、4、部署脚本与低代码平台、5、持续优化自动化场景与效率。 其中&#xff0c;“引入RPA工具”被广泛认为…

知识变现全链路设计:从IP打造到商业闭环的系统方法论|创客匠人

一、变现低效根源&#xff1a;碎片化努力为何换不来持续增长&#xff1f; 创客匠人服务上千位知识创业者后发现&#xff0c;变现乏力多因缺乏系统设计&#xff1a;某营销专家的课程因定位模糊、表达生硬、渠道单一&#xff0c;低价仍少有人问。文档中提出的“六大超级设计公式…

如何利用人工智能大模型提升流量质量

摘要 流量质量是衡量数字化营销效果的重要指标之一&#xff0c;它反映了用户对网站或应用的兴趣和满意度。流量质量的常用评估方法有点击率、跳出率和用户停留时间等。本文将介绍如何利用人工智能大模型来分析和优化这些指标&#xff0c;提高流量质量&#xff0c;从而提升数字…

从单体架构到微服务:微服务架构演进与实践

一、单体架构的困境与演进 &#xff08;一&#xff09;单体应用的初始优势与演进路径 在系统发展的初期&#xff0c;单体架构凭借其简单性和开发效率成为首选。单体应用将整个系统的所有功能模块整合在一个项目中&#xff0c;以单一进程的方式运行&#xff0c;特别适合小型系…

Elasticsearch 自定义排序:使用 Painless 脚本实现复杂排序逻辑

需求背景&#xff1a; 从es查询数据出来的时候&#xff0c;要求type为CATALOG的数据排在最前面&#xff0c;也就是目录类型的要放在最前面&#xff0c;而且要求按照层级排序&#xff0c;从L1到L5顺序排序 直接上解法&#xff1a; {//查询条件"query": {"bool…

华为云Flexus+DeepSeek征文|华为云数字人 + DeepSeek:智能交互的革命性突破

目录 前言 关于华为云数字人和云服务 1、华为云数字人 &#xff08;1&#xff09;MetaStudio介绍 &#xff08;2&#xff09;应用场景 &#xff08;3&#xff09;功能特性 &#xff08;4&#xff09;使用体验 2、华为云云服务 华为云数字人结合DeepSeek的核心流程 1、…

【GESP】C++四级练习 luogu-P5729 【深基5.例7】工艺品制作

GESP C四级练习&#xff0c;二维/多维数组练习&#xff0c;难度★★☆☆☆。 题目题解详见&#xff1a;【GESP】C四级练习 luogu-P5729 【深基5.例7】工艺品制作 | OneCoder 【GESP】C四级练习 luogu-P5729 【深基5.例7】工艺品制作 | OneCoderGESP C四级练习&#xff0c;二维…

通过npm install -g yarn安装Yarn显示Proxy代理相关问题如何解决?

手动下载yarn.msi安装包或者yarn.js文件 参考&#xff1a;windows 怎么下载yarn安装包并将下载的yarn文件移动到全局目录并添加执行权限&#xff1f;-CSDN博客

arm交叉编译qt应用中含opengl问题解决

问题是采用正点原子方案中&#xff0c;用虚拟机交叉编译含opengl的qt程序会出现编译失败问题&#xff0c;因为正点原子中的交叉编译qt源码时没有编opengl。 野火似乎有解决&#xff1a; https://doc.embedfire.com/linux/rk356x/Qt/zh/latest/lubancat_qt/install/install_arm…