在 Docker 中部署 Nacos 单机模式需设置环境变量 MODE=standalone,数据持久化推荐配置外部 MySQL 数据库,若使用内置 Derby 数据库则必须挂载/home/nacos/data 目录。适用场景为本地开发测试或非高可用生产环境,风险边界在于内置数据库不支持集群且容器删除后未挂载卷会导致数据丢失。
先说结论:Docker 部署 Nacos 单机版关键在于正确设置运行模式环境变量并规划数据存储方案,避免容器重启后配置丢失。
- 适合:本地开发调试、功能验证、小规模单机试用场景。
- 先准备:确认 Docker 环境可用,若需可靠持久化需预先创建 MySQL 数据库。
- 验收:通过控制台登录验证,且重启容器后已创建的配置和服务信息依然存在。
命令速用版
以下命令基于 nacos/nacos-server 镜像,开启单机模式并映射必要端口,数据持久化采用挂载卷方式(内置 Derby)。
docker run -d \
`--name` nacos-standalone \
-e MODE=standalone \
-p 8848:8848 \
-p 9848:9848 \
-p 9849:9849 \
-v /opt/nacos/data:/home/nacos/data \
-v /opt/nacos/logs:/home/nacos/logs \
nacos/nacos-server:latest若使用 MySQL 持久化,需额外配置 SPRING_DATASOURCE_PLATFORM=mysql 及相关数据库连接环境变量。
为什么会这样
Nacos 默认以集群模式启动,Docker 单机部署必须显式指定 MODE=standalone 否则容器会因找不到集群节点而启动失败。数据持久化方面,Nacos 内置 Derby 数据库文件存储在容器内部路径,容器销毁即丢失,必须通过 Docker 卷挂载映射到宿主机;而生产环境通常建议使用外部 MySQL 存储配置数据,此时数据持久化由 MySQL 保证,Nacos 容器本身无状态。
分步处理
第一步:拉取镜像。执行 docker pull nacos/nacos-server:latest 获取官方镜像,避免使用来源不明的第三方镜像。
第二步:准备存储。若使用内置数据库,在宿主机创建目录 mkdir -p /opt/nacos/data;若使用 MySQL,提前建库并导入官方提供的 schema 脚本。
第三步:启动容器。根据持久化方案选择环境变量,内置数据库仅需 MODE=standalone,MySQL 方案需增加 SPRING_DATASOURCE_PLATFORM=mysql、MYSQL_SERVICE_HOST 等参数。
第四步:端口映射。Nacos 2.x 版本除 8848 外还需映射 9848 和 9849 端口用于 gRPC 通信,否则客户端无法连接。
怎么验证是否生效
查看容器日志。执行 docker logs -f nacos-standalone,观察是否有 Nacos started in 字样,确认无报错。
访问控制台。浏览器打开 http://宿主机 IP:8848/nacos,默认账号密码 nacos/nacos 能成功登录。
验证持久化。在控制台创建一个配置项,重启容器 docker restart nacos-standalone,再次登录控制台确认该配置项仍然存在。
常见坑
端口遗漏导致连接失败。Nacos 2.x 客户端使用 gRPC 协议,若只映射 8848 端口,控制台能打开但 SDK 无法注册服务,需补全 9848 和 9849 端口映射。
内置数据库数据丢失。未挂载/home/nacos/data 目录直接运行容器,容器删除后所有配置数据清空,仅限临时测试使用。
MySQL 驱动兼容性问题。使用外部 MySQL 时,若版本过高或过低可能报驱动错误,建议参考官方文档匹配 MySQL 版本。
常见问题
单机模式必须用 MySQL 吗?
不是必须,内置 Derby 数据库支持单机持久化,但 MySQL 更适合生产环境。
容器重启后配置丢失怎么办?
检查是否挂载了/home/nacos/data 卷,或确认 MySQL 连接配置是否正确。
为什么控制台能登录但客户端连不上?
检查 Docker 端口映射是否包含 9848 和 9849,Nacos 2.x 依赖这两个端口进行通信。
参考来源
Nacos 官方文档 - 快速开始指南,https://nacos.io/zh-cn/docs/quick-start.html
Nacos Docker 仓库 - GitHub README,https://github.com/nacos-group/nacos-docker