Docker容器无法ping通外界 - iptables

use*_*022 3 networking iptables docker

探索Docker 17.06.

我在Centos 7上安装了docker并创建了一个容器.使用默认网桥启动容器.我可以ping两个主机适配器,但不能ping外部世界,例如www.google.com

所有建议都基于旧版本的Docker和它的iptables设置.

我想了解如何ping外界,请问有什么需要?

TIA!

Qua*_*uak 15

就我而言,重新启动 docker 守护进程有帮助

sudo systemctl restart docker


Sha*_*han 8

如果您能够从主机ping www.google.com,请尝试执行以下步骤:在主机上运行:

sudo ip addr show docker0 
Run Code Online (Sandbox Code Playgroud)

您将获得包括以下内容的输出:

inet 172.17.2.1/16 scope global docker0
Run Code Online (Sandbox Code Playgroud)

docker主机在docker0网络接口上具有IP地址172.17.2.1.

然后启动容器:

docker run --rm -it ubuntu:trusty bash 
Run Code Online (Sandbox Code Playgroud)

并运行

ip addr show eth0
Run Code Online (Sandbox Code Playgroud)

输出将包括:

inet 172.17.1.29/16 scope global eth0
Run Code Online (Sandbox Code Playgroud)

您的容器的IP地址为172.17.1.29.现在看一下路由表:运行:

route
Run Code Online (Sandbox Code Playgroud)

输出将包括:

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         172.17.2.1     0.0.0.0         UG    0      0        0 eth0
Run Code Online (Sandbox Code Playgroud)

它表示docker主机172.17.2.1的IP地址被设置为默认路由,可从容器访问.

尝试ping你的主机ip:

root@e21b5c211a0c:/# ping 172.17.2.1
PING 172.17.2.1 (172.17.2.1) 56(84) bytes of data.
64 bytes from 172.17.2.1: icmp_seq=1 ttl=64 time=0.071 ms
64 bytes from 172.17.2.1: icmp_seq=2 ttl=64 time=0.211 ms
64 bytes from 172.17.2.1: icmp_seq=3 ttl=64 time=0.166 ms 
Run Code Online (Sandbox Code Playgroud)

如果这最有可能,您将能够ping www.google.com

希望它会有所帮助!

  • 哦,我遇到一个问题,我使用上面的操作,但是在容器中我无法 ping docker0 getway (ping 172.17.0.1)。容器中的【route -n】命令输出: Kernel IP 路由表 Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 172.17.0.1 0.0.0.0 UG 0 0 0 eth0 172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0以太网0 (3认同)

Sha*_*han 0

请验证您现有的 iptables:

 iptables --list
Run Code Online (Sandbox Code Playgroud)

它应该显示包含源和目标详细信息的 iptables 列表。

target        prot   opt    source             destination

DOCKER-USER   all    --    anywhere            anywhere
Run Code Online (Sandbox Code Playgroud)

如果源和目标都位于任何位置,则应 ping 外部 IP。(默认情况下位于任何位置

如果不使用此命令来设置你的 iptable(DOCKER-USER)

iptables -I DOCKER-USER -i eth0 -s 0.0.0.0/0 -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

希望这会有所帮助!

  • 您是从容器内部还是从主机 ping 外部 IP?IP 表看起来很适合你。您可以尝试运行 iptables -nvL 并检查那里是否有任何限制。服务器托管在哪里?哎呀?谷歌?天蓝色? (2认同)