Insun Lee

命由己造,相由心生,世间万物皆是化相,心不动,万物皆不动,心不变,万物皆不变
Email insunsgmail.com
Country China
LocationHangZhou, ZheJiang

从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"
  • 分享:
评论

    • 博主

    说点什么