如何在无法访问Internet的用户定义网络上调试docker容器

时间:2017-03-17 17:00:45

标签: networking docker

网络不是我的优势之一,请原谅我,如果我在这里遗漏了一些东西。

我使用Centos7作为我的主机操作系统。 Docker版本17.03.0-ce,构建60ccb22。

我使用以下方法创建网络:

docker network create --driver=bridge --subnet=10.19.0.0/16 development

我使用以下方式运行容器:

sudo docker run -dit --name=php-nginx1 --net=development --ip=10.19.74.23 --volume /vagrant/wordpress:/var/www/wordpress --expose 80 php-nginx

当我从容器内部ping 216.58.216.36(google)时,结果是:

PING 216.58.216.36 (216.58.216.36) 56(84) bytes of data. From 10.19.74.23 icmp_seq=1 Destination Host Unreachable

如果我在没有指定网络的情况下运行容器,我可以ping 216.58.216.36没问题。

主机上ifconfig的结果是

docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
    inet 172.17.0.1  netmask 255.255.0.0  broadcast 0.0.0.0
    inet6 fe80::42:7fff:fee2:8f4e  prefixlen 64  scopeid 0x20<link>
    ether 02:42:7f:e2:8f:4e  txqueuelen 0  (Ethernet)
    RX packets 13674  bytes 609692 (595.4 KiB)
    RX errors 0  dropped 0  overruns 0  frame 0
    TX packets 16644  bytes 182882110 (174.4 MiB)
    TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
    inet 10.0.2.15  netmask 255.255.255.0  broadcast 10.0.2.255
    inet6 fe80::5054:ff:fe22:5b53  prefixlen 64  scopeid 0x20<link>
    ether 52:54:00:22:5b:53  txqueuelen 1000  (Ethernet)
    RX packets 322262  bytes 409758704 (390.7 MiB)
    RX errors 0  dropped 0  overruns 0  frame 0
    TX packets 47924  bytes 3329709 (3.1 MiB)
    TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
    inet 10.19.74.21  netmask 255.255.255.0  broadcast 10.19.74.255
    inet6 fe80::a00:27ff:feb9:e12  prefixlen 64  scopeid 0x20<link>
    ether 08:00:27:b9:0e:12  txqueuelen 1000  (Ethernet)
    RX packets 2  bytes 120 (120.0 B)
    RX errors 0  dropped 0  overruns 0  frame 0
    TX packets 28  bytes 2016 (1.9 KiB)
    TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
    inet 127.0.0.1  netmask 255.0.0.0
    inet6 ::1  prefixlen 128  scopeid 0x10<host>
    loop  txqueuelen 1  (Local Loopback)
    RX packets 84  bytes 7244 (7.0 KiB)
    RX errors 0  dropped 0  overruns 0  frame 0
    TX packets 84  bytes 7244 (7.0 KiB)
    TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ifconfig形成容器是:

eth0      Link encap:Ethernet  HWaddr 02:42:0a:13:4a:17  
      inet addr:10.19.74.23  Bcast:0.0.0.0  Mask:255.255.0.0
      inet6 addr: fe80::42:aff:fe13:4a17/64 Scope:Link
      UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
      RX packets:16 errors:0 dropped:0 overruns:0 frame:0
      TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:0 
      RX bytes:1296 (1.2 KB)  TX bytes:648 (648.0 B)

lo        Link encap:Local Loopback  
      inet addr:127.0.0.1  Mask:255.0.0.0
      inet6 addr: ::1/128 Scope:Host
      UP LOOPBACK RUNNING  MTU:65536  Metric:1
      RX packets:0 errors:0 dropped:0 overruns:0 frame:0
      TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:1 
      RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

路线形式的计数器导致:

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         10.19.0.1       0.0.0.0         UG    0      0        0 eth0
10.19.0.0       *               255.255.0.0     U     0      0        0 eth0

来自主机的路线导致:

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         gateway         0.0.0.0         UG    100    0        0 eth0
10.0.2.0        0.0.0.0         255.255.255.0   U     100    0        0 eth0
10.19.0.0       0.0.0.0         255.255.0.0     U     0      0        0 br-    ca991944118f
10.19.74.0      0.0.0.0         255.255.255.0   U     0      0        0 eth1
link-local      0.0.0.0         255.255.0.0     U     1003   0        0 eth1
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0

我不知道如何处理downvote。我已经查看了与docker容器无法访问互联网有关的其他问题,但它们似乎都与容器根本无法访问外部地址有关。如果未分配给我创建的网络,此容器可以访问Internet,但是当连接到我创建的网络时,则不能访问Internet。

由于我的网络知识有限,我很难找到从哪里开始调试此问题。解决这个特定问题的方法会很棒,但调试这个问题的方法会更好。

如何调试此问题?

1 个答案:

答案 0 :(得分:1)

您似乎正在尝试使用与eth1上相同的IP子网配置docker网络和容器。这将导致无法正确路由的流量,因为Linux不知道应该将流量发送到哪两个。最佳情况(您似乎经历过)它不断向eth1发送流量,您的容器无法通信。最糟糕的情况是,你不能通过eth1与任何事情交谈。

解决方案是不要尝试将容器视为轻量级VM,因为它们不是。使用未使用的子网在docker内部将它们旋转(如果您不强制使用,则docker将尝试使用您创建的网络自动执行此操作)。允许容器获取该网络内的任何随机IP。对于需要访问docker容器的外部连接,在docker主机上发布一个端口,让外人连接到主机上的那个端口,与你的容器通信。

Docker的networking user guide详细介绍了如何在docker和命令中使用网络。