> 技术文档 > Linux中部署Nacos保姆级教程_linux安装nacos

Linux中部署Nacos保姆级教程_linux安装nacos

前置说明:

        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 修改前的配置

修改前的配置如下:

# springserver.servlet.contextPath=${SERVER_SERVLET_CONTEXTPATH:/nacos}server.contextPath=/nacosserver.port=${NACOS_APPLICATION_PORT:8848}server.tomcat.accesslog.max-days=30server.tomcat.accesslog.pattern=%h %l %u %t \"%r\" %s %b %D %{User-Agent}i %{Request-Source}iserver.tomcat.accesslog.enabled=${TOMCAT_ACCESSLOG_ENABLED:false}server.error.include-message=ALWAYS# default current work dirserver.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=3600nacos.cmdb.eventTaskInterval=10nacos.cmdb.labelTaskInterval=300nacos.cmdb.loadDataAtStart=falsedb.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 settingsdb.pool.config.connectionTimeout=${DB_POOL_CONNECTION_TIMEOUT:30000}db.pool.config.validationTimeout=10000db.pool.config.maximumPoolSize=20db.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 securitynacos.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 searchmanagement.metrics.export.elastic.enabled=falsemanagement.metrics.export.influx.enabled=falsenacos.naming.distro.taskDispatchThreadCount=10nacos.naming.distro.taskDispatchPeriod=200nacos.naming.distro.batchSyncKeyCount=1000nacos.naming.distro.initDataRatio=0.9nacos.naming.distro.syncRetryDelay=5000nacos.naming.data.warmup=truenacos.console.ui.enabled=truenacos.core.param.check.enabled=true

2.4.4 配置数据库后的配置

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

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

# springserver.servlet.contextPath=${SERVER_SERVLET_CONTEXTPATH:/nacos}server.contextPath=/nacosserver.port=${NACOS_APPLICATION_PORT:8848}server.tomcat.accesslog.max-days=30server.tomcat.accesslog.pattern=%h %l %u %t \"%r\" %s %b %D %{User-Agent}i %{Request-Source}iserver.tomcat.accesslog.enabled=${TOMCAT_ACCESSLOG_ENABLED:false}server.error.include-message=ALWAYS# default current work dirserver.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=3600nacos.cmdb.eventTaskInterval=10nacos.cmdb.labelTaskInterval=300nacos.cmdb.loadDataAtStart=falsespring.datasource.platform=mysqldb.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=truedb.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=rootdb.password.0=xxxx## DB connection pool settingsdb.pool.config.connectionTimeout=${DB_POOL_CONNECTION_TIMEOUT:30000}db.pool.config.validationTimeout=10000db.pool.config.maximumPoolSize=20db.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 securitynacos.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 searchmanagement.metrics.export.elastic.enabled=falsemanagement.metrics.export.influx.enabled=falsenacos.naming.distro.taskDispatchThreadCount=10nacos.naming.distro.taskDispatchPeriod=200nacos.naming.distro.batchSyncKeyCount=1000nacos.naming.distro.initDataRatio=0.9nacos.naming.distro.syncRetryDelay=5000nacos.naming.data.warmup=truenacos.console.ui.enabled=truenacos.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://:8848/nacos

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

2.6 开启鉴权模式

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

开启后的配置如下:

# springserver.servlet.contextPath=${SERVER_SERVLET_CONTEXTPATH:/nacos}server.contextPath=/nacosserver.port=${NACOS_APPLICATION_PORT:8848}server.tomcat.accesslog.max-days=30server.tomcat.accesslog.pattern=%h %l %u %t \"%r\" %s %b %D %{User-Agent}i %{Request-Source}iserver.tomcat.accesslog.enabled=${TOMCAT_ACCESSLOG_ENABLED:false}server.error.include-message=ALWAYS# default current work dirserver.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=3600nacos.cmdb.eventTaskInterval=10nacos.cmdb.labelTaskInterval=300nacos.cmdb.loadDataAtStart=falsespring.datasource.platform=mysqldb.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=truedb.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=rootdb.password.0=xxxx## DB connection pool settingsdb.pool.config.connectionTimeout=${DB_POOL_CONNECTION_TIMEOUT:30000}db.pool.config.validationTimeout=10000db.pool.config.maximumPoolSize=20db.pool.config.minimumIdle=2### The auth system to use, currently only \'nacos\' and \'ldap\' is supported:# 鉴权类型,默认为nacosnacos.core.auth.system.type=${NACOS_AUTH_SYSTEM_TYPE:nacos}### worked when nacos.core.auth.system.type=nacos### The token expiration in seconds:# 用户登陆临时accessToken的过期时间,默认18000nacos.core.auth.plugin.nacos.token.expire.seconds=${NACOS_AUTH_TOKEN_EXPIRE_SECONDS:18000}# 是否开启鉴权功能,默认为falsenacos.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 securitynacos.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 searchmanagement.metrics.export.elastic.enabled=falsemanagement.metrics.export.influx.enabled=falsenacos.naming.distro.taskDispatchThreadCount=10nacos.naming.distro.taskDispatchPeriod=200nacos.naming.distro.batchSyncKeyCount=1000nacos.naming.distro.initDataRatio=0.9nacos.naming.distro.syncRetryDelay=5000nacos.naming.data.warmup=truenacos.console.ui.enabled=truenacos.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.htmnacos.core.auth.plugin.nacos.token.secret.key=VGNteEp3MDVrJC1femN4Lik4RXRGQ15EXkYxVyFJUHI=

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

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

铝行业信息