docker容器无法访问宿主机报出 No route to host

目录

问题描述

在docker部署golang程序的时候遇到了这个样子的问题No route to host 导致了golang容器无法连接宿主机提供的对外接口。 然后我就进入到了golang容器里面,ping了宿主机的地址,结果是通着的,然后使用telnet测试了接口的端口,结果也会报出这个异常。 原因是什么呢?明明对外接口外部可以正常连接访问,但是宿主机内部容器确实无法访问?


原因分析

在进行docker部署的时候我们采用的是bridge网桥的模式。

启动docker时,docker进程会创建一个名为docker0的虚拟网桥,用于宿主机与容器之间的通信。当启动一个docker容器时,docker容器将会附加到虚拟网桥上,容器内的报文通过docker0向外转发。

如果docker容器访问宿主机,那么docker0网桥将报文直接转发到本机,报文的源地址是docker0网段的地址。而如果docker容器访问宿主机以外的机器,docker的SNAT网桥会将报文的源地址转换为宿主机的地址,通过宿主机的网卡向外发送。

因此,当docker容器访问宿主机时,如果宿主机服务端口会被防火墙拦截,从而无法连通宿主机,出现No route to host的错误。

而访问宿主机所在局域网内的其他机器,由于报文的源地址是宿主机ip,因此,不会被目的机器防火墙拦截,所以可以访问。


解决方案

关闭宿主机的防火墙

以下命令未进行实践操作

systemctl stop firewalld

对宿主机防火墙进行相应配置

以下命令未进行实践操作

nmcli connection modify docker0 connection.zone trusted

systemctl stop NetworkManager.service

firewall-cmd --permanent --zone=trusted --change-interface=docker0

systemctl start NetworkManager.service

nmcli connection modify docker0 connection.zone trusted

systemctl restart docker.service