容器 通信 一步一步解析

本文深入探讨了容器间的网络通信机制,包括同服务器和不同服务器的通信方式,涉及到veth-pair虚拟网卡对、网络命名空间、内核参数配置以及iptables的转发规则。同时,解释了容器如何通过网桥与外界通信,以及宿主机的nat伪装功能。文章还提到了容器网络配置中的问题和解决方法,以及环回网络接口的工作原理。
摘要由CSDN通过智能技术生成

一、当 启动了一个容器,会发现宿主机也多了一个网卡 , 进入容器,就能看到容器的网卡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 ,与外界通信 。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值