4. Nacos 安装与启动:单机模式、集群模式、Docker 部署

好,咱们进入实战环节。Nacos 的安装,说实话没那么复杂,但坑也不少。我见过不少团队,配置中心都跑起来了,结果因为启动模式选错,或者端口没放开,线上出了大问题。

今天我就把单机、集群、Docker 这三种方式,掰开揉碎了讲清楚。你跟着走一遍,基本就能应付绝大多数场景了。

4.1 环境准备:先把地基打好

在动手之前,先确认几件事。我个人习惯用 Linux 服务器,CentOS 7 或 Ubuntu 20.04 都行。Windows 也能跑,但生产环境我强烈不建议。

  • JDK 1.8+:Nacos 依赖 Java 环境。记得配好 JAVA_HOME
  • MySQL 5.7+(集群模式必需):单机模式可以用内嵌 Derby 数据库,但集群必须用 MySQL。
  • Nacos 安装包:去 GitHub 下载最新稳定版,我一般用 nacos-server-2.x.x.tar.gz
小提示: 我建议你提前把 MySQL 的驱动 jar 包放到 nacos/plugins/mysql/ 目录下。不然启动时会报找不到驱动的错,我曾经在这上面浪费过半小时。

4.2 单机模式:快速上手

单机模式最简单,适合开发测试。说白了就是一个人干活,不需要跟别人商量。

解压安装包,进入目录,直接执行:

# Linux/Mac
sh startup.sh -m standalone

# Windows
startup.cmd -m standalone

启动后,访问 http://localhost:8848/nacos,默认账号密码都是 nacos

注意: 单机模式默认使用内嵌 Derby 数据库。这意味着你重启后数据还在,但如果你把整个 data/ 目录删了,配置就全丢了。所以,别在生产环境用单机模式。

如果你想用 MySQL 跑单机模式,也可以。修改 conf/application.properties

spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://localhost:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=your_password

然后执行 conf/mysql-schema.sql 初始化数据库表结构。嗯,这一步别忘了,我刚开始就吃过这个亏。

4.3 集群模式:高可用的关键

生产环境必须上集群。你想想看,如果配置中心挂了,所有服务都拿不到配置,那不就全瘫了吗?

集群模式至少需要 3 个节点。我一般用 3 台机器,或者在同一台机器上开 3 个不同端口。

4.3.1 配置集群文件

conf/cluster.conf 里写上所有节点的地址:

192.168.1.10:8848
192.168.1.11:8848
192.168.1.12:8848

注意,这里写的是真实 IP,别用 localhost。我曾经在测试环境用了 localhost,结果节点之间互相找不到,折腾了半天才发现是这个问题。

4.3.2 配置 MySQL 数据源

所有节点必须连接同一个 MySQL 数据库。修改每个节点的 application.properties

spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://192.168.1.100:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=your_password

4.3.3 启动集群

每个节点执行:

sh startup.sh

默认就是集群模式。启动后,访问任意一个节点的管理界面,都能看到所有节点的状态。

核心要点: 集群模式下,Nacos 节点之间通过 Raft 协议选举 Leader。写操作由 Leader 处理,读操作可以由任意节点处理。所以,你的客户端配置 server-addr 时,可以写多个地址,用逗号隔开。

4.4 Docker 部署:容器化时代的标配

现在大家都用容器了。Docker 部署 Nacos 其实更简单,而且便于管理。

4.4.1 单机 Docker 部署

docker run -d \
  --name nacos-server \
  -p 8848:8848 \
  -e MODE=standalone \
  nacos/nacos-server:2.2.0

就这么一行命令,搞定。不过,数据是存在容器里的,容器一删就没了。所以,我建议挂载外部卷:

docker run -d \
  --name nacos-server \
  -p 8848:8848 \
  -e MODE=standalone \
  -v /data/nacos/logs:/home/nacos/logs \
  -v /data/nacos/data:/home/nacos/data \
  nacos/nacos-server:2.2.0

4.4.2 集群 Docker 部署

集群用 Docker Compose 最方便。写一个 docker-compose.yml

version: '3'
services:
  nacos1:
    image: nacos/nacos-server:2.2.0
    container_name: nacos1
    ports:
      - "8848:8848"
    environment:
      - MODE=cluster
      - NACOS_SERVERS=nacos1:8848 nacos2:8848 nacos3:8848
      - MYSQL_SERVICE_HOST=mysql
      - MYSQL_SERVICE_DB_NAME=nacos_config
      - MYSQL_SERVICE_USER=root
      - MYSQL_SERVICE_PASSWORD=your_password
    volumes:
      - /data/nacos1/logs:/home/nacos/logs
      - /data/nacos1/data:/home/nacos/data

  nacos2:
    image: nacos/nacos-server:2.2.0
    container_name: nacos2
    ports:
      - "8849:8848"
    environment:
      - MODE=cluster
      - NACOS_SERVERS=nacos1:8848 nacos2:8848 nacos3:8848
      - MYSQL_SERVICE_HOST=mysql
      - MYSQL_SERVICE_DB_NAME=nacos_config
      - MYSQL_SERVICE_USER=root
      - MYSQL_SERVICE_PASSWORD=your_password
    volumes:
      - /data/nacos2/logs:/home/nacos/logs
      - /data/nacos2/data:/home/nacos/data

  nacos3:
    image: nacos/nacos-server:2.2.0
    container_name: nacos3
    ports:
      - "8850:8848"
    environment:
      - MODE=cluster
      - NACOS_SERVERS=nacos1:8848 nacos2:8848 nacos3:8848
      - MYSQL_SERVICE_HOST=mysql
      - MYSQL_SERVICE_DB_NAME=nacos_config
      - MYSQL_SERVICE_USER=root
      - MYSQL_SERVICE_PASSWORD=your_password
    volumes:
      - /data/nacos3/logs:/home/nacos/logs
      - /data/nacos3/data:/home/nacos/data

  mysql:
    image: mysql:5.7
    container_name: mysql
    ports:
      - "3306:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=your_password
      - MYSQL_DATABASE=nacos_config
    volumes:
      - /data/mysql/data:/var/lib/mysql
      - ./mysql-schema.sql:/docker-entrypoint-initdb.d/mysql-schema.sql

然后执行:

docker-compose up -d

等几分钟,三个 Nacos 节点就都起来了。你可以用 docker logs 查看启动日志,确认没有报错。

避坑指南: 我曾经在 Docker 集群里遇到过节点之间无法通信的问题。后来发现是 NACOS_SERVERS 环境变量里写了 IP 而不是容器名。记住,Docker 内部用容器名通信,别写 IP。

4.5 启动后的验证

不管哪种方式启动,都要验证一下:

  1. 访问管理界面,确认能正常登录。
  2. 在「集群管理」页面查看节点状态,所有节点都应该是「UP」。
  3. 创建一个测试配置,看看能不能正常保存和读取。

嗯,到这里,Nacos 的安装启动就讲完了。单机模式适合练手,集群模式保生产,Docker 部署最省心。你根据自己团队的实际情况选就行。

下一节,咱们聊聊 Nacos 的配置管理,那才是真正干活的地方。