Docker部署Nacos与MySQL持久化存储实战指南

发布时间:2026/10/20 4:01:14

Docker部署Nacos与MySQL持久化存储实战指南 1. 为什么选择 Docker 部署 Nacos 与 MySQL 持久化方案1.1 从一次服务注册中心迁移说起去年帮一个朋友处理他们团队的服务注册中心迁移原来用的是单机版的注册中心配置文件散落在各个服务器上每次重启服务都要手动去检查配置有没有丢。后来他们决定换成 Nacos但面临一个很现实的问题怎么部署才能既方便管理又不会因为容器重启导致配置数据丢失。这个问题其实很典型很多团队在容器化改造过程中都会遇到核心矛盾就是容器的无状态特性与注册中心/配置中心的有状态需求之间的冲突。Nacos 作为服务注册与配置管理的中间件它自身需要存储两类关键数据一类是服务注册信息另一类是配置数据。默认情况下Nacos 使用内嵌的 Derby 数据库这种模式只适合单机测试一旦容器重建所有数据都会归零。所以生产环境或者长期使用的开发环境必须把数据落到外部 MySQL 中并且 MySQL 本身也要做持久化。这就是“Docker 安装 Nacos MySQL 持久化存储”这个组合方案要解决的核心问题。这个方案适合谁呢如果你正在搭建微服务架构的开发和测试环境或者需要一套轻量级、可快速复制、数据不丢失的服务注册与配置中心那这套方案就是为你准备的。哪怕你之前没怎么接触过 Docker 网络和存储卷跟着下面的思路走也能把环境搭起来。1.2 整体架构与数据流向拆解在动手之前先把整个架构在脑子里过一遍。我们会有两个核心容器一个跑 MySQL一个跑 Nacos。Nacos 容器启动时会去连接 MySQL 容器把配置数据和服务注册信息写入 MySQL 的指定库中。MySQL 容器则通过 Docker 的存储卷机制把数据目录挂载到宿主机上这样即使容器被删除数据文件依然保留在宿主机下次重新创建容器时挂载同一个目录数据就回来了。这里有一个关键点Nacos 和 MySQL 之间的网络通信。在 Docker 环境下最稳妥的方式是创建一个自定义的 bridge 网络让两个容器加入同一个网络这样它们可以通过容器名称直接互相访问不用关心 IP 地址变化。相比用--link或者宿主机 IP自定义网络更干净也更符合现在的实践标准。数据流向可以这样理解Nacos 容器启动后读取环境变量中的数据库连接信息主动连接 MySQL 容器在指定的数据库里建表并读写数据。MySQL 容器把数据文件写到挂载点宿主机上的目录就成了数据的最终落脚点。整个链路里只要宿主机目录不删数据就不会丢。1.3 方案选型背后的几个考量为什么不用 Docker Compose 一把梭当然可以用而且后面我也会给出 Compose 的写法。但一开始用命令行逐步操作能让你更清楚地看到每个环节在做什么出了问题也更容易定位。等你理解了每一步再用 Compose 去简化就是水到渠成的事。为什么 MySQL 不直接用latest标签这是一个经验教训。latest意味着每次拉取都可能拿到新版本不同版本之间的数据目录格式可能有差异一旦版本升级导致数据目录不兼容恢复起来非常麻烦。所以一定要指定一个明确的版本号比如8.0或者5.7并且在整个环境中保持一致。为什么 Nacos 要用 standalone 模式因为我们在搭建的是单机环境不是集群。standalone 模式启动快、资源占用少适合开发和测试。如果以后要上生产集群那是另一套部署逻辑需要至少三个 Nacos 节点和外部数据库配合那是后话。2. 环境准备与基础配置实操2.1 Docker 环境检查与目录规划动手之前先确认 Docker 环境是正常的。打开终端执行docker version能看到 Client 和 Server 两部分信息就说明 Docker 已经就绪。如果 Server 部分报错那可能是 Docker 服务没启动需要先启动服务。接着执行docker network ls看看当前有哪些网络后面我们要创建一个新的。接下来规划宿主机上的目录。我习惯把这类中间件的数据统一放在/data下面比如 MySQL 的数据目录用/data/mysql/dataNacos 的日志目录用/data/nacos/logs。这样做的好处是备份和迁移的时候目标明确不会到处找文件。你可以根据自己的磁盘情况调整路径但建议不要放在/tmp或者用户主目录下避免系统清理或者权限问题。创建目录的命令很简单mkdir -p /data/mysql/data mkdir -p /data/mysql/conf mkdir -p /data/nacos/logs这里多建了一个/data/mysql/conf是为了后面挂载自定义的 MySQL 配置文件。虽然可以直接用默认配置但把配置显式挂载出来以后要调整字符集或者连接数就方便多了不用进容器改。注意如果你用的是 macOS 或者 Windows 上的 Docker Desktop宿主机目录的权限映射和 Linux 有些差异建议把数据目录放在 Docker Desktop 的文件共享范围内否则挂载可能失败。2.2 创建专用网络与 MySQL 容器启动先创建自定义网络docker network create nacos-net这个网络的名字叫nacos-net后面两个容器都加入这个网络。创建完之后可以用docker network inspect nacos-net看一下确认创建成功。接下来启动 MySQL 容器。这里我用 MySQL 8.0 版本命令如下docker run -d \ --name mysql-nacos \ --network nacos-net \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORDroot123456 \ -e MYSQL_DATABASEnacos_config \ -v /data/mysql/data:/var/lib/mysql \ -v /data/mysql/conf:/etc/mysql/conf.d \ --restart unless-stopped \ mysql:8.0逐段解释一下这些参数。-d是后台运行。--name mysql-nacos给容器起个名字方便后续引用。--network nacos-net让容器加入刚才创建的网络。-p 3306:3306把容器端口映射到宿主机这样你从宿主机也能连上 MySQL 进行管理。-e设置环境变量MYSQL_ROOT_PASSWORD是 root 密码MYSQL_DATABASE指定启动时自动创建一个名为nacos_config的数据库省得后面手动建。-v挂载存储卷把宿主机的数据目录和配置目录映射到容器内。--restart unless-stopped让容器在意外退出时自动重启除非你手动停止它。启动之后用docker ps看一下容器状态如果状态是Up就没问题。再用docker logs mysql-nacos看看日志确认没有报错。有时候 MySQL 启动会花几秒钟初始化稍等片刻再连。2.3 Nacos 容器启动与数据库连接配置MySQL 就绪后启动 Nacos 容器。这里用 Nacos 2.x 的镜像命令如下docker run -d \ --name nacos-server \ --network nacos-net \ -p 8848:8848 \ -p 9848:9848 \ -e MODEstandalone \ -e SPRING_DATASOURCE_PLATFORMmysql \ -e MYSQL_SERVICE_HOSTmysql-nacos \ -e MYSQL_SERVICE_PORT3306 \ -e MYSQL_SERVICE_DB_NAMEnacos_config \ -e MYSQL_SERVICE_USERroot \ -e MYSQL_SERVICE_PASSWORDroot123456 \ -e MYSQL_SERVICE_DB_PARAMcharacterEncodingutf8connectTimeout1000socketTimeout3000autoReconnecttrueuseSSLfalseallowPublicKeyRetrievaltrue \ -v /data/nacos/logs:/home/nacos/logs \ --restart unless-stopped \ nacos/nacos-server:v2.2.0这里有几个关键点需要展开说。MODEstandalone指定单机模式。SPRING_DATASOURCE_PLATFORMmysql告诉 Nacos 使用 MySQL 作为数据源而不是内嵌的 Derby。MYSQL_SERVICE_HOST填的是 MySQL 容器的名称mysql-nacos因为两个容器在同一个自定义网络里Docker 内置的 DNS 会把容器名称解析成对应的 IP所以这里不需要填 IP 地址。MYSQL_SERVICE_DB_PARAM里的参数很重要特别是useSSLfalse和allowPublicKeyRetrievaltrueMySQL 8.0 默认要求 SSL 连接不加这两个参数可能会连接失败。-p 9848:9848是 Nacos 2.x 新增的 gRPC 端口客户端通信需要用到别忘了映射。启动之后同样用docker ps和docker logs nacos-server检查状态。如果日志里出现 “Nacos started successfully in stand alone mode” 这样的字样就说明启动成功了。3. 持久化验证与核心配置细节3.1 验证 MySQL 数据卷挂载是否生效容器跑起来只是第一步真正要确认的是数据有没有落到宿主机上。先进入 MySQL 容器看看nacos_config数据库里有没有 Nacos 自动建的表docker exec -it mysql-nacos mysql -uroot -proot123456 -e use nacos_config; show tables;如果看到config_info、config_info_beta、his_config_info、users等表说明 Nacos 已经成功连接 MySQL 并完成了初始化建表。这些表就是 Nacos 存储配置数据的地方。接着在宿主机上查看/data/mysql/data目录ls -lh /data/mysql/data/nacos_config/你应该能看到对应数据库的目录和文件。这就证明数据确实写到了宿主机上而不是留在容器内部。为了进一步验证持久化效果可以做一个简单的测试在 Nacos 控制台新建一个配置然后删除 Nacos 容器和 MySQL 容器再重新创建它们挂载同样的目录看看配置还在不在。这个测试虽然有点“暴力”但最能说明问题。提示删除容器时用docker rm -f强制删除但千万不要加-v参数去删除存储卷否则宿主机上的数据目录也会被清掉。3.2 Nacos 连接 MySQL 的常见配置陷阱在实际操作中Nacos 连接 MySQL 失败是最常见的问题。根据我的经验主要有以下几个原因。第一个是网络不通。如果 Nacos 容器和 MySQL 容器不在同一个自定义网络里Nacos 就无法通过容器名称解析到 MySQL 的地址。解决办法就是确保两个容器都加入了同一个网络可以用docker network inspect nacos-net查看网络中的容器列表。第二个是MySQL 8.0 的认证插件问题。MySQL 8.0 默认使用caching_sha2_password认证插件而一些旧版本的客户端可能不支持。虽然 Nacos 2.x 已经兼容了但如果在连接参数里没加allowPublicKeyRetrievaltrue仍然可能被拒绝。所以那个连接参数一定要带上。第三个是数据库字符集问题。如果 MySQL 的字符集不是utf8或utf8mb4Nacos 建表时可能报错。可以在启动 MySQL 容器时通过配置文件指定字符集或者在连接参数里加上characterEncodingutf8。我通常会在/data/mysql/conf下放一个my.cnf文件内容如下[mysqld] character-set-serverutf8mb4 collation-serverutf8mb4_unicode_ci然后重启 MySQL 容器让配置生效。第四个是时区问题。容器内的时区默认可能是 UTC导致 Nacos 记录的时间戳和本地时间差几个小时。可以在启动容器时加上-e TZAsia/Shanghai来指定时区MySQL 和 Nacos 都加上。3.3 数据备份与恢复的实操思路持久化解决了数据不丢的问题但备份是另一层保障。对于 MySQL 数据最直接的备份方式是用mysqldump导出 SQL 文件docker exec mysql-nacos mysqldump -uroot -proot123456 nacos_config /data/backup/nacos_config_$(date %Y%m%d).sql这条命令把nacos_config数据库导出到宿主机的备份目录文件名带日期方便区分。恢复的时候用mysql命令导入即可docker exec -i mysql-nacos mysql -uroot -proot123456 nacos_config /data/backup/nacos_config_20240101.sql除了逻辑备份也可以直接备份宿主机的/data/mysql/data目录但这种方式要求 MySQL 容器停止运行否则数据文件可能处于不一致状态。所以日常备份用mysqldump整机迁移时再考虑物理备份。Nacos 自身的配置数据都在 MySQL 里所以备份了 MySQL 就相当于备份了 Nacos 的配置。但 Nacos 的日志目录/data/nacos/logs也建议保留排查问题时用得上。4. 常见问题排查与经验总结4.1 容器启动失败与连接超时排查Nacos 容器启动失败最常见的原因是它启动时 MySQL 还没完全就绪。虽然 Docker 的--restart策略会让容器不断重启但 Nacos 可能在 MySQL 初始化完成之前就尝试连接导致启动失败。解决办法有两个一是先启动 MySQL等它完全就绪后再启动 Nacos二是给 Nacos 加上重试机制不过 Nacos 本身没有这个配置所以还是推荐第一种。怎么判断 MySQL 是否就绪可以执行docker exec mysql-nacos mysqladmin -uroot -proot123456 ping如果返回mysqld is alive就说明 MySQL 已经可以接受连接了。另一个常见问题是端口冲突。如果宿主机上已经有 MySQL 在跑3306 端口被占用容器启动时会报错。可以用netstat -tlnp | grep 3306检查端口占用情况如果确实被占用可以把宿主机的映射端口改成 3307但要注意 Nacos 连接 MySQL 时用的是容器内部的 3306 端口所以 Nacos 的环境变量里MYSQL_SERVICE_PORT仍然填 3306不需要改。4.2 Nacos 控制台无法访问的几种可能Nacos 启动成功后浏览器访问http://宿主机IP:8848/nacos应该能看到登录页面。如果访问不了按以下顺序排查。先确认容器是否在运行docker ps | grep nacos。如果容器没在运行看日志找原因。如果容器在运行但访问不了检查防火墙或安全组是否放行了 8848 端口。在本地开发环境有时候是宿主机的防火墙拦截了可以临时关闭防火墙测试。还有一种情况是 Nacos 启动成功但控制台返回 404。这通常是因为访问路径不对Nacos 2.x 的默认路径是/nacos不要漏掉。如果还是不行检查一下 Nacos 的版本和镜像标签是否匹配有些旧版本的路径可能不同。登录时默认用户名和密码都是nacos如果提示密码错误可能是之前改过密码但忘记了。这时候可以进 MySQL 数据库找到users表把密码字段重置为默认值的 MD5 哈希或者直接删掉users表里的记录让 Nacos 重新初始化。不过删记录的方式比较粗暴建议先备份。4.3 持久化方案的经验与避坑清单经过多次搭建和迁移我整理了几条比较实用的经验。第一目录权限要提前处理好。MySQL 容器内的进程以mysql用户运行UID 通常是 999。如果宿主机上的/data/mysql/data目录权限不对MySQL 启动时会报权限错误。解决办法是提前把目录所有者改成 999chown -R 999:999 /data/mysql/data第二不要随意升级镜像版本。前面提过MySQL 和 Nacos 的版本一旦确定就不要轻易改动。如果确实需要升级先备份数据然后在测试环境验证升级路径确认没问题再动生产环境。第三Nacos 的MYSQL_SERVICE_DB_PARAM参数要完整。我见过有人只写了数据库名和密码没写连接参数结果 Nacos 启动时报各种奇怪的错误。把完整的连接参数带上能避免很多麻烦。第四定期检查磁盘空间。MySQL 的数据文件和 Nacos 的日志都会不断增长如果宿主机磁盘满了容器会出问题。可以设置一个简单的监控脚本定期检查/data目录的使用率。第五用 Docker Compose 管理多容器环境。当容器数量多起来之后命令行启动的方式就显得繁琐了。把 MySQL 和 Nacos 的配置写进docker-compose.yml一条命令就能拉起整个环境也方便版本管理和团队共享。下面是一个参考配置version: 3.8 services: mysql: image: mysql:8.0 container_name: mysql-nacos networks: - nacos-net ports: - 3306:3306 environment: MYSQL_ROOT_PASSWORD: root123456 MYSQL_DATABASE: nacos_config TZ: Asia/Shanghai volumes: - /data/mysql/data:/var/lib/mysql - /data/mysql/conf:/etc/mysql/conf.d restart: unless-stopped nacos: image: nacos/nacos-server:v2.2.0 container_name: nacos-server networks: - nacos-net ports: - 8848:8848 - 9848:9848 environment: MODE: standalone SPRING_DATASOURCE_PLATFORM: mysql MYSQL_SERVICE_HOST: mysql-nacos MYSQL_SERVICE_PORT: 3306 MYSQL_SERVICE_DB_NAME: nacos_config MYSQL_SERVICE_USER: root MYSQL_SERVICE_PASSWORD: root123456 MYSQL_SERVICE_DB_PARAM: characterEncodingutf8connectTimeout1000socketTimeout3000autoReconnecttrueuseSSLfalseallowPublicKeyRetrievaltrue TZ: Asia/Shanghai volumes: - /data/nacos/logs:/home/nacos/logs depends_on: - mysql restart: unless-stopped networks: nacos-net: driver: bridge用 Compose 的时候depends_on只能保证启动顺序不能保证 MySQL 完全就绪后再启动 Nacos所以如果遇到 Nacos 启动失败还是需要手动重启一下 Nacos 容器或者等 MySQL 就绪后再执行docker-compose up -d nacos。这套方案我在几个不同的环境里都跑过从开发机到测试服务器只要目录挂载正确、网络配置无误基本都是一次成功。真正容易出问题的地方往往不是技术本身而是细节端口有没有冲突、权限对不对、参数有没有漏。把这些细节提前想到后面就能省下大量排查时间。
延伸阅读

更多相关文章

2026/10/20 3:56:13

使用WorkBuddy随笔

下载WorkBuddy,并安装;很简单,开箱即用。 与豆包,元宝等AI应用相同的功能就不说了,WorkBuddy最显著的特点是能够处理本地文件和使用本地软件。 由“顾问”进化为“数字员工”,你只需要有目标,当…

2026/10/20 3:56:13

XM Music:一个只属于你自己的开源音乐播放器

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 3:56:13

Kubernetes Operator原理精讲:Reconcile与Informer机制及Kubebuilder实践

如果你已经在 Kubernetes 上部署过几次应用,大概率遇到过这种情况:Deployment 挂了三副本,其中一副本被 node 驱逐,过一会儿它自己又起来了——这是内置控制器在做"心愿达成";但你要是部署的是一个有状态的东…

2026/10/20 5:26:23

舵机PIDt调参

舵机内部通常就在跑 PID,外部控制器也可能再跑一层 PID。 所以它们不是一回事,但关系非常紧密:舵机是“带 PID 闭环的执行器”,PID 是让它精准转到目标角度的算法。🔧 舵机内部:自带一层 PID你给舵机发的是…

2026/10/20 5:26:23

VS2019 Darcula护眼主题深度移植指南

1. 为什么VS2019原生黑色主题不等于“护眼”——从人因工程角度拆解视觉疲劳根源很多人在深夜调试代码时,第一反应是把Visual Studio 2019调成“深色模式”,以为这就完成了护眼闭环。我带过三届某高校软件工程方向的实训项目,每次开班第一周&…

2026/10/20 5:26:23

【机器人】MicroDuck仿真问题记录

Q1:curl -L -o alpha_walking.onnx 网页前缀alpha_walking.onnx下载超时A1:使用国内镜像站curl -L -o alpha_walking.onnx https://hf-mirror.com/源目录alpha_walking.onnx其他镜像备选:除 hf-mirror.com 外,还可尝试:上海交大镜像&#xff…

2026/10/20 5:26:23

Windows AppData空间暴增真相:用Codex精准定位87.81GB占用源

1. 这不是“垃圾文件”,是系统在悄悄存档你的数字生活你有没有某天打开资源管理器,突然发现C盘只剩不到5GB可用空间,红色警告条刺眼地横在磁盘图标上?手指悬在鼠标左键上方,本能想点开“临时文件”“回收站”“下载目录…

2026/10/20 5:26:23

数据流分析详解:从到达定值到活跃变量与可用表达式

1. 数据流分析到底在回答什么问题数据流分析是软件分析课程里最硬核、也最容易被低估的一讲。我刚接触这门经典公开课时,听完到达定值分析的整套定义、传递函数和迭代算法,觉得自己理解得差不多了;等学到活跃变量分析,方向从前往后…

2026/10/19 18:06:35

金融AI落地指南:从调研报告到技术选型与工程实践

简介:这份PDF报告聚焦2025年金融服务业中国AI现状与趋势,面向金融科技从业者、AI战略规划人员及关注行业数字化转型的研究者,帮助读者把握生成式AI在银行、支付、交易等场景中的落地路径与投资方向。资源包内含1个PDF文件,大小约1…

2026/10/20 1:05:37

单片机C运行时从启动到多任务:中断安全与共享资源冲突

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:05:37

GCC编译四步详解:预处理、编译、汇编、链接实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:05:37

FIW线是什么?FEP注塑线与普通氟塑料线的区别及应用指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑