大家好,我是剽悍一小兔,独立开发者,副业搞钱尝试者,热爱技术分享,欢迎一起学习交流。
我会每天分享编程技术、独立开发、行业咨询、思考感悟。
代表作:《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 |
四、验证步骤
通过以上步骤,可以定位并解决 90% 以上的 Docker MySQL 连接问题。如果仍有报错,建议提供具体的错误日志(如 java.sql.SQLException 的详细信息),以便进一步排查。
评论前必须登录!
注册