Docker 安装 Nacos
大约 10 分钟约 3090 字
Docker 安装 Nacos
简介
Nacos(Dynamic Naming and Configuration Service)是阿里巴巴开源的服务发现和配置管理平台,是 Spring Cloud Alibaba 生态的核心组件之一。它提供了服务注册发现、动态配置管理和服务管理平台等功能,广泛应用于微服务架构中。
Nacos 支持两种部署模式:
- 单机模式(Standalone):适用于开发和测试环境,所有数据存储在内嵌的嵌入式数据库中
- 集群模式(Cluster):适用于生产环境,数据存储在外部 MySQL 数据库中,支持多节点高可用
本文将详细介绍使用 Docker 部署 Nacos 的完整流程,包括单机模式部署、MySQL 持久化配置、Docker 网络配置、集群模式部署以及常见问题的排查。
环境准备
系统要求
| 项目 | 最低要求 | 推荐配置 |
|---|---|---|
| 操作系统 | CentOS 7+ / Ubuntu 18.04+ | CentOS 7.9 |
| 内存 | 512MB(单机) | 2GB+(集群) |
| 磁盘 | 5GB | 20GB+ |
| Docker | 19.03+ | 最新稳定版 |
| MySQL | 5.7+(集群模式必需) | 8.0 |
端口规划
| 端口 | 说明 |
|---|---|
| 8848 | Nacos HTTP 控制台和 API 端口 |
| 9848 | Nacos gRPC 端口(客户端 gRPC 请求) |
| 9555 | Nacos Raft 端口(集群模式使用) |
端口说明
从 Nacos 2.x 开始,客户端与 Nacos 之间的通信新增了 gRPC 方式,因此需要额外开放 9848 端口(8848 + 1000)。如果使用 Nacos 1.x 版本,只需要 8848 端口。
第一步:拉取镜像
# 搜索可用的 Nacos 镜像
docker search nacos
# 拉取最新版本的 Nacos 镜像
docker pull nacos/nacos-server:latest
# 建议指定版本(生产环境务必固定版本)
docker pull nacos/nacos-server:v2.2.3
docker pull nacos/nacos-server:v2.1.2
# 查看已拉取的镜像
docker images | grep nacos第二步:创建宿主机映射目录
# 创建 Nacos 日志目录
mkdir -p /usr/local/docker/nacos/logs
# 创建 Nacos 配置目录
mkdir -p /usr/local/docker/nacos/conf
# 创建 Nacos 数据目录(用于存储内置数据库数据)
mkdir -p /usr/local/docker/nacos/data
# 设置目录权限
chmod -R 755 /usr/local/docker/nacos第三步:配置数据库(集群模式推荐)
创建 Nacos 数据库
在 MySQL 中创建 Nacos 所需的数据库和表结构:
-- 创建数据库
CREATE DATABASE nacos_config DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-- 使用 nacos_config 数据库
USE nacos_config;
-- 导入 Nacos 官方提供的初始化 SQL
-- SQL 文件地址:https://github.com/alibaba/nacos/blob/master/distribution/conf/nacos-mysql.sql
-- 或者从 Nacos 容器内获取
-- docker cp nacos:/home/nacos/conf/nacos-mysql.sql ./
-- source nacos-mysql.sql配置 application.properties
# 创建 Nacos 配置文件
cat > /usr/local/docker/nacos/conf/application.properties <<'EOF'
spring.datasource.platform=mysql
# 数据库连接配置(单实例)
db.num=1
db.url.0=jdbc:mysql://localhost:3310/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false&serverTimezone=Asia/Shanghai
db.user=nacos
db.password=nacos_password
# 暴露所有监控端点(生产环境建议限制)
management.endpoints.web.exposure.include=*
# 日志配置
server.tomcat.accesslog.enabled=true
server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D
# Nacos 安全配置
nacos.core.auth.enabled=true
nacos.core.auth.server.identity.key=nacos
nacos.core.auth.server.identity.value=nacos
nacos.core.auth.plugin.nacos.token.secret.key=SecretKey012345678901234567890123456789012345678901234567890123456789
EOF数据库连接配置详解
| 配置项 | 说明 |
|---|---|
spring.datasource.platform=mysql | 指定数据源平台为 MySQL |
db.num | 数据库实例数量 |
db.url.0 | 第一个数据库实例的 JDBC 连接地址 |
db.user | 数据库用户名 |
db.password | 数据库密码 |
安全提示
生产环境中数据库密码不应明文写在配置文件中,建议使用环境变量或 Docker Secrets 注入密码。
第四步:单机模式启动
使用 standalone(单机)模式启动 Nacos,适用于开发和测试环境:
docker run -d \
-p 8848:8848 \
-p 9848:9848 \
-p 9555:9555 \
-e MODE=standalone \
-e TZ="Asia/Shanghai" \
-e PREFER_HOST_MODE=hostname \
-e JVM_XMS=256m \
-e JVM_XMX=512m \
-v /usr/local/docker/nacos/logs:/home/nacos/logs \
-v /usr/local/docker/nacos/conf/application.properties:/home/nacos/conf/application.properties \
--restart always \
--name nacos \
nacos/nacos-server:v2.2.3参数详解
| 参数 | 说明 |
|---|---|
-p 8848:8848 | Nacos HTTP 控制台端口 |
-p 9848:9848 | Nacos gRPC 端口(Nacos 2.x 必需) |
-p 9555:9555 | Nacos Raft 端口 |
-e MODE=standalone | 单机模式运行 |
-e TZ="Asia/Shanghai" | 设置时区为中国标准时间 |
-e PREFER_HOST_MODE=hostname | 优先使用 hostname 注册 |
-e JVM_XMS=256m | JVM 初始堆内存 |
-e JVM_XMX=512m | JVM 最大堆内存 |
-v | 目录映射,左侧为宿主机路径,右侧为容器内路径 |
--restart always | Docker 服务重启后自动启动 |
第五步:Docker 网络配置
当 Nacos 需要连接同一 Docker 环境中的 MySQL 容器时,需要使用 Docker 网络进行通信:
# 创建自定义桥接网络
docker network create app-net
# 将 MySQL 容器连接到该网络
docker network connect app-net mysql
# 将 Nacos 容器连接到该网络
docker network connect app-net nacos
# 查看网络中的容器信息
docker network inspect app-net
# 修改 application.properties 中的数据库连接地址
# 将 localhost 改为容器名 mysql
# db.url.0=jdbc:mysql://mysql:3306/nacos_config?...Docker 网络最佳实践
在同一 Docker 环境中运行的多个容器,推荐使用自定义桥接网络而非 --link(已废弃)。通过自定义网络,容器之间可以使用容器名互相访问,无需关心 IP 地址变化。
第六步:防火墙配置
# 添加 Nacos HTTP 端口
firewall-cmd --add-port=8848/tcp --permanent
# 添加 Nacos gRPC 端口
firewall-cmd --add-port=9848/tcp --permanent
# 重新加载防火墙
firewall-cmd --reload
# 验证端口
firewall-cmd --list-ports验证安装
访问控制台
在浏览器中打开以下地址:
http://<服务器IP>:8848/nacos默认登录账号:
- 用户名:
nacos - 密码:
nacos
安全提示
首次登录后请立即修改默认密码。在生产环境中,建议关闭默认密码登录或使用自定义认证方式。
功能验证
- 配置管理:进入「配置管理」->「配置列表」,创建一个测试配置
- 服务发现:注册一个测试服务,在「服务管理」->「服务列表」中查看
- 命名空间:创建不同的命名空间来隔离不同环境的配置
集群模式部署
使用 Docker Compose 部署 Nacos 集群
# docker-compose-nacos-cluster.yml
version: '3.8'
services:
nacos1:
image: nacos/nacos-server:v2.2.3
container_name: nacos1
restart: always
ports:
- "8848:8848"
- "9848:9848"
environment:
MODE=cluster
NACOS_SERVERS=nacos1:8848 nacos2:8848 nacos3:8848
SPRING_DATASOURCE_PLATFORM=mysql
MYSQL_SERVICE_HOST=mysql
MYSQL_SERVICE_PORT=3306
MYSQL_SERVICE_DB_NAME=nacos_config
MYSQL_SERVICE_USER=nacos
MYSQL_SERVICE_PASSWORD=nacos_password
JVM_XMS=512m
JVM_XMX=512m
volumes:
- ./nacos1/logs:/home/nacos/logs
- ./nacos1/data:/home/nacos/data
networks:
- app-net
nacos2:
image: nacos/nacos-server:v2.2.3
container_name: nacos2
restart: always
ports:
- "8849:8848"
- "9849:9848"
environment:
MODE=cluster
NACOS_SERVERS=nacos1:8848 nacos2:8848 nacos3:8848
SPRING_DATASOURCE_PLATFORM=mysql
MYSQL_SERVICE_HOST=mysql
MYSQL_SERVICE_PORT=3306
MYSQL_SERVICE_DB_NAME=nacos_config
MYSQL_SERVICE_USER=nacos
MYSQL_SERVICE_PASSWORD=nacos_password
JVM_XMS=512m
JVM_XMX=512m
volumes:
- ./nacos2/logs:/home/nacos/logs
- ./nacos2/data:/home/nacos/data
networks:
- app-net
nacos3:
image: nacos/nacos-server:v2.2.3
container_name: nacos3
restart: always
ports:
- "8850:8848"
- "9850:9848"
environment:
MODE=cluster
NACOS_SERVERS=nacos1:8848 nacos2:8848 nacos3:8848
SPRING_DATASOURCE_PLATFORM=mysql
MYSQL_SERVICE_HOST=mysql
MYSQL_SERVICE_PORT=3306
MYSQL_SERVICE_DB_NAME=nacos_config
MYSQL_SERVICE_USER=nacos
MYSQL_SERVICE_PASSWORD=nacos_password
JVM_XMS=512m
JVM_XMX=512m
volumes:
- ./nacos3/logs:/home/nacos/logs
- ./nacos3/data:/home/nacos/data
networks:
- app-net
mysql:
image: mysql:8.0
container_name: mysql
restart: always
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: root_password
MYSQL_DATABASE: nacos_config
MYSQL_USER: nacos
MYSQL_PASSWORD: nacos_password
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/init:/docker-entrypoint-initdb.d
networks:
- app-net
networks:
app-net:
driver: bridge常见问题排查
Nacos 启动失败
# 查看容器日志
docker logs nacos
# 查看最近 100 行日志
docker logs --tail 100 nacos
# 常见原因1:内存不足
# 解决:降低 JVM 内存参数
docker run -d -e JVM_XMS=128m -e JVM_XMX=256m ...
# 常见原因2:MySQL 连接失败
# 解决:检查网络配置和数据库连接参数
docker exec nacos ping mysql
docker exec nacos nc -zv mysql 3306
# 常见原因3:数据库表未初始化
# 解决:确认已导入 nacos-mysql.sql客户端注册失败
# 1. 检查 Nacos 版本与客户端版本是否匹配
# Spring Cloud Alibaba 2021.x 对应 Nacos 2.x
# Spring Cloud Alibaba 2020.x 对应 Nacos 1.x
# 2. 检查 gRPC 端口是否开放(Nacos 2.x 必需)
ss -tlnp | grep 9848
# 3. 检查网络连通性
telnet <nacos_ip> 8848
telnet <nacos_ip> 9848
# 4. 检查 Nacos 服务端日志
docker logs nacos | grep -i error配置无法拉取
# 1. 检查命名空间是否正确
# 2. 检查 Group ID 是否匹配(默认为 DEFAULT_GROUP)
# 3. 检查 Data ID 格式是否正确
# 格式:${spring.application.name}-${spring.profiles.active}.${file-extension}
# 示例:myapp-dev.yaml性能优化建议
JVM 内存配置
| 环境 | 推荐内存 | 配置 |
|---|---|---|
| 开发环境 | 256MB - 512MB | JVM_XMS=256m, JVM_XMX=512m |
| 测试环境 | 512MB - 1GB | JVM_XMS=512m, JVM_XMX=1g |
| 生产环境 | 1GB - 2GB | JVM_XMS=1g, JVM_XMX=2g |
日志清理
# 配置日志轮转,避免日志文件无限增长
# 在 application.properties 中添加
nacos.logging.default.config.enabled=true
# 定期清理旧日志
find /usr/local/docker/nacos/logs -name "*.log.*" -mtime +30 -deleteSpring Boot 集成 Nacos
服务注册与发现配置
# pom.xml 依赖
# <dependency>
# <groupId>com.alibaba.cloud</groupId>
# <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
# </dependency>
# <dependency>
# <groupId>com.alibaba.cloud</groupId>
# <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
# </dependency>
# application.yml — 服务注册配置
spring:
application:
name: order-service
cloud:
nacos:
discovery:
server-addr: ${NACOS_HOST:localhost}:8848
namespace: dev
group: DEFAULT_GROUP
cluster-name: BJ
weight: 1.0
metadata:
version: v2.0
region: beijing
config:
server-addr: ${NACOS_HOST:localhost}:8848
namespace: dev
group: DEFAULT_GROUP
file-extension: yaml
shared-configs:
- data-id: common-redis.yaml
group: SHARED_GROUP
refresh: true
- data-id: common-database.yaml
group: SHARED_GROUP
refresh: true// 启用服务注册发现
@SpringBootApplication
@EnableDiscoveryClient
public class OrderServiceApplication {
public static void main(String[] args) {
SpringApplication.run(OrderServiceApplication.class, args);
}
}
// 使用 RestTemplate + 负载均衡
@Configuration
public class RestConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
// 服务调用
@Service
public class OrderService {
@Autowired
private RestTemplate restTemplate;
public Product getProduct(Long productId) {
// 使用服务名调用,Nacos 负责解析
return restTemplate.getForObject(
"http://product-service/api/products/" + productId,
Product.class);
}
}动态配置管理
// 使用 @RefreshScope 实现配置热更新
@RestController
@RefreshScope
public class ConfigController {
@Value("${order.max-retry-count:3}")
private int maxRetryCount;
@Value("${order.timeout-ms:5000}")
private int timeoutMs;
@GetMapping("/config/info")
public Map<String, Object> getConfig() {
return Map.of(
"maxRetryCount", maxRetryCount,
"timeoutMs", timeoutMs
);
}
}
// 使用 @NacosValue 注解(Nacos 原生方式)
@RestController
public class NacosConfigController {
@NacosValue(value = "${feature.switch.new-order-flow:false}", autoRefreshed = true)
private boolean newOrderFlowEnabled;
@GetMapping("/feature/order-flow")
public String getOrderFlowType() {
return newOrderFlowEnabled ? "V2" : "V1";
}
}Nacos 配置管理最佳实践:
- Data ID 命名规范:${应用名}-${环境}.${格式},如 order-service-dev.yaml
- 使用命名空间隔离环境:dev / test / staging / prod
- 使用 Group 分组:DEFAULT_GROUP(业务配置)、SHARED_GROUP(共享配置)
- 公共配置抽取:数据库、Redis、MQ 等基础配置使用 shared-configs 共享
- 敏感配置加密:使用 Nacos 内置加密或 KMS
- 配置变更审计:开启配置变更日志和通知Nacos 权限与安全
开启鉴权
# Nacos 2.x 开启鉴权(application.properties)
nacos.core.auth.enabled=true
nacos.core.auth.server.identity.key=serverIdentity
nacos.core.auth.server.identity.value=security
nacos.core.auth.plugin.nacos.token.secret.key=VGhpc0lzTXlDdXN0b21TZWNyZXRLZXkwMTIzNDU2Nzg=
# 自定义 Token 密钥(Base64 编码,至少 32 字符)
# 生成方式:
echo -n "MySecretKeyForNacos2026" | base64
# 创建用户和角色(通过 API 或控制台)
curl -X POST 'http://localhost:8848/nacos/v1/auth/users' \
-d 'username=app_user&password=StrongPass123!'
# 为用户分配角色
curl -X POST 'http://localhost:8848/nacos/v1/auth/roles' \
-d 'username=app_user&role=ROLE_APP'
# 创建权限规则
curl -X POST 'http://localhost:8848/nacos/v1/auth/permissions' \
-d 'role=ROLE_APP&resource=dev:DEFAULT_GROUP:*&action=rw'权限模型说明:
- 用户(User):登录账号
- 角色(Role):权限集合
- 权限(Permission):资源 + 操作(rw)
- 资源格式:命名空间:Group:DataID(* 表示通配)
- 生产环境建议最小权限原则,不同应用使用不同账号Nacos 数据持久化深入
MySQL 高可用配置
# 主从 MySQL 配置(application.properties)
db.num=2
db.url.0=jdbc:mysql://mysql-master:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false
db.url.1=jdbc:mysql://mysql-slave:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false
db.user=nacos
db.password=nacos_password数据备份策略
# 备份 Nacos 配置(通过 API 导出)
curl -X GET 'http://localhost:8848/nacos/v1/cs/configs?export=true&dataId=&group=&tenant=dev' \
-H 'accessToken: xxx' \
-o nacos_config_backup_$(date +%Y%m%d).zip
# 备份数据库
mysqldump -h mysql-host -u nacos -p nacos_config > nacos_db_backup_$(date +%Y%m%d).sql
# 恢复数据库
mysql -h mysql-host -u nacos -p nacos_config < nacos_db_backup_20260415.sql
# 定时备份(crontab)
# 每天凌晨 2 点备份
0 2 * * * /usr/bin/mysqldump -h mysql-host -u nacos -pnacos_password nacos_config > /backup/nacos_$(date +\%Y\%m\%d).sqlNacos 监控与运维
健康检查脚本
#!/bin/bash
# nacos-health-check.sh
NACOS_HOST="localhost:8848"
ALERT_WEBHOOK="https://hooks.example.com/nacos-alert"
# 检查 Nacos 健康状态
health=$(curl -s "http://${NACOS_HOST}/nacos/v1/ns/operator/leaders" | grep -c '"leader"')
if [ "$health" -eq 0 ]; then
echo "Nacos 健康检查失败!"
# 发送告警
curl -X POST "${ALERT_WEBHOOK}" \
-H 'Content-Type: application/json' \
-d "{\"content\": \"Nacos 服务异常:${NACOS_HOST} 健康检查失败\"}"
exit 1
fi
# 检查服务数量
service_count=$(curl -s "http://${NACOS_HOST}/nacos/v1/ns/service/list?pageNo=1&pageSize=100" | grep -o '"count":[0-9]*' | grep -o '[0-9]*')
echo "当前注册服务数: ${service_count}"
# 检查集群节点状态
echo "集群节点状态:"
curl -s "http://${NACOS_HOST}/nacos/v1/ns/operator/servers" | python3 -m json.tool
echo "健康检查通过 $(date)"Prometheus 指标接入
# Nacos 暴露了 Prometheus 格式的指标
# 端点地址:http://nacos:8848/nacos/actuator/prometheus
# prometheus.yml 添加采集任务
scrape_configs:
- job_name: 'nacos'
metrics_path: '/nacos/actuator/prometheus'
static_configs:
- targets:
- 'nacos1:8848'
- 'nacos2:8848'
- 'nacos3:8848'
scrape_interval: 15sNacos 关键监控指标:
- nacos_monitor{name="serviceCount"}: 注册服务数量
- nacos_monitor{name="instanceCount"}: 实例数量
- nacos_monitor{name="configCount"}: 配置数量
- nacos_monitor{name="publishFailed"}: 配置发布失败次数
- nacos_monitor{name="notifyFailed"}: 配置通知失败次数
- jvm_memory_used_bytes: JVM 内存使用
- jvm_threads_live_threads: JVM 线程数
- 建议告警:服务数突降、配置推送失败率升高、JVM 内存超过 80%版本兼容性矩阵
Spring Cloud Alibaba 版本兼容关系:
| Spring Cloud Alibaba | Spring Cloud | Spring Boot | Nacos |
|---------------------|------------------|-------------|----------|
| 2022.0.x | 2022.0.x | 3.0.x | 2.2.x |
| 2021.0.x | 2021.0.x (Jubilee)| 2.6.x | 2.1.x |
| 2.2.x | Hoxton | 2.2.x | 1.4.x |
| 2.1.x | Greenwich | 2.1.x | 1.2.x |
Nacos 客户端与服务端兼容性:
- Nacos 2.x 客户端可连接 Nacos 1.x 服务端(降级为 HTTP 通信)
- Nacos 1.x 客户端可连接 Nacos 2.x 服务端(兼容模式)
- 推荐客户端和服务端版本保持一致
- 升级时建议先升级服务端,再升级客户端