Nacos 2.3.2 Docker 生产部署:3步配置MySQL持久化与鉴权(附完整docker-compose.yml)
Nacos 2.3.2 Docker 生产部署:MySQL持久化与鉴权全流程实战
在微服务架构中,服务发现和配置管理是两大核心组件。Nacos作为阿里巴巴开源的服务发现和配置管理平台,已经成为众多企业的首选方案。本文将详细介绍如何在生产环境中使用Docker Compose部署Nacos 2.3.2,并配置MySQL作为外部持久化存储,同时开启鉴权功能以确保系统安全。
1. 生产环境部署规划
在生产环境中部署Nacos需要考虑以下几个关键因素:
- 数据持久化 :避免使用内置的Derby数据库,选择MySQL等成熟的关系型数据库
- 安全性 :必须开启鉴权功能,防止未授权访问
- 资源隔离 :合理配置JVM参数,避免内存溢出
- 高可用 :虽然本文演示单机模式,但生产环境建议集群部署
1.1 系统要求
部署前请确保您的环境满足以下要求:
| 组件 | 最低要求 | 推荐配置 |
|---|---|---|
| Docker | 20.10.0+ | 最新稳定版 |
| Docker Compose | 1.29.0+ | 2.0.0+ |
| MySQL | 5.7+ | 8.0+ |
| 内存 | 2GB | 4GB+ |
| CPU | 2核 | 4核+ |
提示:Nacos 2.x版本新增了gRPC通信端口,确保防火墙开放8848(主端口)、9848(客户端gRPC端口)和9849(服务端gRPC端口)
2. MySQL数据库准备
2.1 创建数据库与用户
首先需要为Nacos准备MySQL数据库。执行以下SQL语句创建数据库和用户:
CREATE DATABASE nacos_config CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'nacos'@'%' IDENTIFIED BY 'Nacos@123456';
GRANT ALL PRIVILEGES ON nacos_config.* TO 'nacos'@'%';
FLUSH PRIVILEGES;
2.2 初始化Nacos数据库表结构
从Nacos官方GitHub仓库获取数据库初始化脚本,或者使用以下简化步骤:
# 下载Nacos官方提供的SQL文件
wget https://github.com/alibaba/nacos/blob/master/distribution/conf/mysql-schema.sql
# 导入到MySQL数据库
mysql -u root -p nacos_config < mysql-schema.sql
关键表结构说明:
config_info:存储所有配置信息users:存储用户账号和密码(开启鉴权后使用)roles:用户角色关联表permissions:权限控制表
3. Docker Compose部署配置
下面提供完整的docker-compose.yml文件,包含了Nacos和MySQL的配置:
version: '3.8'
services:
mysql:
image: mysql:8.0.32
container_name: nacos-mysql
environment:
MYSQL_ROOT_PASSWORD: Root@123456
MYSQL_DATABASE: nacos_config
MYSQL_USER: nacos
MYSQL_PASSWORD: Nacos@123456
volumes:
- mysql_data:/var/lib/mysql
- ./mysql/conf.d:/etc/mysql/conf.d
ports:
- "3306:3306"
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 5s
timeout: 10s
retries: 10
networks:
- nacos_network
nacos:
image: nacos/nacos-server:v2.3.2
container_name: nacos-server
depends_on:
mysql:
condition: service_healthy
environment:
- PREFER_HOST_MODE=hostname
- MODE=standalone
- 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@123456
- MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false
- NACOS_AUTH_ENABLE=true
- NACOS_AUTH_TOKEN_EXPIRE_SECONDS=18000
- NACOS_AUTH_TOKEN=bmFjb3NfdG9rZW5fc2VjcmV0X2tleV8xMjM0NTY3ODkw
- NACOS_AUTH_CACHING_ENABLED=true
- JVM_XMS=512m
- JVM_XMX=512m
- JVM_XMN=256m
volumes:
- ./nacos/logs:/home/nacos/logs
- ./nacos/init.d:/home/nacos/init.d
ports:
- "8848:8848"
- "9848:9848"
- "9849:9849"
networks:
- nacos_network
restart: always
networks:
nacos_network:
driver: bridge
volumes:
mysql_data:
3.1 关键配置解析
MySQL连接配置 :
SPRING_DATASOURCE_PLATFORM=mysql:指定使用MySQL数据库MYSQL_SERVICE_HOST:MySQL服务地址MYSQL_SERVICE_DB_NAME:数据库名称MYSQL_SERVICE_USER/MYSQL_SERVICE_PASSWORD:数据库账号密码
鉴权相关配置 :
NACOS_AUTH_ENABLE=true:开启鉴权NACOS_AUTH_TOKEN:JWT令牌密钥,需Base64编码且长度≥32字符NACOS_AUTH_TOKEN_EXPIRE_SECONDS:token过期时间
JVM参数配置 :
JVM_XMS/JVM_XMX:初始和最大堆内存JVM_XMN:年轻代大小
4. 高级安全配置
4.1 自定义鉴权密钥
生产环境务必修改默认的鉴权密钥。可以通过以下步骤生成安全的密钥:
# 生成32位随机字符串
openssl rand -base64 32
# 输出示例:X5kD7pF2qR9wYtV3zU8xH6jM1nB4vC0lK9oP7iG2aN3mS5
将生成的字符串作为 NACOS_AUTH_TOKEN 环境变量的值。
4.2 修改默认管理员密码
部署完成后,第一时间修改默认的nacos/nacos账号密码:
- 访问Nacos控制台:http://localhost:8848/nacos
- 使用默认账号(nacos/nacos)登录
- 进入"权限控制"->"用户管理"
- 修改nacos用户的密码
也可以通过数据库直接修改:
UPDATE users SET password='$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu' WHERE username='nacos';
注意:数据库中的密码是BCrypt加密后的结果,不要直接存储明文密码
4.3 网络隔离建议
对于生产环境,建议采取以下网络隔离措施:
- 将Nacos和MySQL部署在同一内部网络中
- 只对外暴露Nacos的8848端口
- 配置IP白名单,限制访问来源
- 考虑使用VPN或专线访问生产环境
5. 验证与监控
5.1 服务健康检查
部署完成后,可以通过以下方式验证服务是否正常运行:
# 检查Nacos容器日志
docker logs -f nacos-server
# 检查健康状态
curl -X GET "http://localhost:8848/nacos/v1/ns/operator/metrics"
预期看到类似以下输出:
{
"status": "UP",
"mysql": {"status": "UP"},
"disk": {"status": "UP"},
"load": {"status": "UP"}
}
5.2 监控配置
建议配置以下监控指标:
-
系统级别 :
- CPU/Memory/Disk使用率
- 网络吞吐量
-
Nacos特定指标 :
- 注册服务数量
- 配置项数量
- 请求响应时间
- 活跃连接数
可以通过Prometheus收集Nacos metrics:
# prometheus.yml 配置示例
scrape_configs:
- job_name: 'nacos'
metrics_path: '/nacos/actuator/prometheus'
static_configs:
- targets: ['nacos-server:8848']
6. 常见问题排查
6.1 数据库连接问题
症状 :Nacos启动失败,日志中出现数据库连接错误
解决方案 :
- 检查MySQL服务是否正常运行
- 验证数据库连接参数是否正确
- 检查网络连通性:
docker exec -it nacos-server ping mysql
- 手动测试数据库连接:
docker exec -it nacos-server \
mysql -hmysql -unacos -pNacos@123456 nacos_config -e "SHOW TABLES;"
6.2 鉴权失效问题
症状 :即使开启了鉴权,仍然可以无需认证访问API
解决方案 :
- 确认环境变量
NACOS_AUTH_ENABLE=true已正确设置 - 检查Nacos日志中是否有鉴权相关的错误
- 验证
application.properties文件中鉴权配置是否生效:
docker exec -it nacos-server cat /home/nacos/conf/application.properties | grep auth
- 确保所有客户端都使用了正确的访问令牌
6.3 性能调优建议
当Nacos性能不佳时,可以考虑以下优化措施:
-
数据库优化 :
- 为常用查询添加索引
- 调整MySQL连接池参数
- 定期清理历史数据
-
JVM调优 :
environment: - JVM_XMS=2g - JVM_XMX=2g - JVM_XMN=1g - JVM_MS=128m - JVM_MMS=320m -
Nacos参数调整 :
- 调整配置项缓存大小
- 优化心跳检测间隔
7. 备份与恢复策略
7.1 数据库备份
定期备份MySQL数据库至关重要:
# 备份命令示例
docker exec nacos-mysql \
mysqldump -u root -pRoot@123456 nacos_config > nacos_backup_$(date +%Y%m%d).sql
# 恢复命令示例
docker exec -i nacos-mysql \
mysql -u root -pRoot@123456 nacos_config < nacos_backup_20240101.sql
7.2 配置导出
Nacos提供了配置导出功能:
# 导出所有配置
curl -X GET "http://localhost:8848/nacos/v1/cs/configs?export=true" \
-H "Authorization: Bearer $ACCESS_TOKEN" > nacos_config_export.zip
7.3 灾难恢复方案
建议制定完整的灾难恢复方案,包括:
- 定期全量备份+增量备份
- 备份验证机制
- 明确恢复流程和责任人
- 定期进行恢复演练
更多推荐
所有评论(0)