Docker Swarm容器化Rails应用连接Compose部署MySQL失败解决
解决Rails Swarm容器连接外部MySQL容器的权限问题
问题根源
报错中的10.0.13.248是Docker Swarm overlay网络的容器源IP,而非Rails所在VM的宿主机IP。你的MySQL用户bduser仅授权了Rails宿主机IP的访问权限,未允许Swarm集群的overlay网络IP段访问,因此触发连接拒绝错误。
具体解决步骤
1. 确认Swarm overlay网络的IP段
在Rails所在的Swarm节点上执行以下命令,查看Swarm overlay网络的IP范围:
docker network inspect overlay
找到输出中的IPAM.Config.Subnet字段(比如10.0.13.0/24),这就是需要授权的IP段。
2. 给MySQL用户授权Swarm IP段访问
登录到MySQL容器(或通过宿主机IP直接连接MySQL),执行以下SQL命令:
-- 授权bduser从Swarm的目标IP段访问所有数据库(可根据实际需求调整数据库范围) GRANT ALL PRIVILEGES ON *.* TO 'bduser'@'10.0.13.%' IDENTIFIED BY '你的用户密码'; -- 刷新权限使配置立即生效 FLUSH PRIVILEGES;
若不确定具体IP段,可临时授权所有IP进行测试(生产环境不建议使用):
GRANT ALL PRIVILEGES ON *.* TO 'bduser'@'%' IDENTIFIED BY '你的用户密码'; FLUSH PRIVILEGES;
3. 验证权限配置
执行以下SQL查看用户授权情况,确认已添加目标IP段的访问权限:
SELECT user, host FROM mysql.user WHERE user='bduser';
4. 额外检查项
- 确保MySQL所在VM的防火墙/安全组已开放3306端口,允许Rails所在VM的Swarm overlay网络IP段访问。
- Rails数据库配置文件中的
host需填写MySQL所在VM的宿主机IP,而非MySQL容器的内部IP(因为容器已映射宿主机3306端口)。
内容的提问来源于stack exchange,提问作者Caio Nakai
相关产品推荐
相关产品推荐

