Docker容器网络实操教程( 二 )

启用设备并分配给予适当的IP地址,其中一个设备上发生的数据包都会立即在连接两个命名空间的对等设备接收到:
sudo ip link set veth0 upsudo ip addr add 172.18.0.11/16 dev veth0sudo nsenter --net=/var/run/netns/netns0ip link set lo upip link set ceth0 upip addr add 172.18.0.10/16 dev ceth0这时候的网络信息
ip link1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:005: ceth0@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000link/ether 66:2d:24:e3:49:3f brd ff:ff:ff:ff:ff:ff link-netnsid 0图示:

Docker容器网络实操教程

文章插图
 
为了检查连接性,我们从netns0(172.18.0.11),ping veth0(172.18.0.10)
ping -c 2 172.18.0.11PING 172.18.0.11 (172.18.0.11) 56(84) bytes of data.64 bytes from 172.18.0.11: icmp_seq=1 ttl=64 time=0.038 ms64 bytes from 172.18.0.11: icmp_seq=2 ttl=64 time=0.040 ms--- 172.18.0.11 ping statistics ---2 packets transmitted, 2 received, 0% packet loss, time 58msrtt min/avg/max/mdev = 0.038/0.039/0.040/0.001 ms从根命名空间ping ceth0(172.18.0.10)
ping -c 2 172.18.0.10PING 172.18.0.10 (172.18.0.10) 56(84) bytes of data.64 bytes from 172.18.0.10: icmp_seq=1 ttl=64 time=0.073 ms64 bytes from 172.18.0.10: icmp_seq=2 ttl=64 time=0.046 ms--- 172.18.0.10 ping statistics ---2 packets transmitted, 2 received, 0% packet loss, time 3msrtt min/avg/max/mdev = 0.046/0.059/0.073/0.015 ms同时,如果尝试从netns0命名空间访问其他任何地址是ping不通的 。
ip addr show dev eth02: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000link/ether 52:54:00:e3:27:77 brd ff:ff:ff:ff:ff:ffinet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic noprefixroute eth0valid_lft 84057sec preferred_lft 84057secinet6 fe80::5054:ff:fee3:2777/64 scope linkvalid_lft forever preferred_lft foreversudo nsenter --net=/var/run/netns/netns0ping 10.0.2.15connect: Network is unreachableping 8.8.8.8connect: Network is unreachable这是显而易见的,因为netns0路由表中根本没有这类数据包的路由 。唯一的条目显示了如何连接172.18.0.0/16网络:
ip route172.18.0.0/16 dev ceth0 proto kernel scope link src 172.18.0.10Linux有很多设置路由表的方法 。其中之一是从直接连接的网络接口提取路由 。请记住,netns0命名空间创建后,其中的路由表为空 。但是随后在ceth0此处添加了设备并为其分配了IP地址172.18.0.10/16 。由于使用的不是简单的IP地址,而是地址和网络掩码的组合,因此网络堆栈设法从中提取路由信息 。每个发往172.18.0.0/16网络的数据包都将通过ceth0设备发送 。但是任何其他数据包将被丢弃 。同样,根命名空间中新增加了一条路由:
ip route172.18.0.0/16 dev veth0 proto kernel scope link src 172.18.0.11我们知道如何隔离、虚拟化和连接Linux网络堆栈 。
通过网桥(虚拟路由器)容器互联容器化的整个思想归结为有效的资源共享 。也就是说,每台机器显然不可能只有一个容器 。相反,会尽最大可能在共享环境中运行更多的容器 。试想,按照同样步骤,在上面的基础上,再增加第二个容器:
sudo ip netns add netns1sudo ip link add veth1 type veth peer name ceth1sudo ip link set ceth1 netns netns1sudo ip link set veth1 upsudo ip addr add 172.18.0.21/16 dev veth1sudo nsenter --net=/var/run/netns/netns1ip link set lo upip link set ceth1 upip addr add 172.18.0.20/16 dev ceth1然后,检查连通性:
从netns1 ping 根命名空间:
ping -c 2 172.18.0.21PING 172.18.0.21 (172.18.0.21) 56(84) bytes of data.From 172.18.0.20 icmp_seq=1 Destination Host UnreachableFrom 172.18.0.20 icmp_seq=2 Destination Host Unreachable--- 172.18.0.21 ping statistics ---2 packets transmitted, 0 received, +2 errors, 100% packet loss, time 55mspipe 2ping不通,看一下路由:
ip route:172.18.0.0/16 dev ceth1 proto kernel scope link src 172.18.0.20有路有!
从根命名空间ping netns1:
ping -c 2 172.18.0.20PING 172.18.0.20 (172.18.0.20) 56(84) bytes of data.From 172.18.0.11 icmp_seq=1 Destination Host UnreachableFrom 172.18.0.11 icmp_seq=2 Destination Host Unreachable--- 172.18.0.20 ping statistics ---2 packets transmitted, 0 received, +2 errors, 100% packet loss, time 23mspipe 2从netns0可以ping通veth1
【Docker容器网络实操教程】sudo nsenter --net=/var/run/netns/netns0ping -c 2 172.18.0.21PING 172.18.0.21 (172.18.0.21) 56(84) bytes of data.64 bytes from 172.18.0.21: icmp_seq=1 ttl=64 time=0.037 ms64 bytes from 172.18.0.21: icmp_seq=2 ttl=64 time=0.046 ms--- 172.18.0.21 ping statistics ---2 packets transmitted, 2 received, 0% packet loss, time 33msrtt min/avg/max/mdev = 0.037/0.041/0.046/0.007 ms


推荐阅读