一、当 启动了一个容器,会发现宿主机也多了一个网卡 , 进入容器,就能看到容器的网卡ID是15 。 这就是对应上了。
veth-pair 虚拟网卡对:两者之间存在着虚拟链路。特性:一端连接着协议栈,一端连接着彼此,数据从一端出,从另一端进。
二、2个容器,会怎么通信呢 ?
场景分为同服务器,与不同服务器。。先说同服务器的,另一个就差不多了
容器是有自己独立的network namespace 网络命名空间,进行模拟如下:
#添加1对虚拟网卡 : ip link add veth-1 type veth peer name veth-2 ( ip link delete veth-2其中一个网卡即可 )
#配置IP
ip addr add 192.168.1.1/24 dev veth-1
ip addr add 192.168.1.2/24 dev veth-2
#激活2个网卡 : ifconfig veth-1 up ; ifconfig veth-2 up
此时,正常Ping 是通的,但是ping 指定veth-2 就ping 不通了。
第一次连接,所以会事先发 ARP 包,但 veth1 并没有响应 ARP 包。系统内核中一些 ARP 相关的默认配置限制所导致的,需要修改一下配置项:
echo 1 > /proc/sys/net/ipv4/conf/veth-11/accept_local
echo 1 > /proc/sys/net/ipv4/conf/veth-2/accept_local
echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/veth-1/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/veth-2/rp_filter
此时,改了内核参数后,veth-2 有了回应 。但是ping 并没有收到回应。
再看看lo , 确认包给了lo ,并没有返回给ping
此处参考:https://www.cnblogs.com/bakari/p/10613710.html , 博主ping 可以收到返回,而我不能。
注:在上边第6点里,抓包能抓到lo 收到了包 ,但是并没有发出包 , 所以ping 并没有接到回应的原故吧。
但博主的抓包同样没有发出包,ping 却是能接收到包。我对自己判断又怀疑了。。。
模拟还没未完成,继续
#添加名字空间:ip netns add ns1 ( ip netns delete ns1 )
#把虚拟网卡,添加到 网络名字空间里:ip link set veth-1 netns ns1
#给虚拟网卡添加IP:ip netns exec ns1 ip addr add 192.168.1.1/24 dev veth-1
#网卡 UP:ip netns exec ns1 ip link set dev veth-1 up
通过本测试,可以看出来,同一个命名空间的网卡 之间的通信,只走lo 接口 。
---------------
那环回网络接口是如何判断目的IP是否为本机地址的呢?
答案就是网络层在进行路由转发的时候会先查本地的路由表,发现是本机IP后交给环回网络接口。查看本地路由表的命令如下:
ip route show table local
----------------
那么,同服务器的容器 通信 :
dockerA(veth-10)-->dockerA(veth-11) ----> lo ---> dockerB(veth-20) ---> dockerB(veth-21)
那么,不同服务器的容器通信呢 ?
在容器内,可以ping 宿主机的同网段服务器
清除掉iptables 的nat 规则 , 马上就不通了 。 说明就是靠iptables的转发。
跨服务器的通信就搞明白了。
那容器建立网桥,是做什么用 ? 照这么看,不用网桥也是可以的嘛
容器桥接在docker0 上 ,那这些虚拟网卡,就已经是跟网桥一体化了。管理一个网桥,比管理一大堆虚拟网卡要方便吧
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
这条是伪装 , 就是容器IP做nat 转发,伪装成宿主的IP ,与外界通信 。