1. 为什么选择Docker部署Nacos?从零开始的实战思考
如果你正在搭建微服务架构,或者已经身处其中,那么Nacos这个名字对你来说一定不陌生。作为阿里巴巴开源的服务发现、配置管理和服务管理平台,它可以说是微服务架构的“中枢神经系统”。但很多朋友在初次接触时,往往会纠结于部署方式:是直接下载安装包,还是用Docker?作为一个在微服务领域摸爬滚打多年的老手,我强烈推荐你从Docker开始。
为什么?我举个简单的例子。以前我负责的一个项目,团队里有开发、测试、运维好几个人,每个人的本地环境、测试环境、生产环境都略有不同。用传统方式部署Nacos,光是解决“在我机器上好好的,怎么到你那儿就不行了”这类问题,就耗费了大量时间。后来我们统一用Docker部署,所有环境从镜像、配置到启动命令完全一致,这类问题瞬间消失了。Docker带来的环境一致性、快速部署和资源隔离,对于Nacos这类基础设施来说,简直是绝配。
简单来说,用Docker部署Nacos,你得到的是一个标准化、可移植、一键启停的服务注册与配置中心。无论是单机开发测试,还是集群化生产部署,Docker都能帮你把流程简化到极致。这篇文章,我就带你从零开始,手把手搞定Nacos的单机和集群部署,并且会结合最新的Nacos 3.x版本特性,把那些官方文档里没细说的“坑”和最佳实践都给你讲明白。咱们不搞理论,只讲实战,保证你跟着做就能成功。
2. 环境准备:别在第一步就踩坑
在真正动手拉镜像、跑容器之前,花几分钟把准备工作做好,能避免后面90%的奇怪问题。这里我结合自己踩过的坑,给你梳理了一份清晰的清单。
首先,Docker环境是必须的。我假设你已经安装好了Docker和Docker Compose。如果你还没装,去Docker官网按照对应系统的教程安装就行,记得安装完成后运行一下docker --version和docker-compose --version确认一下。版本不用追求最新,但别太老,Docker 20.10+,Docker Compose v2+ 基本就够用了。
其次,关于网络和端口,这是新手最容易出问题的地方。Nacos在2.x及以后的版本,通信机制有了很大变化,从单纯的HTTP扩展到了gRPC。这意味着它需要监听多个端口:
- 8848: 这是主端口,用于HTTP API和控制台访问。你通过浏览器打开
http://localhost:8848/nacos靠的就是它。 - 9848: 这是Nacos 2.0引入的gRPC通信端口,用于客户端与服务端之间的长连接通信,比如服务实例的健康检查、配置变更推送,效率比HTTP轮询高得多。
- 9849: 同样是gRPC端口,用于集群节点间的Raft协议通信,如果你部署集群,这个端口必须开放给其他Nacos节点访问。
所以,请务必确保你的服务器防火墙或安全组规则放行了这三个端口(单机模式本地访问一般没问题,集群或远程访问时必须检查)。我见过太多人部署集群失败,最后发现是9848或9849端口被墙了。
最后是资源考虑。Nacos本身不算太重,但如果你打算用外置MySQL做持久化(生产环境强烈建议),那么需要提前准备好MySQL(5.7或8.0版本均可)。你可以选择在宿主机安装,也可以用另一个Docker容器来运行MySQL,看你怎么方便。我个人的习惯是,对于开发测试,用Docker Compose把Nacos和MySQL一起管理;对于生产环境,MySQL通常由DBA团队单独维护。
提示:如果你是在Mac M1/M2/M3芯片的电脑上操作,拉取镜像时需要注意,官方的
nacos/nacos-server:latest镜像是多架构的,通常包含了arm64支持。但如果遇到问题,可以尝试使用带-slim后缀的标签,例如nacos/nacos-server:v3.1.1-slim,这个标签明确支持arm架构。
3. 单机模式部署:5分钟快速上手
单机模式最适合开发、测试和学习环境。它的特点是简单、快速、资源占用少,所有数据默认存储在内置的Derby数据库中,无需额外依赖。我们来分步操作。
3.1 拉取最新版Nacos镜像
打开你的终端,执行下面这条命令。这里我直接使用latest标签,它会拉取Nacos 3.x的最新稳定版镜像。如果你想用特定版本,比如v2.2.3,把标签替换掉就行。
docker pull nacos/nacos-server:latest拉取完成后,可以用docker images命令确认一下。看到nacos/nacos-server这个镜像名就对了。
3.2 启动一个基础的单机容器
最简启动命令只需要一行。但为了安全(即使是测试环境),我强烈建议你从一开始就开启鉴权。从Nacos 2.2.1版本开始,一些安全相关的环境变量不再是镜像默认值,必须由我们手动指定,否则启动会报错。
docker run -d \ --name nacos-standalone \ -e MODE=standalone \ -e NACOS_AUTH_ENABLE=true \ -e NACOS_AUTH_TOKEN=YourSecretKey012345678901234567890123456789 \ -e NACOS_AUTH_IDENTITY_KEY=serverIdentity \ -e NACOS_AUTH_IDENTITY_VALUE=security \ -p 8848:8848 \ -p 9848:9848 \ -p 9849:9849 \ nacos/nacos-server:latest我来解释一下这几个关键参数:
-e MODE=standalone: 设置运行模式为单机。这是最重要的一个参数。-e NACOS_AUTH_ENABLE=true:开启鉴权。不开启的话,你的Nacos控制台和API将门户大开,非常危险。-e NACOS_AUTH_TOKEN: 用于生成JWT Token的密钥。务必修改YourSecretKey012345678901234567890123456789为你自己的一串复杂字符串,长度建议大于32位。你可以用命令echo -n ‘你的复杂字符串‘ | base64生成一个Base64编码的字符串放这里。-e NACOS_AUTH_IDENTITY_KEY和-e NACOS_AUTH_IDENTITY_VALUE: 服务端间内部API调用的身份标识,按示例填写即可。-p: 端口映射,把容器内的三个关键端口都映射到宿主机。
执行完命令,用docker ps看看容器是否正常运行。如果状态是Up,就可以进行下一步了。
3.3 验证服务与控制台初体验
首先,查看启动日志,确认没有报错:
docker logs -f nacos-standalone当你看到日志里出现“Nacos started successfully in standalone mode”这样的字样,就说明启动成功了。
然后,打开浏览器,访问http://你的服务器IP:8848/nacos。如果是在本机,就是http://localhost:8848/nacos。第一次登录,用户名和密码都是nacos。
登录成功后,你就进入了Nacos控制台。在这里你可以:
- 服务管理:在“服务管理”菜单下注册和发现服务。
- 配置管理:在“配置管理”菜单下发布和监听配置。
- 命名空间:用于做环境隔离,比如
dev,test,prod。 - 权限控制:因为我们开启了鉴权,可以在“权限控制”菜单里管理用户和角色。
3.4 使用MySQL持久化数据(可选但推荐)
内置的Derby数据库虽然方便,但不适合生产,甚至不适合严肃的测试。因为容器销毁后,所有数据就没了。所以,对于任何你想保留数据的场景,都要用外置数据库,MySQL是最常用的选择。
第一步:准备MySQL数据库在你已有的MySQL实例中,创建一个数据库,比如叫nacos,并赋予相应用户权限。或者,更“Docker”的方式是,用Compose一起启动。这里假设你已有一个MySQL服务,IP为192.168.1.100。
第二步:初始化数据库表结构从Nacos的GitHub仓库下载建表语句:https://github.com/alibaba/nacos/blob/master/distribution/conf/mysql-schema.sql。在你的nacos数据库中执行这个SQL文件。
第三步:启动带MySQL的Nacos容器这次启动命令需要多设置几个环境变量来连接MySQL:
docker run -d \ --name nacos-standalone-mysql \ -e MODE=standalone \ -e NACOS_AUTH_ENABLE=true \ -e NACOS_AUTH_TOKEN=YourSecretKey012345678901234567890123456789 \ -e NACOS_AUTH_IDENTITY_KEY=serverIdentity \ -e NACOS_AUTH_IDENTITY_VALUE=security \ -e SPRING_DATASOURCE_PLATFORM=mysql \ -e MYSQL_SERVICE_HOST=192.168.1.100 \ -e MYSQL_SERVICE_PORT=3306 \ -e MYSQL_SERVICE_DB_NAME=nacos \ -e MYSQL_SERVICE_USER=root \ -e MYSQL_SERVICE_PASSWORD=your_mysql_password \ -p 8848:8848 \ -p 9848:9848 \ -p 9849:9849 \ nacos/nacos-server:latest注意把数据库连接信息换成你自己的。启动后,去MySQL里看看,如果config_info、users等表里开始有数据了,说明持久化配置成功。
4. 生产级集群部署:构建高可用架构
单机模式扛不住生产环境的流量,也经不起故障。生产环境我们必须部署集群。Nacos集群的核心思想是多个节点组成一个整体,对外提供一个统一的服务地址,即使其中一个节点挂掉,整个服务依然可用。
4.1 集群架构与核心概念
在动手之前,先理解两个关键点:
- 数据一致性:Nacos集群节点间如何同步数据?答案是Raft协议。这是一个分布式一致性算法,确保所有节点上的服务列表和配置信息最终是一致的。
- 数据存储:集群模式下,必须使用外置数据库(如MySQL)作为统一的数据存储。所有节点都读写同一个数据库,这样数据才能一致。不能再用内置的Derby了。
所以,一个典型的Nacos生产集群至少包含:3个或以上Nacos服务节点+1个MySQL数据库(建议主从或高可用方案)。3个节点是分布式系统常见的最小集群数,可以容忍1个节点故障。
4.2 使用Docker Compose一键部署集群
手动一个个启动容器太麻烦,我们用Docker Compose来编排。Nacos官方在nacos-docker项目里提供了很好的例子。首先,我们把项目克隆下来:
git clone https://github.com/nacos-group/nacos-docker.git cd nacos-docker关键文件在example/目录下。我们重点看cluster-hostname.yaml。这个文件定义了一个3节点的Nacos集群,并使用宿主机的hostname进行通信。它的结构非常清晰:
# example/cluster-hostname.yaml 精简示意 version: "3" services: nacos1: image: nacos/nacos-server:${NACOS_VERSION} hostname: nacos1 environment: - PREFER_HOST_MODE=hostname # 使用hostname作为节点标识 - MODE=cluster - NACOS_SERVERS=nacos1:8848 nacos2:8848 nacos3:8848 # 集群节点列表 - SPRING_DATASOURCE_PLATFORM=mysql - MYSQL_SERVICE_HOST=mysql - MYSQL_SERVICE_DB_NAME=nacos - MYSQL_SERVICE_USER=nacos - MYSQL_SERVICE_PASSWORD=nacos - NACOS_AUTH_ENABLE=true - NACOS_AUTH_TOKEN=... depends_on: - mysql nacos2: ... # 配置类似nacos1,hostname改为nacos2 nacos3: ... # 配置类似nacos1,hostname改为nacos3 mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: nacos MYSQL_USER: nacos MYSQL_PASSWORD: nacos可以看到,它同时启动了3个Nacos服务(nacos1,nacos2,nacos3)和1个MySQL服务。NACOS_SERVERS环境变量列出了所有集群成员的地址。
在项目根目录下,通常还有一个.env文件,可以在这里统一设置版本号等变量。检查并修改它,比如设置NACOS_VERSION=v3.1.1。
启动集群:在nacos-docker目录下,执行一条命令即可:
docker-compose -f example/cluster-hostname.yaml up -d-d参数让它在后台运行。用docker-compose ps可以查看所有服务状态,确保都是Up。
4.3 集群配置详解与调优
直接使用官方模板可能还不够,我们需要根据实际情况调整。下面这个表格是我根据多年经验总结的关键集群配置项,你可以在Compose文件的environment部分进行覆盖:
| 环境变量 | 说明 | 生产环境建议值 |
|---|---|---|
MODE | 运行模式 | cluster(必须) |
NACOS_SERVERS | 集群节点地址列表 | nacos1:8848 nacos2:8848 nacos3:8848(根据实际IP或域名修改) |
PREFER_HOST_MODE | 节点标识模式 | 如果跨机器部署,用ip;同机器用hostname |
SPRING_DATASOURCE_PLATFORM | 数据库类型 | mysql(必须) |
MYSQL_SERVICE_HOST | MySQL地址 | 你的MySQL服务器IP或容器服务名 |
JVM_XMS/JVM_XMX | JVM堆内存初始/最大值 | 根据机器内存调整,如2g |
NACOS_AUTH_ENABLE | 是否开启鉴权 | true(必须开启!) |
NACOS_AUTH_TOKEN | JWT密钥 | 务必修改为强密码 |
NACOS_AUTH_IDENTITY_KEY/VALUE | 服务端身份校验 | 自定义,集群内保持一致 |
关于网络:如果Nacos节点部署在不同的物理机或虚拟机上,NACOS_SERVERS必须使用IP地址,并且确保所有机器之间的8848,9848,9849端口是互通的。我曾经就遇到过因为安全组没开9849端口,导致集群始终选不出Leader的问题。
关于数据库:生产环境的MySQL一定要做高可用,比如主从复制。并且建议给Nacos单独开一个用户,赋予nacos数据库的权限即可,不要用root账号。
4.4 验证集群状态
部署完成后,如何确认集群工作正常?
查看日志:分别查看三个节点的日志,看是否有报错,以及是否成功连接到其他节点和MySQL。
docker-compose -f example/cluster-hostname.yaml logs nacos1访问控制台:浏览器访问任意一个节点的
8848端口,例如http://nacos1:8848/nacos。在控制台首页的“集群管理” -> “节点列表”中,你应该能看到三个节点,并且它们的“状态”都是“UP”, “角色”中有一个是“LEADER”,另外两个是“FOLLOWER”。这表示集群选举成功,运行健康。API测试:通过API向一个节点注册服务,然后从另一个节点查询,看是否能发现。这能验证集群数据同步是否正常。
# 向节点1注册服务 curl -X POST 'http://nacos1:8848/nacos/v1/ns/instance?serviceName=test.service&ip=192.168.1.10&port=8080' # 从节点2查询服务 curl -X GET 'http://nacos2:8848/nacos/v1/ns/instance/list?serviceName=test.service'
5. 进阶配置与运维要点
把服务跑起来只是第一步,要让它在生产环境稳定运行,还需要一些进阶配置。
5.1 开启鉴权与自定义配置
前面我们已经通过环境变量开启了鉴权。但有时候,环境变量不够用,或者你想覆盖更多默认配置。Nacos支持通过挂载自定义配置文件来实现。
你可以在宿主机上创建一个custom.properties文件,里面可以写任何Spring Boot支持的配置项。例如,你想修改服务端上下文路径,或者调整一些超时参数:
# custom.properties server.servlet.context-path=/nacos nacos.core.auth.enable.userAgentAuthWhite=false spring.jackson.date-format=yyyy-MM-dd HH:mm:ss然后,在启动容器时,通过-v参数将这个文件挂载到容器内的指定位置:
-v /your/local/path/custom.properties:/home/nacos/init.d/custom.properties这个目录下的配置文件优先级高于Nacos自带的application.properties。
5.2 数据持久化与备份
数据无价。当你使用MySQL持久化后,一定要建立定期的数据库备份机制。这是运维的底线。可以利用MySQL的mysqldump工具,或者你所在云平台提供的数据库备份服务。
此外,Nacos容器内产生的日志文件,如果你需要长期保存,也应该挂载到宿主机。可以通过-v /your/log/path:/home/nacos/logs来实现。
5.3 监控与告警
没有监控的系统就是在“裸奔”。Nacos原生集成了Micrometer,可以很方便地与Prometheus和Grafana集成,搭建监控看板。
官方nacos-docker项目中就有一个example/prometheus.yaml和example/grafana.yaml的示例。基本思路是:
- 启动Prometheus,配置抓取Nacos的metrics端点(
http://nacos:8848/nacos/actuator/prometheus)。 - 启动Grafana,配置Prometheus为数据源,然后导入Nacos官方的Grafana仪表盘模板。
监控的关键指标包括:服务实例数、配置数量、JVM内存/GC情况、HTTP/gRPC请求QPS和延迟、数据库连接池状态等。一旦这些指标出现异常波动,就能及时发出告警。
5.4 版本升级与回滚
升级Nacos版本时,务必先备份数据库。然后按照以下步骤进行:
- 停止旧版本容器。
- 拉取新版本镜像。
- 使用相同的数据卷挂载和环境变量启动新版本容器。
- 密切观察日志,并通过控制台和API验证核心功能。
- 如果出现问题,立即停止新容器,用备份的数据恢复数据库,并重新启动旧版本容器。
对于集群,建议采用滚动升级的方式,逐个节点进行,确保服务不中断。
6. 单机 vs 集群:如何选择与性能对比
最后,我们来聊聊怎么选。这张表清晰地对比了两种模式的核心差异:
| 特性维度 | 单机模式 (Standalone) | 集群模式 (Cluster) |
|---|---|---|
| 部署复杂度 | 极低,一条命令即可 | 中等,需要配置多个节点和数据库 |
| 资源消耗 | 低,单个容器 | 高,至少3个容器 + 数据库 |
| 高可用性 | 无,单点故障导致服务完全中断 | 高,部分节点故障不影响整体服务 |
| 数据可靠性 | 依赖容器/内置Derby,容器销毁数据丢失 | 依赖外置数据库,数据持久化可靠 |
| 性能上限 | 低,受限于单机资源 | 高,可水平扩展,读写负载可分散 |
| 适用场景 | 个人学习、开发测试、概念验证(PoC) | 预发布环境、生产环境 |
性能差异主要体现在:
- 读写能力:集群可以通过增加节点来分担读请求(服务发现查询是读多写少)。对于配置发布(写操作),集群模式下会由Leader节点处理,然后同步到Follower,写性能的瓶颈主要在数据库和网络延迟。
- 容灾能力:这是集群最大的价值。单机挂了就全挂;集群中挂掉一个Follower节点,服务几乎无感;即使挂掉Leader,也会在秒级内重新选举出新Leader,只有短暂的影响。
我的建议是:
- 开发机、本地测试:毫不犹豫地用单机模式,省心省力。
- 测试环境、集成环境:可以考虑使用集群模式,模拟生产环境,提前发现集群部署可能遇到的问题。
- 生产环境:必须使用集群模式,并且至少部署3个节点,跨可用区部署更好。同时,必须开启鉴权,必须使用外置高可用数据库。
说到底,技术选型没有银弹,关键是匹配你的场景。希望这篇从单机到集群、从入门到进阶的实战指南,能帮你把Nacos稳稳当当地跑起来。在实际操作中如果遇到问题,多看看日志,善用docker logs和Nacos控制台的“集群管理”页面,大部分问题都能找到线索。