mac上docker容器ping宿主机时 Destination Host Unreachable

情景在线:某主机内网ip为192.168.50.143。该主机开启多个服务,且不在一个docker的network下,如果服务想要通信,服务间就只能使用服务暴露在宿主机的端口来进行互相通信。比如一个mysql服务,暴露在宿主机端口为3307,容器端口为3306。一个php服务暴露在宿主机端口为8088,容器端口为80。这种情况下如果php想要连接mysql服务,配置就应该为host=192.168.50.143,port=3307。

docker网络如果正常的话,这样是完全没问题的。但是本次实验却遇到mysql一直连接超时的问题,说明docker网络有问题了,于是进入容器后,ping 192.168.50.143,果然ping不通了。。。。报Destination Host Unreachable错误。但是在容器内ping外网ping 8.8.8.8却能ping通,在容器内ping同一个网段的docker容器的ip也能ping。

由此可见,该问题就是容器内不能ping通宿主机ip,导致mysql服务一直连接超时。参考宿主机与容器ping不同一文,应该是宿主机网段和docker网段冲突导致俩者ping不通。

可能有人问既然能ping通外网,连接mysql的host直接使用主机的公网ip即可。可以是可以,但是为了提高速度,这里最好使用内网ip。



服务间通讯的4种方式

  • 如果在同一network下的服务,host可以使用docker的service(使用docker-compose开启后每个服务会有相应的service,这里的service相当于容器的ip),port使用服务在容器内的开放端口。也可以使用上述情况中的连接方式,host使用宿主机的内网ip,而port使用服务暴露在宿主机上的端口。
  • 如果在同一主机不同的network的服务,可以使用上述情景中的连接方式。
  • 如果服务是跨主机的且俩主机在同一局域网时,连接服务的host就可以另外一个主机的内网ip,port是服务暴露在主机上的端口。类似于上述情景中的连接方式。
  • 如果服务是跨主机的且俩主机不在同一局域网时,连接服务的host就可以另外一个主机的公网ip,port是服务暴露在主机上的端口。这样连接速度就会大大降低,一般人没有这么做。

说白了,不管什么连接方式,都是在容器内连接的,如果连接失败或者超时,说明容器内网络有问题了。

你可能感兴趣的:(mac上docker容器ping宿主机时 Destination Host Unreachable)