Spring Boot通过Docker Compose连接MySQL出现连接拒绝问题求助
排查Spring Boot + Docker Compose MySQL连接拒绝问题
以下是针对该场景的具体排查步骤:
1. 确认MySQL容器服务完全就绪
Docker Compose的depends_on仅保证容器启动顺序,不确保MySQL服务已完成初始化并接受连接:
- 查看MySQL容器日志,确认服务就绪状态:
查找包含docker logs <你的MySQL容器ID或名称>ready for connections的日志条目,同时检查初始化脚本init-db.sql是否执行成功无报错。 - 进入后端容器,测试与MySQL容器的网络连通性:
连接失败则说明网络或MySQL服务本身存在问题。docker exec -it <你的后端容器ID或名称> telnet data-base 3306 # 容器内有nc的话也可以用: docker exec -it <你的后端容器ID或名称> nc -zv data-base 3306
2. 验证后端容器环境变量加载情况
- 进入后端容器,核对环境变量是否与Docker Compose配置一致:
确认输出的docker exec <你的后端容器ID或名称> printenv | grep MYSQLMYSQL_HOST=data-base、MYSQL_PORT=3306、MYSQL_USER=root、MYSQL_PASSWORD=password000完全匹配配置内容。 - 查看Spring Boot启动日志,搜索
DataSource相关条目,确认实际使用的URL为jdbc:mysql://data-base:3306/app1,而非默认的127.0.0.1:3306。
3. 检查MySQL用户权限配置
MySQL 8.0默认root用户仅允许localhost连接,即使在Docker容器内也可能存在权限限制:
- 进入MySQL容器并登录:
docker exec -it <你的MySQL容器ID或名称> mysql -uroot -ppassword000 - 查询root用户的允许连接主机:
SELECT user, host FROM mysql.user WHERE user='root'; - 如果结果中
host为localhost,执行以下命令修改为允许所有主机连接(测试环境适用,生产环境建议创建专用业务用户):ALTER USER 'root'@'%' IDENTIFIED BY 'password000'; FLUSH PRIVILEGES;
4. 确认MySQL容器内部端口监听状态
- 检查MySQL容器内部是否正常监听3306端口:
确保输出显示docker exec <你的MySQL容器ID或名称> netstat -tulpn | grep 33060.0.0.0:3306或:::3306,说明端口处于正常监听状态。
5. 清理容器状态并重启
若上述检查均正常,尝试清理容器缓存并重启:
# 测试环境适用,会删除容器、网络和卷,注意备份数据 docker-compose down -v # 重新构建启动容器 docker-compose up --build
或仅重启相关容器:
docker-compose restart data-base back-end
6. 排查Spring Boot配置覆盖问题
- 确认没有其他环境配置文件(如
application-dev.properties)覆盖主配置的数据源参数。 - 检查代码中是否存在硬编码的数据源配置(如
@Configuration类中的自定义DataSource Bean),导致配置文件参数未生效。
内容的提问来源于stack exchange,提问作者JohnnySmith88
相关产品推荐
相关产品推荐

