最近在配置Nacos服务时遇到了一个经典问题:Docker容器中的Nacos无法连接到本地MySQL数据库,报错 No DataSource set。经过一番摸索,终于找到了完整的解决方案。
问题现象#
启动Nacos容器后,查看日志发现以下错误:
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启动失败:
ERROR Nacos failed to start, please see /home/nacos/logs/nacos.log for more details.环境背景#
- 操作系统: macOS (Darwin 25.0.0)
- Docker版本: Docker Desktop
- Nacos版本: nacos/nacos-server
.2.3-slim - MySQL版本: 本地MySQL 8.0
- 数据库: pmhub-nacos
错误原因分析#
经过排查,发现问题主要来源于以下几个方面:
1. 配置文件冲突#
项目中存在两个数据源配置文件,配置参数不一致:
db.url.0=jdbc:mysql://host.docker.internal:3306/pmhub-nacosdb.user=rootdb.password=Baoyu273511a# custom.envMYSQL_SERVICE_HOST=192.168.164.128MYSQL_SERVICE_DB_NAME=nacosMYSQL_SERVICE_PASSWORD=1234562. 数据库表结构缺失#
MySQL数据库虽然存在,但缺少Nacos所需的表结构。
3. 网络连接问题#
Docker容器无法正确访问宿主机的MySQL服务。
完整解决方案#
步骤1: 统一数据源配置#
首先修改 application.properties 文件,确保使用正确的网络地址:
spring.datasource.platform=mysqldb.num=1db.url.0=jdbc:mysql://host.docker.internal:3306/pmhub-nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTCdb.user=rootdb.password=你的MySQL密码NOTE
在macOS Docker Desktop中,使用 host.docker.internal 可以访问宿主机服务
步骤2: 初始化数据库表结构#
Nacos需要特定的数据库表结构才能正常工作:
# 从Nacos容器导出SQL脚本docker run --rm --entrypoint cat nacos/nacos-server:v2.2.3-slim /home/nacos/conf/mysql-schema.sql > /tmp/nacos-mysql.sql
# 导入到本地MySQLmysql -h 127.0.0.1 -u root -p你的密码 pmhub-nacos < /tmp/nacos-mysql.sql导入后,数据库应该包含以下12张表:
- config_info
- config_info_aggr
- config_info_beta
- config_info_tag
- config_tags_relation
- group_capacity
- his_config_info
- permissions
- roles
- tenant_capacity
- tenant_info
- users
步骤3: 简化Docker运行配置#
使用最简洁的方式启动Nacos容器:
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启动日志:
docker logs nacos成功启动的标志是看到以下信息:
Nacos started successfully in cluster mode. use external storage验证服务状态#
1. 检查Web界面#
curl -s http://localhost:8848/nacos/ | grep -o "<title>.*</title>"# 应该返回: <title>Nacos</title>2. 检查数据库连接#
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
默认登录信息:
- 用户名: nacos
- 密码: nacos
常见问题排查#
问题1: 仍然提示”No DataSource set”#
解决方案: 检查配置文件是否正确挂载到容器中
# 检查容器内配置docker exec nacos cat /home/nacos/conf/application.properties | grep db问题2: 网络连接失败#
解决方案: 确保使用正确的网络地址
- macOS/Windows:
host.docker.internal - Linux: 使用宿主机IP或
--network host
问题3: 数据库表不存在#
解决方案: 重新导入SQL脚本
# 检查表是否存在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的关键要点:
- 配置文件统一: 避免多个配置文件冲突
- 网络地址正确: 使用
host.docker.internal访问宿主机 - 表结构完整: 确保导入Nacos所需的数据库表
- 挂载路径准确: 确保配置文件正确挂载到容器内
按照以上步骤,应该能够成功解决Nacos容器连接本地MySQL的问题。成功启动后,你将看到Nacos started successfully in cluster mode. use external storage的提示信息。
希望这篇详细的解决方案能帮助到你!如果还有其他问题,欢迎留言讨论。
Nacos
MySQL