Docker Swarm中Spring Boot服务连接外部MySQL数据库被拒绝
排查Docker Swarm中Spring Boot服务无法连接外部数据库的问题
这种情况我踩过好几次坑,ping通但连不上数据库,大概率不是基础网络连通性的问题,而是端口、防火墙或者数据库配置的锅,结合你的场景给你列几个优先级最高的排查步骤:
1. 先验证数据库端口的实际连通性
ping通只能说明ICMP数据包能到达服务器,但3306端口可能根本没对外提供服务。直接在容器里用工具测试端口:
# 用telnet测试(容器需预装telnet) docker exec -it e093 telnet 192.168.130.141 3306 # 或者用nc(如果容器里有netcat) docker exec -it e093 nc -zv 192.168.130.141 3306
如果返回Connection refused,那问题肯定出在数据库服务器的端口监听或防火墙拦截上。
2. 检查数据库服务器的防火墙/安全组规则
- 先看服务器本地防火墙:比如用
ufw的话,要允许Swarm集群IP段访问3306端口;用firewalld可以加这条规则:firewall-cmd --add-rich-rule='rule family="ipv4" source address="你的Swarm集群子网" port port="3306" protocol="tcp" accept' --permanent firewall-cmd --reload - 如果是云服务器,别忘了检查云平台的安全组,很多人会忽略这个,必须确保3306端口对Swarm节点的IP开放。
3. 确认MySQL的绑定地址配置
MySQL默认可能只绑定127.0.0.1,这种情况下只能本地访问,外部连不上:
- 找到MySQL配置文件(通常在
/etc/mysql/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf),修改bind-address为0.0.0.0(允许所有IP访问)或者Swarm集群的子网IP,然后重启服务:systemctl restart mysql - 重启后用
netstat -tulpn | grep 3306确认监听地址是0.0.0.0:3306,而不是127.0.0.1:3306。
4. 检查数据库用户的访问权限
就算端口通了,MySQL用户可能没有从Swarm容器IP访问的权限:
- 登录MySQL后查看用户权限:
SELECT user, host FROM mysql.user;
如果你的数据库用户的host是localhost或特定IP,需要修改为%(允许所有IP)或者Swarm容器的IP段:
GRANT ALL PRIVILEGES ON database.* TO '你的数据库用户名'@'%' IDENTIFIED BY '你的密码'; FLUSH PRIVILEGES;
5. 最后排查Swarm节点的IP转发设置(概率较低)
虽然你能ping通服务器,但Swarm节点的IP转发如果没开,也可能影响TCP连接:
- 在Swarm节点上执行:
sysctl net.ipv4.ip_forward
如果返回net.ipv4.ip_forward = 0,需要开启:
sysctl -w net.ipv4.ip_forward=1 # 永久生效的话编辑/etc/sysctl.conf,添加net.ipv4.ip_forward=1
先从第1、2步开始查,这两个是最常见的原因——我之前碰到过客户云服务器安全组没开3306,ping通但连不上,折腾了半天😂
内容的提问来源于stack exchange,提问作者grekier
相关产品推荐
相关产品推荐

