如何让Docker容器访问数据库?SpringBoot容器MySQL连接失败排查
问题描述
我有一个基于SpringBoot项目构建的Docker容器,启动命令如下:
docker run --net=host -d --restart unless-stopped -v /home/ramses/dockerTest:/uploads/deployment --name ramses-bl2 abyster01/ramses-bl2:528
但该容器无法访问我的数据库,报错信息如下:
Caused by: org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure
最后一次成功向服务器发送数据包是0毫秒前,驱动未收到服务器的任何数据包。
容器已以host网络模式启动,且已确认SpringBoot配置文件中设置的root用户在数据库中存在,使用与配置文件相同的凭证测试数据库连接成功,但仍出现上述错误。
排查与解决方法
- 检查MySQL绑定地址
默认MySQL可能仅绑定127.0.0.1,即便容器用host网络也无法访问。修改MySQL配置文件(常见路径:/etc/mysql/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf):
bind-address = 0.0.0.0
修改后重启MySQL服务:
systemctl restart mysql
- 验证数据库用户访问权限
root用户可能仅允许localhost访问,执行SQL查看权限:
SELECT user, host FROM mysql.user WHERE user = 'root';
若host为localhost,授权允许任意地址访问(或指定服务器IP):
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '你的数据库密码' WITH GRANT OPTION; FLUSH PRIVILEGES;
- 检查防火墙/安全组规则
确认服务器防火墙(如ufw、iptables)未阻断3306端口:
# ufw示例 ufw allow 3306/tcp ufw reload
修正SpringBoot数据库地址配置
配置文件中若写localhost,可替换为服务器的公网/内网IP,避免容器内localhost解析偏差。测试容器内网络连通性
进入容器测试端口连通性:
docker exec -it ramses-bl2 bash # 测试本地MySQL端口 telnet 127.0.0.1 3306 # 或测试服务器IP telnet 你的服务器IP 3306
若telnet不通,回到防火墙、MySQL绑定地址环节排查。
内容的提问来源于stack exchange,提问作者Ramses Kouam
相关产品推荐
相关产品推荐

