Apache Shiro连接本地Docker容器MySQL遇通信链路故障
我来帮你排查这个Shiro连接Docker MySQL的通信问题!你用Sequel Pro和IntelliJ能正常连上数据库,但Shiro却抛出「Communications link failure」,核心问题大概率是容器网络访问逻辑的差异或者Shiro配置细节没到位,下面给你一步步拆解解决方案:
1. 先检查Shiro.ini里的JDBC URL配置细节
你提到其他工具用的是jdbc:mysql://localhost:13306/UNIHUB_DB,但要确保Shiro配置里的URL完全一致,还要注意几个容易踩坑的点:
- 如果你的应用是运行在Docker容器内,
localhost指向的是容器自身,而非宿主机!这时候得把URL改成宿主机的局域网IP(比如192.168.1.100),或者用Docker提供的特殊域名:Windows/macOS用host.docker.internal,Linux用gateway.docker.internal。 - 务必加上
useSSL=false和serverTimezone参数,避免SSL验证和时区不匹配导致的额外连接失败。
给你一个正确的Shiro.ini配置示例:
jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm # 配置MySQL数据源 jdbcRealm.dataSource=com.mysql.cj.jdbc.MysqlDataSource jdbcRealm.dataSource.url=jdbc:mysql://host.docker.internal:13306/UNIHUB_DB?useSSL=false&serverTimezone=UTC jdbcRealm.dataSource.user=root jdbcRealm.dataSource.password=admin # 你的认证查询语句 jdbcRealm.authenticationQuery=SELECT password FROM users WHERE username = ?
2. 确认MySQL容器的端口映射与运行状态
虽然你用工具能连上,但还是要再核对一下:
- 执行
docker ps命令,查看MySQL容器的端口映射是否为0.0.0.0:13306->3306/tcp,确保端口没有被其他进程占用。 - 确认容器处于
Up状态,如果容器意外停止,重启一下即可:docker restart [容器ID/名称]
3. 检查MySQL的绑定地址配置
部分MySQL镜像默认只绑定127.0.0.1,这会导致容器外的应用(包括Shiro)无法访问。你可以通过两种方式修改:
- 启动容器时直接添加参数:
docker run -d -p 13306:3306 -e MYSQL_ROOT_PASSWORD=admin -e MYSQL_DATABASE=UNIHUB_DB mysql:latest --bind-address=0.0.0.0 - 或者挂载自定义的
my.cnf配置文件,将bind-address设置为0.0.0.0。
4. 用纯Java代码测试数据库连接(排除Shiro干扰)
先写个简单的Java测试类,绕开Shiro直接用JDBC连接,验证基础连接是否正常:
import java.sql.Connection; import java.sql.DriverManager; public class TestDBConnection { public static void main(String[] args) { String url = "jdbc:mysql://localhost:13306/UNIHUB_DB?useSSL=false&serverTimezone=UTC"; String user = "root"; String password = "admin"; try (Connection conn = DriverManager.getConnection(url, user, password)) { System.out.println("数据库连接成功!"); } catch (Exception e) { e.printStackTrace(); } } }
如果这个测试类也报错,说明问题不在Shiro,而是Java程序的网络配置或MySQL的访问权限问题;如果能成功,那就是Shiro的配置细节有误(比如数据源属性名写错、驱动依赖缺失)。
5. 确认MySQL驱动依赖是否正确
MySQL 8.0+推荐使用com.mysql.cj.jdbc.MysqlDataSource而非旧版的com.mysql.jdbc.Driver,同时要确保项目依赖里包含MySQL驱动:
Maven项目在pom.xml中添加:
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> </dependency>
内容的提问来源于stack exchange,提问作者Arthur Feldman
相关产品推荐
相关产品推荐

