文章目录
-
- 前言
- 环境准备
- 第一步:拉取镜像
- 第二步:先跑一个临时容器(关键步骤)
-
- [2.1 启动临时容器](#2.1 启动临时容器)
- [2.2 导出配置文件和数据](#2.2 导出配置文件和数据)
- [第三步:正式运行 Nacos 容器](#第三步:正式运行 Nacos 容器)
-
- [3.1 删除临时容器](#3.1 删除临时容器)
- [3.2 启动正式容器(带目录挂载)](#3.2 启动正式容器(带目录挂载))
- [第四步:解决 Derby 启动报错](#第四步:解决 Derby 启动报错)
-
- [4.1 认识两个重要文件](#4.1 认识两个重要文件)
- [4.2 创建数据库并初始化](#4.2 创建数据库并初始化)
- [4.3 修改 Nacos 配置](#4.3 修改 Nacos 配置)
- [4.4 重新启动](#4.4 重新启动)
- [4.5 验证](#4.5 验证)
- 总结

前言
作为一名 Java 开发者,Nacos 这个名字你一定不陌生。它是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。简单来说,它身兼两职:注册中心 + 配置中心。
传统的安装方式需要下载压缩包、解压、配置 JDK、启动脚本......光环境准备就够折腾一阵子了。而用 Docker 安装,一行命令就能把服务拉起来,省时省力。
本文将按以下流程安装:
- 拉取 Nacos 镜像
- 运行临时容器,导出配置文件
- 挂载目录,正式运行
- 用 MySQL 替换 Derby,解决启动报错
环境准备
在开始之前,建议先创建一个工作目录,用于存放 Nacos 的配置文件、数据文件和日志。这样做的好处是:即使容器被删了,数据还在。
我在 E:\docker 下创建了一个 空白的 nacos 文件夹:

第一步:拉取镜像
本文以 v2.2.3 版本为例。打开终端,执行:
bash
docker pull nacos/nacos-server:v2.2.3
镜像拉完之后,验证一下:
bash
docker images
如果列表中出现了 nacos/nacos-server 且 TAG 为 v2.2.3,说明下载成功。
小贴士 :如果不指定版本号(即
docker pull nacos/nacos-server),Docker 默认拉取latest标签。但在生产环境中,强烈建议指定明确的版本号,避免因版本差异导致不可预期的问题。

第二步:先跑一个临时容器(关键步骤)
镜像拉好了,为什么不直接一步到位运行最终容器?这里有一个很常见的坑:你需要先把容器里的配置文件复制出来,否则等会儿做目录挂载时,宿主机上的空文件夹会把容器里的配置"覆盖"掉,导致 Nacos 启动失败。
所以正确的姿势是:先跑一个临时容器,把配置文件拷出来,再删掉它。
2.1 启动临时容器
bash
docker run -d --name nacos --env MODE=standalone -p 8848:8848 -p 9848:9848 nacos/nacos-server:v2.2.3
各参数含义:
| 参数 | 说明 |
|---|---|
-d |
后台运行容器(detached mode) |
--name nacos |
给容器起个名字,方便后续操作 |
--env MODE=standalone |
以单机模式运行。Nacos 支持单机模式和集群模式,开发/测试环境用单机就够了 |
-p 8848:8848 |
将宿主机的 8848 端口映射到容器的 8848 端口(Nacos 默认端口) |
-p 9848:9848 |
将 9848 端口映射出来,用于 gRPC 通信(Nacos 2.x 新增) |
执行后,用 docker ps 确认容器已经在跑。

此时访问 http://localhost:8848/nacos,你应该能看到 Nacos 的登录页面了。默认用户名和密码都是 nacos。
2.2 导出配置文件和数据
bash
docker cp nacos:/home/nacos/conf E:\docker\nacos\conf
docker cp nacos:/home/nacos/data E:\docker\nacos\data
docker cp 的作用是把容器内部的文件拷贝到宿主机。这里我们把 conf 和 data 两个核心目录都导了出来。

复制成功后,可以打开对应文件夹,看看是否复制成功了:

第三步:正式运行 Nacos 容器
3.1 删除临时容器
bash
docker rm -f nacos
-f 参数表示强制删除,即使容器正在运行。

3.2 启动正式容器(带目录挂载)
bash
docker run -d --name nacos --privileged -e MODE=standalone -e JVM_XMX=300m -e JVM_XMS=300m -p 8848:8848 -p 9848:9848 -v E:\docker\nacos\conf:/home/nacos/conf -v E:\docker\nacos\data:/home/nacos/data -v E:\docker\nacos\logs:/home/nacos/logs nacos/nacos-server:v2.2.3
对比临时容器,这里多了几个关键参数:
| 参数 | 说明 |
|---|---|
--privileged |
以特权模式运行,赋予容器更高的系统权限 |
-e JVM_XMX=300m |
JVM 最大堆内存 300MB |
-e JVM_XMS=300m |
JVM 初始堆内存 300MB(与 Xmx 设成一样,避免 JVM 动态伸缩带来的性能开销) |
-v 宿主机路径:容器路径 |
目录挂载,这是持久化的核心 |
为什么要挂载三个目录?
- conf:配置文件在外面,改配置不用进容器
- data:数据落盘到宿主机,容器删了数据还在
- logs:方便排查问题时直接看日志
至此,一个"正经"的 Nacos 单机环境就搭好了 🎉
第四步:解决 Derby 启动报错
正常来说,直接启动的话会启动不起来,翻看日志,发现报错:
plain
load derby-schema.sql error
这是因为 Nacos 默认使用内嵌的 Derby 数据库 ,在某些环境下初始化会失败。解决方案很简单:换 MySQL。
4.1 认识两个重要文件
在 E:\docker\nacos\conf 目录下,有两个文件需要关注:
application.properties--- Nacos 的主配置文件,在这里改数据库连接mysql-schema.sql--- MySQL 初始化脚本,包含 Nacos 需要的所有表结构
4.2 创建数据库并初始化
用 Navicat(或其他工具)连上你的 MySQL,创建一个新库:
sql
CREATE DATABASE nacos_config DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

然后,把 mysql-schema.sql 里的 SQL 全部执行一遍。这个脚本会创建以下核心表:
| 表名 | 用途 |
|---|---|
config_info |
配置信息主表 |
config_info_aggr |
聚合配置 |
config_info_beta |
Beta 版配置 |
config_info_tag |
配置标签 |
his_config_info |
配置变更历史 |
tenant_info |
租户信息 |
users / roles / permissions |
用户权限相关 |


脚本还贴心地插入了一条默认管理员记录:
- 用户名:
nacos - 密码:
nacos(BCrypt 加密存储)
4.3 修改 Nacos 配置
编辑 E:\docker\nacos\conf\application.properties,找到数据库相关配置,改成这样:
properties
spring.datasource.platform=mysql
db.url.0=jdbc:mysql://host.docker.internal:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false
db.user.0=root
db.password.0=your_password
几点说明:
spring.datasource.platform原来是被注释掉的,需要**取消注释并改为 **mysql- 数据库 IP
host.docker.internal是 Docker 网络中访问宿主机的默认网关地址。如果你的 MySQL 跑在宿主机上,就用这个 IP;如果 MySQL 也在 Docker 里,用容器名或docker network分配的 IP - 用户名和密码改成你自己的
4.4 重新启动
保存配置后,删除旧容器,重新执行启动命令:
bash
docker run -d --name nacos --privileged -e MODE=standalone -e JVM_XMX=300m -e JVM_XMS=300m -p 8848:8848 -p 9848:9848 -v E:\docker\nacos\conf:/home/nacos/conf -v E:\docker\nacos\data:/home/nacos/data -v E:\docker\nacos\logs:/home/nacos/logs nacos/nacos-server:v2.2.3
这次因为配置文件已经指向了 MySQL,Nacos 启动后会连接 nacos_config 库,不再依赖内嵌的 Derby 数据库,启动报错自然就消失了。
4.5 验证
再次访问 http://localhost:8848/nacos,登录后进入「命名空间」菜单,试着新建一个命名空间。如果能正常创建,并且在 tenant_info 表中能看到新纪录,就说明一切正常 ✅


下次想启动nacos时,直接运行
plain
docker start nacos
一劳永逸。
总结
回顾一下,整个安装流程其实就四步:
plain
拉取镜像 → 跑临时容器拷配置 → 挂载目录正式运行 → 切 MySQL