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

修改前的配置如下:

# 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…