从docker中的一个容器访问另一个容器出现NO ROUTE TO HOST的解决方案
问题描述
从docker容器内访问主机的服务,在linux下通常直接通过docker0的ip即可访问,docker0的信息可以可通过ip addr show dev docker0
获得:
$ ip addr show dev docker0
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:8e:71:65:fc brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:8eff:fe71:65fc/64 scope link
valid_lft forever preferred_lft forever
在centos下,如果没设置,docker0的默认ip应该是 172.17.0.1
,我们通过这个ip就可以访问到docker所在的主机。
这里有个已知的bug,如果主机的端口(服务)是从另外一个docker(如docker B)映射出来的,则通过docker A进行访问会提示NO ROUTE TO HOST
,这里有个帖子说明这个问题: This is a "know" bug
This is a “known” bug. Everyone can access in this port, except for container in the same host. You have to allow it with firewall (yes this is a firewall/docker issue).
解决的办法如下
新增一条防火墙规则来允许docker A访问主机,具体如下:
1、通过命令行添加
firewall-cmd --permanent --zone=public --add-rich-rule='rule family=ipv4 source address=172.18.0.0/16 accept' && firewall-cmd --reload
2、centos7下如果采用firewalld的,可以通过新增防火墙规则到/etc/firewalld/zones/public.xml
中:
<rule family="ipv4">
<source address="172.18.0.0/16"/>
<accept/>
</rule>
3、如果是iptables,则采用如下命令:
sudo iptables -A INPUT -s 172.18.0.0/16 -j ACCEPT
# 保存规则,否则重启后会失效
sudo service iptables save
注意将172.18.0.0/16
改成docker A的ip,查看docker A的ip可以执行docker inspect YouDockerName | grep IPAddress
"SecondaryIPAddresses": null,
"IPAddress": "",
"IPAddress": "172.18.0.2"
博主