1. 为什么选择Docker部署Nacos?
Nacos作为阿里巴巴开源的动态服务发现、配置管理和服务管理平台,已经成为微服务架构中的核心组件之一。传统部署方式需要在服务器上手动安装JDK、配置数据库、设置启动参数等一系列繁琐操作,而Docker容器化部署方案完美解决了环境差异和依赖管理问题。
我在实际生产环境中使用Docker部署Nacos集群已有两年多经验,发现容器化部署相比传统方式具有三大优势:
- 环境隔离:避免与宿主机其他服务产生依赖冲突
- 快速部署:镜像包含所有运行时依赖,真正做到开箱即用
- 版本管理:可以方便地切换不同版本进行测试验证
2. 部署前的准备工作
2.1 系统环境检查
在开始部署前,建议先检查宿主机环境是否符合要求:
bash复制# 检查Docker是否安装
docker --version
# 检查Docker Compose是否可用(集群部署需要)
docker-compose --version
# 检查端口占用情况(Nacos默认使用8848端口)
netstat -tlnp | grep 8848
注意:如果使用云服务器,请确保安全组已开放8848(服务端口)、9848(集群RPC端口)和7848(集群选举端口)
2.2 存储方案选择
Nacos支持三种存储模式:
- 嵌入式Derby数据库(默认,仅适合测试)
- MySQL主从架构(生产推荐)
- 高可用集群模式(企业级)
对于生产环境,我强烈建议使用MySQL作为后端存储。这是我验证过的MySQL配置参数:
sql复制CREATE DATABASE nacos_config CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'nacos'@'%' IDENTIFIED BY 'nacos@123';
GRANT ALL PRIVILEGES ON nacos_config.* TO 'nacos'@'%';
FLUSH PRIVILEGES;
3. 单机版Nacos部署实战
3.1 拉取官方镜像
推荐使用Nacos官方维护的镜像,版本选择要考虑:
- 开发测试:最新tag(如nacos/nacos-server:latest)
- 生产环境:具体版本号(如nacos/nacos-server:2.0.3)
bash复制docker pull nacos/nacos-server:2.0.3
3.2 启动容器关键参数
这是经过生产验证的启动命令模板:
bash复制docker run -d \
--name nacos-standalone \
-p 8848:8848 \
-p 9848:9848 \
-e MODE=standalone \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=192.168.1.100 \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-e MYSQL_SERVICE_USER=nacos \
-e MYSQL_SERVICE_PASSWORD=nacos@123 \
-e JVM_XMS=512m \
-e JVM_XMX=512m \
--restart=always \
nacos/nacos-server:2.0.3
参数说明:
JVM_XMS/JVM_XMX:根据服务器内存调整,4G内存机器建议1-2GMYSQL_SERVICE_HOST:如果是容器内网络,使用Docker网络别名--restart=always:确保服务异常退出后自动重启
3.3 健康检查与日志查看
启动后建议进行健康检查:
bash复制# 查看容器状态
docker ps -f name=nacos-standalone
# 检查日志输出
docker logs -f --tail 100 nacos-standalone
# 接口健康检查
curl -X GET 'http://localhost:8848/nacos/v1/ns/service/list?pageNo=1&pageSize=2'
4. 集群模式部署方案
4.1 Docker Compose编排文件
这是我优化过的3节点集群compose模板(docker-compose-cluster.yml):
yaml复制version: '3'
services:
nacos1:
image: nacos/nacos-server:2.0.3
container_name: nacos-node1
ports:
- "8848:8848"
- "9848:9848"
volumes:
- ./cluster-logs/nacos1:/home/nacos/logs
environment:
- PREFER_HOST_MODE=hostname
- MODE=cluster
- NACOS_SERVERS=nacos-node1:8848 nacos-node2:8848 nacos-node3:8848
- SPRING_DATASOURCE_PLATFORM=mysql
- MYSQL_SERVICE_HOST=mysql-host
- MYSQL_SERVICE_DB_NAME=nacos_config
- MYSQL_SERVICE_USER=nacos
- MYSQL_SERVICE_PASSWORD=nacos@123
- JVM_XMS=2g
- JVM_XMX=2g
networks:
- nacos_net
nacos2:
image: nacos/nacos-server:2.0.3
container_name: nacos-node2
# 类似配置...
nacos3:
image: nacos/nacos-server:2.0.3
container_name: nacos-node3
# 类似配置...
networks:
nacos_net:
driver: bridge
4.2 集群部署注意事项
-
网络配置:
- 所有节点必须使用相同的自定义网络
- 节点间通信需要开放7848/9848端口
-
存储一致性:
- 必须使用共享MySQL数据库
- 避免使用本地文件存储配置
-
资源分配:
- 每个节点JVM堆内存建议不低于2GB
- 需要预留至少30%的系统内存给操作系统
5. 常见问题排查指南
5.1 启动失败问题
现象:容器不断重启,日志显示"Unable to start embedded Tomcat"
解决方案:
- 检查MySQL连接参数是否正确
- 确认数据库已创建且用户有权限
- 增加JVM内存参数:
bash复制
-e JVM_XMS=1g -e JVM_XMX=1g
5.2 客户端连接问题
现象:客户端报错"Connection refused"
排查步骤:
bash复制# 1. 检查容器端口映射
docker inspect nacos-standalone | grep HostPort
# 2. 测试容器内连通性
docker exec -it nacos-standalone curl localhost:8848
# 3. 检查防火墙规则
iptables -L -n | grep 8848
5.3 配置持久化异常
现象:重启后配置丢失
根本原因:
- 使用了嵌入式Derby数据库
- MySQL配置错误导致回退到Derby
彻底解决方案:
- 删除旧容器
- 清理数据卷:
bash复制
docker volume prune - 重新创建容器并确认MySQL连接成功
6. 生产环境优化建议
6.1 监控配置
推荐Prometheus监控指标采集配置:
yaml复制scrape_configs:
- job_name: 'nacos'
metrics_path: '/nacos/actuator/prometheus'
static_configs:
- targets: ['nacos-host:8848']
关键监控指标:
nacos_monitor{name='longPolling'}:长轮询连接数system_cpu_usage:CPU使用率jvm_memory_used_bytes:JVM内存使用
6.2 性能调优参数
在高负载场景下建议调整这些JVM参数:
bash复制-e JVM_XMS=4g \
-e JVM_XMX=4g \
-e NACOS_SERVER_IP=your-public-ip \
-e NACOS_AUTH_ENABLE=true \
-e NACOS_AUTH_TOKEN=your-secure-token
6.3 备份策略
建议的MySQL备份方案:
bash复制# 每日全量备份
mysqldump -u root -p nacos_config > nacos_$(date +%Y%m%d).sql
# 结合binlog实现增量备份
mysqlbinlog --start-datetime="2023-01-01 00:00:00" /var/lib/mysql/mysql-bin.000001
我在实际运维中发现,Nacos的配置数据虽然单条很小,但总量可能非常庞大。曾经遇到过一个案例:某业务系统频繁发布导致Nacos配置版本号超过100万,最终通过定期归档历史配置解决了性能问题