在没有–net = host参数的docker容器内部networking不可达

问题 :docker集装箱中没有互联网连接。

症状 :ping 8.8.8.8不起作用。 主机系统的Wireshark回馈:

  19 10.866212113 172.17.0.2 -> 8.8.8.8 ICMP 98 Echo (ping) request id=0x0009, seq=0/0, ttl=64 20 11.867231972 172.17.0.2 -> 8.8.8.8 ICMP 98 Echo (ping) request id=0x0009, seq=1/256, ttl=64 21 12.868331353 172.17.0.2 -> 8.8.8.8 ICMP 98 Echo (ping) request id=0x0009, seq=2/512, ttl=64 22 13.869400083 172.17.0.2 -> 8.8.8.8 ICMP 98 Echo (ping) request id=0x0009, seq=3/768, ttl=64 

但是 ! 如果容器启动与--net=host互联网将完美的工作。

我到目前为止所尝试的是:

  • 改变DNS
  • /etc/default/docker --ip-masq=true添加--ip-masq=true (closures重新启动)
  • 启用与伪装/ ip_forward相关的所有内容
  • 更改默认路由
  • 这里提出的一切

主机configuration:

 $ sudo route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface default 10.4.2.1 0.0.0.0 UG 0 0 0 eno1.3001 default 10.3.2.1 0.0.0.0 UG 100 0 0 eno2 10.3.2.0 * 255.255.254.0 U 100 0 0 eno2 10.4.2.0 * 255.255.254.0 U 0 0 0 eno1.3001 nerv8.i 10.3.2.1 255.255.255.255 UGH 100 0 0 eno2 172.17.0.0 * 255.255.0.0 U 0 0 0 docker0 

sudo iptables -Lcat /etc/network/interfacesifconfigiptables -t nat -L -nv

一切都很好,转发也启用:

 $ sudo sysctl net.ipv4.ip_forward net.ipv4.ip_forward = 1 

这是你正在寻找的不完整的答案。 但是我想就互联网为什么会起作用做一些解释

如果容器启动与–net =主机互联网将完美的工作。

默认情况下,Docker支持三个networking在这种模式下(HOST)容器将共享主机的networking堆栈,主机的所有接口将可用于容器 。 容器的主机名将与主机系统上的主机名匹配

 # docker run -it --net=host ubuntu:14.04 /bin/bash root@labadmin-VirtualBox:/# hostname labadmin-VirtualBox Even the IP configuration is same as the host system's IP configuration root@labadmin-VirtualBox:/# ip addr | grep -A 2 eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 08:00:27:b5:82:2f brd ff:ff:ff:ff:ff:ff inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0 valid_lft forever preferred_lft forever 3: lxcbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default root@labadmin-VirtualBox:/# exit exit 

主机系统IPconfiguration

 # ip addr | grep -A 2 eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 08:00:27:b5:82:2f brd ff:ff:ff:ff:ff:ff inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0 valid_lft forever preferred_lft forever 3: lxcbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default 

请参阅此处了解有关dockernetworking的更多信息。

检查net.ipv4.conf.all.forwarding (不是net.ipv4.ip_forward )是否设置为1 ,否则打开:

 $ sysctl net.ipv4.conf.all.forwarding net.ipv4.conf.all.forwarding = 0 $ sysctl net.ipv4.conf.all.forwarding=1 $ sysctl net.ipv4.conf.all.forwarding net.ipv4.conf.all.forwarding = 1 

你可以运行“sudo ifconfig”,看看你的互联网连接(通常wlan0)的IP地址范围是否与docker0接口172.17.0.0的范围相冲突?

我的办公室networking(虽然在家里工作正常)有这个问题,它在172.17.0.X上运行,而Docker试图正确select这个范围。

这可能是有帮助的: http : //jpetazzo.github.io/2013/10/16/configure-docker-bridge-network/

我最终为Docker创build了自己的桥接networking。