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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:26:04