详解如何解决docker容器无法通过IP访问宿主机问题
问题起源
在使用docker的过程中我不幸需要在docker容器中访问宿主机的80端口,而这个80端口是另外一个容器8080端口映射出去的.当我在容器里通过docker的网桥172.17.0.1访问宿主机时,居然发现:
curl:(7)Failedtoconnectto172.17.0.1port80:Noroutetohost
查找问题原因
可以确定的是容器与宿主机是有网络连接的,因为可以在容器内部通过172.17.0.1Ping通宿主机:
root@930d07576eef:/#ping172.17.0.1 PING172.17.0.1(172.17.0.1)56(84)bytesofdata. 64bytesfrom172.17.0.1:icmp_seq=1ttl=64time=0.130ms
也可以在容器内部访问其它内网和外网.
iptables显示也允许docker容器访问:
#iptables--list|grepDOCKER DOCKER-ISOLATIONall--anywhereanywhere DOCKERall--anywhereanywhere ChainDOCKER(1references) ChainDOCKER-ISOLATION(1references)
之后在查找一些资料后发现这个问题:NOROUTETOHOSTnetworkrequestfromcontainertohost-ip:portpublishedfromothercontainer.
解释
正如DockerCommunityForms所言,这是一个已知的Bug,宿主机的80端口允许其它计算机访问,但是不允许来自本机的Docker容器访问.必须通过设置firewalld规则允许本机的Docker容器访问.
gypark指出可以通过在/etc/firewalld/zones/public.xml中添加防火墙规则避免这个问题:
注意这里的172.17.0.0/16可以匹配172.17.xx.xxIP段的所有IP.
之后重启下防火墙:
systemctlrestartfirewalld
之后就可以在docker容器内部访问宿主机80端口.
其它问题
实际上当我又用vmware新开了一台虚拟机希望能重现这个问题的时候,发现在新的虚拟机上居然没有类似的问题.也就是说容器可以直接通过172.17.0.1访问宿主机80端口,查看防火墙配置也没看到有172.17.xx.xx的白名单.
猜测是由于在新的虚拟机安装的docker是Dockerversion1.12.5,build047e51b/1.12.5,也就是RedHat从docker开源版本迁出开发的版本,而之前的是Dockerversion17.06.2-ce,buildcec0b72属于Docker-CE,可能是docker版本有差异,RedHat顺便把那个KnownBug修复了.
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。