You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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容器的网络连通性:
    docker exec -it <你的后端容器ID或名称> telnet data-base 3306
    # 容器内有nc的话也可以用:
    docker exec -it <你的后端容器ID或名称> nc -zv data-base 3306
    
    连接失败则说明网络或MySQL服务本身存在问题。

2. 验证后端容器环境变量加载情况

  • 进入后端容器,核对环境变量是否与Docker Compose配置一致:
    docker exec <你的后端容器ID或名称> printenv | grep MYSQL
    
    确认输出的MYSQL_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 3306
    
    确保输出显示0.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 20:22:50