我linux服务器,用docker安装了mysql,5.7版本, 本地连接服务器的mysql是正常的,跑springboot项目也可以正常连接,但是打成jar后放到服务器去启动,就连接mysql报错

大家好,我是剽悍一小兔,独立开发者,副业搞钱尝试者,热爱技术分享,欢迎一起学习交流。

我会每天分享编程技术、独立开发、行业咨询、思考感悟。

代表作:《JavaScript百炼成仙》

公众号:java小白翻身

小程序:速用百宝箱

要解决 Docker MySQL 5.7 在服务器上被 Spring Boot JAR 包连接失败的问题,需要结合网络连通性配置一致性MySQL 权限等维度排查。以下是具体分析和解决步骤:

一、优先检查错误日志

启动 JAR 包时,务必查看完整的报错信息(如 java.sql.SQLException 的具体原因),常见错误类型包括:

  • • Connection refused(连接被拒绝):可能是网络不通或端口未开放。
  • • Access denied for user(权限不足):用户名/密码错误或 MySQL 用户未授权当前主机。
  • • Communications link failure(连接超时):网络延迟或 MySQL 配置限制。
  • • ClassNotFoundException: com.mysql.cj.jdbc.Driver(驱动缺失):JAR 包未正确打包驱动。

二、核心排查步骤

1. 确认 MySQL 容器的网络配置

Docker MySQL 容器默认使用 bridge 网络模式,宿主机访问容器需通过 宿主机IP:映射端口(而非容器内部IP)。需检查:

  • • 端口映射是否正确:通过 docker ps 查看容器端口映射(如 0.0.0.0:3306->3306/tcp),确保宿主机的 3306 端口已映射到容器内部。
    docker ps | grep mysql  # 查看容器端口映射
  • • 容器是否允许外部连接:MySQL 配置文件(my.cnf 或 my.ini)中的 bind-address 需设置为 0.0.0.0(允许所有地址连接),否则仅允许 localhost 访问。
    # 进入容器查看配置
    docker exec -it mysql-container-name bash
    cat /etc/mysql/my.cnf | grep bind-address  # 应显示 bind-address = 0.0.0.0
2. 验证服务器上 JAR 包与 MySQL 的网络连通性

在服务器上直接执行以下命令,测试 JAR 包进程能否访问 MySQL 端口:

# 替换为你的 MySQL 宿主机IP和映射端口(如 127.0.0.1:3306)
telnet 127.0.0.1 3306
  • • 如果提示 Connected to 127.0.0.1,说明网络连通。
  • • 如果提示 Connection refused,可能是:
    • • 防火墙拦截(如 firewalld 或云服务器安全组未放行 3306 端口)。
    • • MySQL 容器未正确映射端口(检查 docker ps 的端口映射)。
3. 检查 MySQL 用户权限

MySQL 用户可能仅授权了从 localhost 或特定 IP 访问,而 JAR 包运行在服务器上时,连接的 IP 不在授权列表中。需登录 MySQL 检查用户权限:

# 进入 MySQL 容器执行命令
docker exec -it mysql-container-name mysql -uroot -p

# 查看用户权限(替换为你的用户名,如 spring_user)
mysql> SELECT Host, User FROM mysql.user WHERE User = 'spring_user';
  • • 如果 Host 是 localhost,表示仅允许本地(容器内)访问。需授权允许从服务器 IP 访问:
    -- 授权用户从任意主机访问(% 表示所有 IP)
    GRANT ALL PRIVILEGES ON *.* TO 'spring_user'@'%' IDENTIFIED BY '你的密码' WITH GRANT OPTION;
    FLUSH PRIVILEGES;  -- 刷新权限
4. 确认 JAR 包的数据库连接配置

本地开发时,连接配置可能使用 localhost:3306,但部署到服务器后,需确保配置指向 宿主机的 MySQL 映射端口(而非容器内部 IP)。检查 application.properties 或 application.yml

spring:
  datasource:
    url: jdbc:mysql://宿主机IP:映射端口/数据库名?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
    username: spring_user
    password: 你的密码
    driver-class-name: com.mysql.cj.jdbc.Driver  # MySQL 5.7 建议使用 8.x 驱动(兼容)
  • • 注意:如果 JAR 包运行在服务器上,且 MySQL 容器也在同一服务器,宿主机IP 应填写 127.0.0.1 或服务器公网 IP(需确保防火墙放行)。
5. 检查 JDBC 驱动版本兼容性

MySQL 5.7 推荐使用 mysql-connector-java 5.1.x 或 8.x 驱动(8.x 需添加 serverTimezone 参数)。如果 JAR 包未正确打包驱动,或版本不兼容,会导致连接失败。检查 pom.xml(Maven)或 build.gradle(Gradle):

<!-- Maven 依赖(MySQL 5.7 兼容 8.x 驱动) -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.28</version>  <!-- 推荐 8.x 版本 -->
</dependency>
  • • 打包时确保驱动被正确包含(Maven 需确认 scope 为 compile,而非 provided)。
6. 检查容器与宿主机的网络隔离

如果 MySQL 容器使用 bridge 网络(默认),宿主机访问容器需通过 宿主机IP:映射端口。若容器使用 host 网络模式(--network host),则容器直接使用宿主机网络,此时 MySQL 端口即为宿主机端口。

三、常见问题总结

问题类型现象描述解决方法
网络不通telnet 127.0.0.1 3306 失败检查防火墙/安全组,确认端口映射
MySQL 用户权限不足报错 Access denied授权用户 % 主机访问权限
连接配置错误本地正常,服务器失败检查 url 中的宿主机 IP 和端口
JDBC 驱动缺失或版本错误报错 ClassNotFoundException确认驱动依赖并正确打包
MySQL bind-address 限制容器内可连,宿主机不可连修改 my.cnf 为 bind-address=0.0.0.0

四、验证步骤

  1. 1. 在服务器上运行 telnet 127.0.0.1 3306 确认网络连通。
  2. 2. 登录 MySQL 执行 SELECT Host, User FROM mysql.user 确认权限。
  3. 3. 检查 JAR 包的 application.yml 配置是否指向正确的宿主机 IP 和端口。
  4. 4. 重新打包 JAR 包(确保驱动包含),并重启测试。

通过以上步骤,可以定位并解决 90% 以上的 Docker MySQL 连接问题。如果仍有报错,建议提供具体的错误日志(如 java.sql.SQLException 的详细信息),以便进一步排查。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

剽悍一小兔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值