Skip to content

解决Nacos容器本地环境下外部MySQL服务配置问题

详细记录在macOS环境下解决Nacos Docker容器连接本地MySQL数据库的完整过程,包含常见错误分析和解决方案

· 4 min ·

最近在配置Nacos服务时遇到了一个经典问题:Docker容器中的Nacos无法连接到本地MySQL数据库,报错 No DataSource set。经过一番摸索,终于找到了完整的解决方案。

问题现象#

启动Nacos容器后,查看日志发现以下错误:

Terminal window
Caused by: java.lang.IllegalStateException: No DataSource set
at org.springframework.util.Assert.state(Assert.java:76)
at org.springframework.jdbc.support.JdbcAccessor.obtainDataSource(JdbcAccessor.java:86)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:376)

最终导致Nacos启动失败:

Terminal window
ERROR Nacos failed to start, please see /home/nacos/logs/nacos.log for more details.

环境背景#

错误原因分析#

经过排查,发现问题主要来源于以下几个方面:

1. 配置文件冲突#

项目中存在两个数据源配置文件,配置参数不一致:

application.properties
db.url.0=jdbc:mysql://host.docker.internal:3306/pmhub-nacos
db.user=root
db.password=Baoyu273511a
Terminal window
# custom.env
MYSQL_SERVICE_HOST=192.168.164.128
MYSQL_SERVICE_DB_NAME=nacos
MYSQL_SERVICE_PASSWORD=123456

2. 数据库表结构缺失#

MySQL数据库虽然存在,但缺少Nacos所需的表结构。

3. 网络连接问题#

Docker容器无法正确访问宿主机的MySQL服务。

完整解决方案#

步骤1: 统一数据源配置#

首先修改 application.properties 文件,确保使用正确的网络地址:

src/conf/application.properties
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://host.docker.internal:3306/pmhub-nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user=root
db.password=你的MySQL密码
NOTE

在macOS Docker Desktop中,使用 host.docker.internal 可以访问宿主机服务

步骤2: 初始化数据库表结构#

Nacos需要特定的数据库表结构才能正常工作:

Terminal window
# 从Nacos容器导出SQL脚本
docker run --rm --entrypoint cat nacos/nacos-server:v2.2.3-slim /home/nacos/conf/mysql-schema.sql > /tmp/nacos-mysql.sql
# 导入到本地MySQL
mysql -h 127.0.0.1 -u root -p你的密码 pmhub-nacos < /tmp/nacos-mysql.sql

导入后,数据库应该包含以下12张表:

步骤3: 简化Docker运行配置#

使用最简洁的方式启动Nacos容器:

Terminal window
docker run -d \
--name nacos \
-p 8848:8848 \
-p 9848:9848 \
-p 9849:9849 \
-v /你的路径/nacos/conf/application.properties:/home/nacos/conf/application.properties \
nacos/nacos-server:v2.2.3-slim

步骤4: 验证启动结果#

查看Nacos启动日志:

Terminal window
docker logs nacos

成功启动的标志是看到以下信息:

Terminal window
Nacos started successfully in cluster mode. use external storage

验证服务状态#

1. 检查Web界面#

Terminal window
curl -s http://localhost:8848/nacos/ | grep -o "<title>.*</title>"
# 应该返回: <title>Nacos</title>

2. 检查数据库连接#

Terminal window
mysql -h 127.0.0.1 -u root -p -e "USE pmhub-nacos; SELECT COUNT(*) as config_count FROM config_info;"

3. 访问控制台#

打开浏览器访问:http://localhost:8848/nacos

默认登录信息:

常见问题排查#

问题1: 仍然提示”No DataSource set”#

解决方案: 检查配置文件是否正确挂载到容器中

Terminal window
# 检查容器内配置
docker exec nacos cat /home/nacos/conf/application.properties | grep db

问题2: 网络连接失败#

解决方案: 确保使用正确的网络地址

问题3: 数据库表不存在#

解决方案: 重新导入SQL脚本

Terminal window
# 检查表是否存在
mysql -h 127.0.0.1 -u root -p -e "USE pmhub-nacos; SHOW TABLES;"
# 如果表不存在,重新导入
docker run --rm --entrypoint cat nacos/nacos-server:v2.2.3-slim /home/nacos/conf/mysql-schema.sql | mysql -h 127.0.0.1 -u root -p pmhub-nacos

总结#

Nacos Docker容器连接本地MySQL的关键要点:

  1. 配置文件统一: 避免多个配置文件冲突
  2. 网络地址正确: 使用 host.docker.internal 访问宿主机
  3. 表结构完整: 确保导入Nacos所需的数据库表
  4. 挂载路径准确: 确保配置文件正确挂载到容器内

按照以上步骤,应该能够成功解决Nacos容器连接本地MySQL的问题。成功启动后,你将看到Nacos started successfully in cluster mode. use external storage的提示信息。


希望这篇详细的解决方案能帮助到你!如果还有其他问题,欢迎留言讨论。