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

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 05:45:38