Docker安装Nacos指南


文章目录

    • 前言
    • 环境准备
    • 第一步:拉取镜像
    • 第二步:先跑一个临时容器(关键步骤)
      • [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 安装,一行命令就能把服务拉起来,省时省力。

本文将按以下流程安装:

  1. 拉取 Nacos 镜像
  2. 运行临时容器,导出配置文件
  3. 挂载目录,正式运行
  4. 用 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 的作用是把容器内部的文件拷贝到宿主机。这里我们把 confdata 两个核心目录都导了出来。

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


第三步:正式运行 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

几点说明:

  1. spring.datasource.platform 原来是被注释掉的,需要**取消注释并改为 **mysql
  2. 数据库 IP host.docker.internal 是 Docker 网络中访问宿主机的默认网关地址。如果你的 MySQL 跑在宿主机上,就用这个 IP;如果 MySQL 也在 Docker 里,用容器名或 docker network 分配的 IP
  3. 用户名和密码改成你自己的

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
相关推荐
梦仔生信进阶1 小时前
【本地数据传服务器命令】小文件Xftp,大文件用它更高效!
运维·服务器
“码”力全开1 小时前
解耦品牌壁垒:基于 Docker 与边缘计算的高并发视频中台架构(支持 GB28181/RTSP 统一接入与源码交付)
docker·音视频·边缘计算
wanhengidc1 小时前
服务器 数据恢复
运维·服务器·网络·智能手机·云计算
木卫二号Coding1 小时前
第八十五篇-CentOS-7 + Tesla V100 环境下 Docker 容器内编译部署 Qwen3.6-27B-MTP 大模型实战指南
linux·docker·centos
Irene19911 小时前
Win11 安装 Docker Desktop 并配置 WSL 使用 Hbase
docker·hbase
dongdonglele5211 小时前
ubuntu 系统x86 架构安装docker,可以使用本地显卡
ubuntu·docker·架构
日取其半万世不竭1 小时前
密码管理工具私有化部署,Vaultwarden 备份恢复怎么做?
数据库·docker·容器
无限进步_1 小时前
【Linux】GDB 调试:定位问题的利器
linux·运维·服务器
流觞 无依1 小时前
CentOS 7 系统中 systemd 组件的 CVE-2022-2526 漏洞修复
linux·运维·centos