问题场景
Docker启动MySQL后,用127.0.0.1无法连接到容器,只能使用本机器的IP进行访问。配置文件是项目开发公用的,所以修改配置文件不是一个好的解决方法。故使用IPtable将127.0.0.1的特定端口(如3306)重定向到本机器IP,这样使用127.0.0.1其实是连接到本机由DHCP分配的IPv4地址。
mac使用pfctl
echo "rdr pass on lo0 inet proto tcp from any to 127.0.0.1 port 3306 -> 10.215.103.225 port 3306" | sudo pfctl -ef -
其中 lo0
通过 ifconfig -a
查看到的网络名称。10.215.103.225
是lo0的本机ipv4地址。
linux的等同iptables
命令
iptables -t nat -I PREROUTING -d 127.0.0.1 -p tcp --destination-port 3306 -j DNAT --to-destination 10.215.103.225:3306
后续
当我再次尝试使用jdbc
连接本地数据库时,失败,但是使用socket连接是正常的,奈何jdbc
只能使用tcp连接。编辑my.cnf
配置Mysql强制使用tcp
连接,natstat
查看端口监听情况。
netstat -lna | grep mysql
显示tcp监听正常。jdbc
依然无法连接。
这才回想起来我做了端口映射,将到达tcp端口3306的包转发到另一ip地址上了。折腾了2个小时,唉。
意外收获
macos下类似iptables的强大工具pfctl
意外发现的 pfctl命令集合