我们在虚拟机上运行多个 docker 镜像。
sudo iptables -S
显示了很多docker网络。
我们尝试连接到另一个网络中的外部 MySQL 数据库。
mysql --host=mysql.example.org --user=thisuser thatdatabase
我们收到错误信息:
错误 2002(HY000):无法连接到“mysql.example.org”上的 MySQL 服务器(115)
网络日志显示外部防火墙无法识别连接尝试。
我们尝试关闭 docker 并重试,但没有成功。
sudo traceroute mysql.example.org
traceroute to mysql.example.org (111.222.333.444), 30 hops max, 60 byte packets
1 localvm.example.org (172.17.0.1) 3071.799 ms !H 3071.763 ms !H 3071.754 ms !H
这172.17.0.1
不是本地系统的 IP 地址。
在另一个原始系统上我们可以连接到该实例。
我们尝试使用明确的路线,但没有成功。
ip route add 222.333.444.0/24 dev ens192
traceroute mysql.example.org
traceroute to mysql.example.org (correct external ip-address), 30 hops max, 60 byte packets
1 localvm.example.org (correct local ip-address) 3068.673 ms !H 3068.566 ms !H 3068.532 ms !H
关于如何缩小错误范围有什么建议吗?
是时候启动 wireshark 了吗?
VM 是 Debian 10,客户端是 mysql Ver 15.1 Distrib 10.3.22-MariaDB
答案1
结果我们必须告诉 docker 不要使用 172.17.0.0/24 网络。
我们改变了
/etc/docker/daemon.json
{
"bip": "172.26.0.1/16"
}
systemctl restart docker;systemctl status docker
旧路线入口是
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default .... 0.0.0.0 UG 100 0 0 ens192
........... 0.0.0.0 255.255.255.0 U 100 0 0 ens192
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
路线现在显示不同的网络:
Destination Gateway Genmask Flags Metric Ref Use Iface
172.26.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
现在它与现有服务器不再冲突,并且可以连接。
非常感谢大家的帮助!
答案2
通常意味着系统上没有运行 MySQL 服务器,或者您在尝试连接服务器时使用了错误的 Unix 套接字文件名或 TCP/IP 端口号。您还应该检查您使用的 TCP/IP 端口是否被防火墙或端口阻止服务阻止。