Nacos Server 鏡像 Docker 部署完整教程
一、關于 Nacos Server:它是什么?能做什么?
Nacos(全稱為 Dynamic Naming and Configuration Service,即動態命名與配置服務)是阿里巴巴開源的一款 微服務核心組件,專門解決微服務架構中兩個核心痛點:服務發現 和 配置管理,同時還支持服務健康檢查、動態路由等能力,是微服務體系里的“基礎設施管家”。
咱們用大白話解釋它的核心作用,結合實際場景更易理解:
1. 核心功能一:服務發現——讓微服務“找到彼此”
在微服務架構里,一個系統會拆成多個小服務(比如“用戶服務”“訂單服務”“支付服務”),這些服務可能部署在不同的服務器上,IP 和端口還可能動態變化(比如服務擴容、重啟)。
如果“訂單服務”需要調用“支付服務”,它怎么知道“支付服務”當前的地址?這就需要 Nacos 來當“通訊錄”:
- 每個服務啟動后,會主動向 Nacos 注冊自己的 IP、端口、服務名(比如“pay-service”);
- 當“訂單服務”需要調用“支付服務”時,直接向 Nacos 問:“當前有哪些‘pay-service’可用?”;
- Nacos 會返回所有健康的“支付服務”地址,“訂單服務”直接用這些地址發起調用。
這樣一來,服務之間不用硬編碼對方的 IP,就算服務地址變了,也不用修改代碼,Nacos 會自動同步最新信息——這就是“服務發現”的核心價值。
2. 核心功能二:配置管理——讓配置“動態生效,不用重啟服務”
傳統項目里,配置文件(比如數據庫地址、接口超時時間、日志級別)都是寫死在代碼里或本地文件里的。如果要修改配置(比如切換測試/生產數據庫),必須改配置文件、重新打包、重啟服務——這在生產環境中非常麻煩(比如凌晨改配置,重啟服務可能導致幾秒不可用)。
Nacos 的“配置管理”能解決這個問題:
- 把所有服務的配置(按“服務名+環境”分類,比如“user-service-dev”“order-service-prod”)統一存到 Nacos 服務器;
- 服務啟動時,主動從 Nacos 拉取自己的配置;
- 當需要修改配置時,直接在 Nacos 控制臺改,Nacos 會主動把新配置推送給對應的服務;
- 服務收到新配置后,不用重啟就能立即生效(前提是代碼里做了簡單適配,Nacos 提供現成的 SDK 支持)。
比如你要調整“訂單服務”的接口超時時間,只需在 Nacos 改個數值,10 秒內所有“訂單服務”實例就會用新的超時時間,全程不用停服務——這就是“動態配置”的魅力。
3. 其他實用能力
- 服務健康檢查:Nacos 會定期檢測已注冊的服務(比如發心跳包),如果某個服務實例掛了,會立即從“通訊錄”里移除,避免其他服務調用到故障實例;
- 命名空間隔離:可以按“環境”(開發/測試/生產)或“項目”創建命名空間,不同命名空間的服務和配置完全隔離,比如“dev 環境的服務不會調用到 prod 環境的服務”;
- 集群支持:Nacos 自身可以部署成集群,保證高可用(就算其中一臺 Nacos 服務器掛了,其他節點還能正常工作)。
簡單說:如果你的項目是微服務架構,或者需要動態管理配置、避免重啟服務,Nacos 就是必須掌握的工具;就算是單體項目,用它管理配置也能大幅提升運維效率。
二、準備工作:安裝 Docker 和 Docker Compose
Nacos 部署依賴 Docker 環境,如果你的 Linux 服務器還沒裝 Docker,直接用下面的 一鍵安裝腳本(支持 CentOS、Ubuntu、Debian 等主流發行版),能自動裝 Docker、Docker Compose,還會配置軒轅鏡像加速(拉取鏡像更快)。
執行一鍵安裝命令
登錄 Linux 服務器,直接復制粘貼下面的命令,回車執行(過程中會提示輸入密碼,輸服務器密碼即可):
bash <(wget -qO- https://xuanyuan.cloud/docker.sh)
驗證安裝是否成功
安裝完成后,執行下面兩個命令,能看到版本信息就說明裝好了:
# 驗證 Docker 是否正常
docker --version
# 驗證 Docker Compose 是否正常
docker compose --version
示例輸出(版本號可能不同,只要不報錯就行):
Docker version 26.0.0, build 2ae903e
Docker Compose version v2.25.0
三、拉取 Nacos Server 鏡像
咱們從 軒轅鏡像倉庫(速度快,不用FQ)拉取 Nacos 鏡像,提供兩種拉取方式,新手推薦“免登錄方式”,簡單無門檻。
3.1 查看鏡像信息
軒轅鏡像倉庫的 Nacos 地址:https://xuanyuan.cloud/r/nacos/nacos-server
里面能看到鏡像的最新版本、拉取命令等信息,咱們這里用穩定版 2.0.2(官方示例常用版本,兼容性好)。
3.2 免登錄拉取(推薦,新手首選)
直接執行下面的命令,拉取鏡像并重命名為“nacos/nacos-server:2.0.2”(符合官方命名習慣,后續命令更簡潔):
# 拉取軒轅鏡像,并重命名,刪除臨時標簽
docker pull xxx.xuanyuan.run/nacos/nacos-server:2.0.2 \
&& docker tag xxx.xuanyuan.run/nacos/nacos-server:2.0.2 nacos/nacos-server:2.0.2 \
&& docker rmi xxx.xuanyuan.run/nacos/nacos-server:2.0.2
命令解釋:
docker pull:從軒轅倉庫拉取鏡像,速度比 Docker Hub 快;docker tag:把拉取的鏡像重命名為官方標準名“nacos/nacos-server:2.0.2”,后續啟動容器時不用記長地址;docker rmi:刪除拉取時的臨時標簽(xuanyuan.cloud/...),避免占用額外存儲空間。
3.3 登錄驗證拉取(可選,適合企業環境)
如果你的環境要求登錄鏡像倉庫,先執行登錄命令(按提示輸入軒轅倉庫的賬號密碼):
docker login xuanyuan.cloud
登錄成功后,再拉取鏡像:
docker pull xxx.xuanyuan.run/nacos/nacos-server:2.0.2
# 同樣重命名(可選,但推薦)
docker tag xxx.xuanyuan.run/nacos/nacos-server:2.0.2 nacos/nacos-server:2.0.2
3.4 驗證鏡像是否拉取成功
執行下面的命令,查看本地鏡像列表:
docker images | grep nacos-server
如果輸出類似下面的內容,說明拉取成功:
nacos/nacos-server 2.0.2 96a502e3027e 2 years ago 1.05GB
四、Nacos Server 部署方案:3 種場景全覆蓋
根據你的需求(測試/生產、單機/集群),咱們提供 4 種部署方案,從簡單到復雜,你可以按需選擇。
方案 1:快速部署(單機模式,適合測試/學習)
這種方式最簡單,用 Nacos 內置的 Derby 數據庫(無需額外裝 MySQL),啟動后直接用,缺點是數據存在容器內,容器刪除后數據會丟失——僅適合測試,不適合生產。
執行啟動命令
# 啟動 Nacos 容器,命名為 nacos-test,單機模式(MODE=standalone)
docker run -d \
--name nacos-test \
-p 8848:8848 \ # Nacos 默認端口:8848(記住這個端口,后續訪問控制臺用)
-e MODE=standalone \ # 關鍵參數:單機模式(standalone)
-e JVM_XMS=512m \ # JVM 初始內存(根據服務器配置調整,512m 足夠測試)
-e JVM_XMX=512m \ # JVM 最大內存
-e JVM_XMN=256m \ # JVM 新生代內存
nacos/nacos-server:2.0.2
驗證啟動是否成功
-
先查看容器狀態,確保“STATUS”是“Up”:
docker ps | grep nacos-test成功輸出示例:
a1b2c3d4e5f6 nacos/nacos-server:2.0.2 "bin/docker-startup.…" 10 seconds ago Up 9 seconds 0.0.0.0:8848->8848/tcp nacos-test -
訪問 Nacos 控制臺(關鍵驗證步驟):
打開瀏覽器,輸入地址:http://你的服務器IP:8848/nacos
比如服務器 IP 是 192.168.1.100,就訪問http://192.168.1.100:8848/nacos。會看到登錄頁,默認賬號密碼都是 nacos(輸入后登錄):
登錄后能看到控制臺首頁,說明部署成功。
停止/刪除測試容器
如果只是測試,用完后可以停止或刪除容器:
# 停止容器
docker stop nacos-test
# (可選)刪除容器(數據會丟失)
docker rm nacos-test
方案 2:掛載目錄部署(單機+MySQL,適合生產環境)
生產環境需要 數據持久化(容器刪除后數據不丟),所以要搭配 MySQL 數據庫(Nacos 的配置和服務信息存在 MySQL 里),同時掛載宿主機目錄到容器,實現“配置持久化”“日志分離”——這是企業里最常用的單機部署方式。
前置準備:安裝 MySQL(如果已有 MySQL 可跳過)
如果你的服務器還沒有 MySQL,用 Docker 快速裝一個(MySQL 5.7 或 8.0 都可以,Nacos 1.3.1 后支持 MySQL 8.0,且兼容 5.7):
# 啟動 MySQL 5.7 容器,命名為 nacos-mysql,設置root密碼為 123456
docker run -d \
--name nacos-mysql \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \ # 數據庫root密碼,生產環境要改復雜點
-e MYSQL_DATABASE=nacos_config \ # 自動創建 Nacos 專用數據庫:nacos_config
-v /data/nacos/mysql:/var/lib/mysql \ # 掛載 MySQL 數據目錄,持久化數據
mysql:5.7
步驟 1:初始化 Nacos 數據庫腳本
Nacos 需要在 MySQL 中創建表結構和初始數據,有兩種方式:
方式 1:手動執行腳本(推薦,清晰可控)
-
先進入 MySQL 容器:
docker exec -it nacos-mysql mysql -uroot -p123456(輸入后會進入 MySQL 命令行,提示符變成
mysql>) -
執行 Nacos 官方初始化腳本(直接復制粘貼到 MySQL 命令行,回車執行):
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(255) DEFAULT NULL, `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, `tenant_id` varchar(128) DEFAULT '' COMMENT '租戶字段', `c_desc` varchar(256) DEFAULT NULL, `c_use` varchar(64) DEFAULT NULL, `effect` varchar(64) DEFAULT NULL, `type` varchar(64) DEFAULT NULL, `c_schema` text, 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'; 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(255) 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 '修改時間', `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='增加租戶字段'; 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 '租戶字段', 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'; 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 '租戶字段', `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'; 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 '租戶字段', `nid` bigint(20) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`nid`), UNIQUE KEY `uk_configtagrelation_configtag` (`data_id`,`group_id`,`tenant_id`,`tag_name`,`tag_type`), KEY `idx_tenant_id` (`tenant_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_tags_relation'; 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 '修改時間', `tenant_id` varchar(128) DEFAULT '' COMMENT '租戶字段', PRIMARY KEY (`id`), UNIQUE KEY `uk_group_id_tenant_id` (`group_id`,`tenant_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='集群、分組、租戶容量信息表'; CREATE TABLE `his_config_info` ( `id` bigint(64) unsigned NOT NULL, `nid` bigint(20) NOT NULL AUTO_INCREMENT, `data_id` varchar(255) NOT NULL, `group_id` varchar(128) NOT NULL, `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name', `content` longtext NOT NULL, `md5` varchar(32) DEFAULT NULL, `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `src_user` text, `src_ip` varchar(50) DEFAULT NULL, `op_type` char(10) DEFAULT NULL, `tenant_id` varchar(128) DEFAULT '' COMMENT '租戶字段', PRIMARY KEY (`nid`), KEY `idx_gmt_modified` (`gmt_modified`), KEY `idx_did` (`data_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='多租戶改造'; 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 '單個聚合數據的子配置大小上限,單位為字節', `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' ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='users'; CREATE TABLE `roles` ( `username` varchar(50) NOT NULL COMMENT 'username', `role` varchar(50) NOT NULL COMMENT 'role', UNIQUE KEY `uk_username_role` (`username`,`role`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='roles'; CREATE TABLE `permissions` ( `role` varchar(50) NOT NULL COMMENT 'role', `resource` varchar(255) NOT NULL COMMENT 'resource', `action` varchar(8) NOT NULL COMMENT 'action', UNIQUE KEY `uk_role_resource_action` (`role`,`resource`,`action`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='permissions'; INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE); INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN'); -
執行完后,輸入
exit退出 MySQL 命令行。
方式 2:掛載腳本自動執行(適合批量部署)
如果嫌手動執行麻煩,可以把上面的腳本保存為 nacos-mysql.sql,然后掛載到 MySQL 容器的 /docker-entrypoint-initdb.d/ 目錄(MySQL 會自動執行該目錄下的 .sql 文件):
# 1. 在宿主機創建腳本目錄
mkdir -p /data/nacos/init-sql
# 2. 把上面的 SQL 腳本保存到 /data/nacos/init-sql/nacos-mysql.sql
# 3. 重啟 MySQL 容器(如果已啟動,先停止再啟動,帶上掛載參數)
docker stop nacos-mysql
docker rm nacos-mysql
docker run -d \
--name nacos-mysql \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-e MYSQL_DATABASE=nacos_config \
-v /data/nacos/mysql:/var/lib/mysql \
-v /data/nacos/init-sql:/docker-entrypoint-initdb.d \ # 掛載初始化腳本目錄
mysql:5.7
步驟 2:啟動 Nacos 容器(掛載目錄+關聯 MySQL)
先在宿主機創建 Nacos 所需的掛載目錄(用于存放配置、日志):
# 創建配置、日志目錄(/data/nacos 是根目錄,可根據需求修改)
mkdir -p /data/nacos/{conf,logs}
然后執行啟動命令(關鍵參數已標注解釋):
docker run -d \
--name nacos-prod \ # 容器名,生產環境建議用“nacos-prod”區分
-p 8848:8848 \ # Nacos 核心端口
-p 9848:9848 \ # Nacos 客戶端連接端口(2.0+版本新增,必須映射)
-p 9849:9849 \ # Nacos 客戶端連接端口(2.0+版本新增,必須映射)
-e MODE=standalone \ # 單機模式
-e SPRING_DATASOURCE_PLATFORM=mysql \ # 啟用 MySQL 作為數據源(關鍵參數)
-e MYSQL_SERVICE_HOST=192.168.1.100 \ # 你的 MySQL 服務器 IP(如果 MySQL 在同一臺機器,填宿主機IP,不要填127.0.0.1)
-e MYSQL_SERVICE_PORT=3306 \ # MySQL 端口(默認3306)
-e MYSQL_SERVICE_DB_NAME=nacos_config \ # Nacos 專用數據庫名(和前面創建的一致)
-e MYSQL_SERVICE_USER=root \ # MySQL 用戶名
-e MYSQL_SERVICE_PASSWORD=123456 \ # MySQL 密碼(和前面設置的一致)
-e MYSQL_DATABASE_NUM=1 \ # 數據庫實例數量(默認1,不用改)
-e JVM_XMS=1g \ # JVM 初始內存(生產環境建議1g,根據服務器內存調整)
-e JVM_XMX=1g \ # JVM 最大內存(和初始內存一致,避免頻繁GC)
-e JVM_XMN=512m \ # JVM 新生代內存
-v /data/nacos/conf:/home/nacos/conf \ # 掛載 Nacos 配置目錄(持久化配置)
-v /data/nacos/logs:/home/nacos/logs \ # 掛載 Nacos 日志目錄(方便查看日志)
--restart=always \ # 容器退出后自動重啟(生產環境必備,保障高可用)
nacos/nacos-server:2.0.2
步驟 3:驗證部署(和方案1一致)
- 查看容器狀態:
docker ps | grep nacos-prod,確保“STATUS”是“Up”; - 訪問控制臺:
http://服務器IP:8848/nacos,用nacos/nacos登錄; - (可選)驗證數據持久化:在控制臺創建一個配置(比如 dataId 為“test.conf”,內容為“test=123”),然后停止并刪除 Nacos 容器,重新啟動后,登錄控制臺查看配置是否還在——如果在,說明數據已持久化到 MySQL。
方案 3:Docker Compose 部署(單機+MySQL,簡化運維)
如果覺得手動啟動 Nacos 和 MySQL 太麻煩,可以用 docker-compose.yml 文件統一管理兩個容器,實現“一鍵啟動/停止”,適合運維人員或需要頻繁部署的場景。
步驟 1:創建 docker-compose.yml 文件
在宿主機創建一個目錄(比如 /data/nacos-compose),然后在該目錄下創建 docker-compose.yml 文件:
version: '3.8' # Docker Compose 版本(根據你的 Docker 版本調整,3.8 兼容大部分版本)
services:
# MySQL 服務(Nacos 數據源)
nacos-mysql:
image: mysql:5.7 # MySQL 鏡像版本
container_name: nacos-mysql # 容器名
restart: always # 自動重啟
environment:
MYSQL_ROOT_PASSWORD: 123456 # MySQL root 密碼
MYSQL_DATABASE: nacos_config # 自動創建 Nacos 數據庫
volumes:
- ./mysql:/var/lib/mysql # 掛載 MySQL 數據目錄(相對路徑,和 yml 同目錄)
- ./init-sql:/docker-entrypoint-initdb.d # 掛載初始化腳本目錄(自動執行 SQL)
ports:
- "3306:3306" # 端口映射
networks:
- nacos-network # 加入自定義網絡(避免端口沖突)
# Nacos Server 服務
nacos-server:
image: nacos/nacos-server:2.0.2 # Nacos 鏡像版本
container_name: nacos-server # 容器名
restart: always # 自動重啟
depends_on:
- nacos-mysql # 依賴 MySQL 服務,確保 MySQL 先啟動
environment:
MODE: standalone # 單機模式
SPRING_DATASOURCE_PLATFORM: mysql # 啟用 MySQL 數據源
MYSQL_SERVICE_HOST: nacos-mysql # MySQL 服務名(因為在同一網絡,可直接用容器名訪問,不用填 IP)
MYSQL_SERVICE_PORT: 3306 # MySQL 端口
MYSQL_SERVICE_DB_NAME: nacos_config # 數據庫名
MYSQL_SERVICE_USER: root # MySQL 用戶名
MYSQL_SERVICE_PASSWORD: 123456 # MySQL 密碼
JVM_XMS: 1g # JVM 內存配置
JVM_XMX: 1g
JVM_XMN: 512m
volumes:
- ./nacos/conf:/home/nacos/conf # 掛載 Nacos 配置目錄
- ./nacos/logs:/home/nacos/logs # 掛載 Nacos 日志目錄
ports:
- "8848:8848" # Nacos 核心端口
- "9848:9848" # Nacos 客戶端端口(2.0+ 必須)
- "9849:9849" # Nacos 客戶端端口(2.0+ 必須)
networks:
- nacos-network # 加入自定義網絡
# 自定義網絡(讓 Nacos 和 MySQL 內部通信,不暴露給外部其他服務)
networks:
nacos-network:
driver: bridge # 橋接模式(默認)
步驟 2:準備初始化腳本
和方案 2 一樣,把 Nacos 數據庫初始化 SQL 腳本保存到 ./init-sql/nacos-mysql.sql(./ 指 docker-compose.yml 所在目錄):
# 在 yml 所在目錄執行,創建 init-sql 目錄并下載腳本(或手動復制腳本)
mkdir -p ./init-sql
# (可選)用 wget 直接下載官方腳本(如果服務器能聯網)
wget -O ./init-sql/nacos-mysql.sql https://github.com/alibaba/nacos/blob/2.0.2/distribution/conf/nacos-mysql.sql
步驟 3:啟動服務
在 docker-compose.yml 所在目錄執行下面的命令,一鍵啟動 MySQL 和 Nacos:
# 后臺啟動(-d 表示后臺運行)
docker compose up -d
步驟 4:驗證和管理
- 查看服務狀態:
docker compose ps,會顯示兩個服務的狀態(Up 表示正常); - 查看日志:
docker compose logs -f nacos-server(實時查看 Nacos 日志,有問題可排查); - 停止服務:
docker compose down(會停止并刪除容器,但掛載的目錄數據不會丟); - 重啟服務:
docker compose restart。
方案 4:Docker Compose 集群部署(適合生產高可用)
如果你的業務對可用性要求高(比如不能接受 Nacos 單點故障),可以部署 Nacos 集群(至少 3 個節點)。這里用 嵌入式存儲(EMBEDDED_STORAGE) 模式(不用額外裝 MySQL,適合快速搭建集群,生產環境也可使用)。
步驟 1:創建集群 docker-compose.yml
創建 nacos-cluster.yml 文件:
version: '3.8'
services:
# Nacos 節點 1
nacos-server-1:
image: nacos/nacos-server:2.0.2
container_name: nacos-server-1
restart: always
environment:
MODE: cluster # 集群模式(關鍵)
EMBEDDED_STORAGE: embedded # 啟用嵌入式存儲(不用 MySQL)
NACOS_SERVERS: "nacos-server-1:8848 nacos-server-2:8848 nacos-server-3:8848" # 集群節點列表(用容器名)
NACOS_SERVER_IP: nacos-server-1 # 當前節點 IP(容器名)
JVM_XMS: 1g
JVM_XMX: 1g
JVM_XMN: 512m
ports:
- "8848:8848"
- "9848:9848"
- "9849:9849"
networks:
- nacos-cluster-network
# Nacos 節點 2
nacos-server-2:
image: nacos/nacos-server:2.0.2
container_name: nacos-server-2
restart: always
environment:
MODE: cluster
EMBEDDED_STORAGE: embedded
NACOS_SERVERS: "nacos-server-1:8848 nacos-server-2:8848 nacos-server-3:8848"
NACOS_SERVER_IP: nacos-server-2
JVM_XMS: 1g
JVM_XMX: 1g
JVM_XMN: 512m
ports:
- "8849:8848" # 宿主機端口 8849 映射到容器 8848
- "9858:9848"
- "9859:9849"
networks:
- nacos-cluster-network
# Nacos 節點 3
nacos-server-3:
image: nacos/nacos-server:2.0.2
container_name: nacos-server-3
restart: always
environment:
MODE: cluster
EMBEDDED_STORAGE: embedded
NACOS_SERVERS: "nacos-server-1:8848 nacos-server-2:8848 nacos-server-3:8848"
NACOS_SERVER_IP: nacos-server-3
JVM_XMS: 1g
JVM_XMX: 1g
JVM_XMN: 512m
ports:
- "8850:8848" # 宿主機端口 8850 映射到容器 8848
- "9868:9848"
- "9869:9849"
networks:
- nacos-cluster-network
networks:
nacos-cluster-network:
driver: bridge
步驟 2:啟動集群
在 nacos-cluster.yml 所在目錄執行:
docker compose -f nacos-cluster.yml up -d
步驟 3:驗證集群
- 訪問任意節點的控制臺:
http://服務器IP:8848/nacos、http://服務器IP:8849/nacos、http://服務器IP:8850/nacos,登錄后在“集群管理 → 節點列表”中能看到 3 個節點,狀態都是“UP”,說明集群正常; - 測試高可用:停止其中一個節點(比如
docker stop nacos-server-1),刷新控制臺,剩下的兩個節點仍能正常工作,且服務注冊/配置管理不受影響。
五、Nacos 核心操作:服務注冊、發現與配置管理
部署完成后,咱們實際操作一下 Nacos 的核心功能,用命令行或控制臺都能實現,這里兩種方式都講。
1. 服務注冊(讓服務加入 Nacos)
方式 1:用 curl 命令注冊(適合測試)
執行下面的命令,注冊一個名為“user-service”的服務實例(IP 為 192.168.1.101,端口 8080):
curl -X PUT 'http://服務器IP:8848/nacos/v1/ns/instance?serviceName=user-service&ip=192.168.1.101&port=8080'
成功會返回 ok。
方式 2:在控制臺注冊
- 登錄 Nacos 控制臺,進入“服務管理 → 服務列表”;
- 點擊“新建服務”,輸入服務名(比如“user-service”),其他默認,點擊“確認”;
- 進入該服務的詳情頁,點擊“實例列表 → 新增實例”,輸入 IP 和端口,點擊“確認”。
2. 服務發現(查詢服務實例)
方式 1:用 curl 命令查詢
查詢“user-service”的所有健康實例:
curl -X GET 'http://服務器IP:8848/nacos/v1/ns/instances?serviceName=user-service'
成功會返回 JSON 格式的實例列表,類似:
{
"name": "DEFAULT_GROUP@@user-service",
"groupName": "DEFAULT_GROUP",
"clusters": "",
"cacheMillis": 10000,
"hosts": [
{
"ip": "192.168.1.101",
"port": 8080,
"valid": true,
"healthy": true,
"weight": 1.0,
"metadata": {},
"instanceId": "192.168.1.101#8080#DEFAULT#DEFAULT_GROUP@@user-service",
"clusterName": "DEFAULT",
"serviceName": "DEFAULT_GROUP@@user-service",
"enabled": true,
"ephemeral": true
}
],
"lastRefTime": 1690000000000,
"checksum": "",
"allIPs": false,
"reachProtectionThreshold": false,
"valid": true
}
方式 2:在控制臺查看
進入“服務管理 → 服務列表”,點擊“user-service”,就能看到所有實例的狀態。
3. 配置管理(動態發布/獲取配置)
方式 1:用 curl 命令操作
發布配置(新增一個配置)
發布一個 dataId 為“user-service-dev.conf”、group 為“DEFAULT_GROUP”、內容為“db.url=jdbc:mysql://127.0.0.1:3306/user_db”的配置:
curl -X POST "http://服務器IP:8848/nacos/v1/cs/configs?dataId=user-service-dev.conf&group=DEFAULT_GROUP&content=db.url=jdbc:mysql://127.0.0.1:3306/user_db"
成功返回 true。
獲取配置
查詢上面發布的配置:
curl -X GET "http://服務器IP:8848/nacos/v1/cs/configs?dataId=user-service-dev.conf&group=DEFAULT_GROUP"
成功返回配置內容:db.url=jdbc:mysql://127.0.0.1:3306/user_db。
方式 2:在控制臺操作
- 進入“配置管理 → 配置列表”,點擊“+”新建配置;
- 輸入 dataId(比如“user-service-dev.conf”)、group(默認“DEFAULT_GROUP”)、配置內容(比如數據庫地址、超時時間);
- 點擊“發布”,配置就會保存到 Nacos;
- 要獲取配置,直接在配置列表中找到該配置,點擊“查看”即可。
六、常見問題與解決方案
部署和使用過程中遇到問題不用慌,下面是高頻問題的解決方法:
1. 瀏覽器訪問不到 Nacos 控制臺?
排查步驟:
- 檢查容器是否正常運行:
docker ps | grep nacos,如果 STATUS 是“Exited”,執行docker logs 容器名查看日志(比如日志顯示“MySQL 連接失敗”,就是數據庫配置錯了); - 檢查端口是否開放:
- 云服務器:在控制臺的“安全組”中放行 8848、9848、9849 端口;
- 本地服務器:執行
firewall-cmd --list-ports查看端口是否開放,沒開放的話執行:# 開放 8848 端口(永久生效) firewall-cmd --add-port=8848/tcp --permanent firewall-cmd --add-port=9848/tcp --permanent firewall-cmd --add-port=9849/tcp --permanent # 重啟防火墻 firewall-cmd --reload
- 檢查端口是否沖突:執行
netstat -tuln | grep 8848,如果顯示“LISTEN”,說明端口被其他進程占用,啟動 Nacos 時換宿主機端口(比如-p 8849:8848)。
2. Nacos 連接不上 MySQL?
常見原因:
- MySQL 地址填錯:如果 MySQL 和 Nacos 在同一臺機器,不要填
127.0.0.1(容器內的 127.0.0.1 是容器自身,不是宿主機),要填宿主機的真實 IP(比如 192.168.1.100); - MySQL 密碼錯誤:檢查
MYSQL_SERVICE_PASSWORD參數是否和 MySQL 實際密碼一致; - MySQL 沒初始化腳本:Nacos 啟動時會報錯“Table 'nacos_config.config_info' doesn't exist”,需要重新執行初始化 SQL 腳本;
- MySQL 版本不兼容:Nacos 1.3.1 后支持 MySQL 8.0,如果用 MySQL 5.7,要確保鏡像版本是 5.7(不要用 8.0)。
3. 容器啟動后馬上退出(STATUS: Exited)?
執行 docker logs 容器名 查看日志,根據日志提示解決:
- 日志含“JVM 內存不足”:減小 JVM_XMS、JVM_XMX(比如改成 512m);
- 日志含“集群節點配置錯誤”:檢查
NACOS_SERVERS參數,集群模式下節點列表要填全(至少 3 個節點); - 日志含“權限不足”:給宿主機掛載目錄授權(比如
chmod -R 777 /data/nacos)。
4. 怎么開啟 Nacos 認證(防止未授權訪問)?
默認情況下,Nacos 不需要認證就能訪問,生產環境要開啟:
- 啟動 Nacos 時添加兩個環境變量:
-e NACOS_AUTH_ENABLE=true \ # 開啟認證 -e NACOS_AUTH_TOKEN=YourSecretKey123456 \ # 自定義密鑰(生產環境要復雜點) - 重啟 Nacos 后,訪問控制臺需要輸入賬號密碼(默認還是 nacos/nacos),API 調用也需要在請求頭中帶認證信息(比如
Authorization: Bearer 令牌,令牌需要通過登錄接口獲取)。
七、總結
到這里,你已經掌握了 Nacos Server 的全部核心部署方案:
- 新手/測試用 方案 1(快速部署),1 條命令搞定;
- 生產單機用 方案 2(掛載目錄+MySQL) 或 方案 3(Docker Compose),確保數據持久化;
- 生產高可用用 方案 4(集群部署),避免單點故障。
后續可以結合業務需求,探索 Nacos 的高級功能:比如用命名空間隔離開發/測試/生產環境、用服務路由實現灰度發布、結合 Prometheus+Grafana 監控 Nacos 狀態(官方有監控指南,可參考 Nacos Monitor Guide)。
如果遇到其他問題,優先查看 Nacos 容器日志(docker logs 容器名),大部分問題都能在日志中找到原因;也可以參考 Nacos 官方文檔,里面有更詳細的功能說明。

Nacos 讓服務之間不用硬編碼對方的 IP,就算服務地址變了,也不用修改代碼,Nacos 會自動同步最新信息——這就是“服務發現”的核心價值。
浙公網安備 33010602011771號