网络不是我的优势之一,请原谅我,如果我在这里遗漏了一些东西。
我使用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。
由于我的网络知识有限,我很难找到从哪里开始调试此问题。解决这个特定问题的方法会很棒,但调试这个问题的方法会更好。
如何调试此问题?
答案 0 :(得分:1)
您似乎正在尝试使用与eth1上相同的IP子网配置docker网络和容器。这将导致无法正确路由的流量,因为Linux不知道应该将流量发送到哪两个。最佳情况(您似乎经历过)它不断向eth1发送流量,您的容器无法通信。最糟糕的情况是,你不能通过eth1与任何事情交谈。
解决方案是不要尝试将容器视为轻量级VM,因为它们不是。使用未使用的子网在docker内部将它们旋转(如果您不强制使用,则docker将尝试使用您创建的网络自动执行此操作)。允许容器获取该网络内的任何随机IP。对于需要访问docker容器的外部连接,在docker主机上发布一个端口,让外人连接到主机上的那个端口,与你的容器通信。
Docker的networking user guide详细介绍了如何在docker和命令中使用网络。