问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
你好,欢迎来到懂视!登录注册
当前位置: 首页 - 正文

Docker容器网络-实现篇

发布网友 发布时间:2022-09-01 17:36

我来回答

1个回答

热心网友 时间:2024-11-13 19:38

前面介绍了: Docker容器网络-基础篇

前文说到容器网络对Linux虚拟化技术的依赖,这一篇章我们将一探究竟,看看Docker究竟是怎么做的。通常,Linux容器的网络是被隔离在它自己的Network Namespace中,其中就包括:网卡(Network Interface)、回环设备(Loopback Device)、路由表(Routing Table)和iptables规则。对于一个进程来说,这些要素,就构成了它发起和响应网络请求的基本环境。

我们在执行 docker run -d --name xxx 之后,进入容器内部:

并执行 ifconfig:

我们看到一张叫eth0的网卡,它正是一个Veth Pair设备在容器的这一端。

我们再通过 route 查看该容器的路由表:

我们可以看到这个eth0是这个容器的默认路由设备。我们也可以通过第二条路由规则,看到所有对 169.254.1.1/16 网段的请求都会交由eth0来处理。

而Veth Pair 设备的另一端,则在宿主机上,我们同样也可以通过查看宿主机的网络设备来查看它:

在宿主机上,容器对应的Veth Pair设备是一张虚拟网卡,我们再用 brctl show 命令查看网桥:

可以清楚的看到Veth Pair的一端 vethd08be47 就插在 docker0 上。

我现在执行docker run 启动两个容器,就会发现docker0上插入两个容器的 Veth Pair的一端。如果我们在一个容器内部互相ping另外一个容器的IP地址,是不是也能ping通?

容器1:

容器2:

从一个容器ping另外一个容器:

我们看到,在一个容器内部ping另外一个容器的ip,是可以ping通的。也就意味着,这两个容器是可以互相通信的。

我们不妨结合前文时所说的,理解下为什么一个容器能访问另一个容器?先简单看如一幅图:

当在容器1里访问容器2的地址,这个时候目的IP地址会匹配到容器1的第二条路由规则,这条路由规则的Gateway是0.0.0.0,意味着这是一条直连规则,也就是说凡是匹配到这个路由规则的请求,会直接通过eth0网卡,通过二层网络发往目的主机。而要通过二层网络到达容器2,就需要127.17.0.3对应的MAC地址。所以,容器1的网络协议栈就需要通过eth0网卡来发送一个ARP广播,通过IP找到MAC地址。

所谓ARP(Address Resolution Protocol),就是通过三层IP地址找到二层的MAC地址的协议。这里说到的eth0,就是Veth Pair的一端,另一端则插在了宿主机的docker0网桥上。eth0这样的虚拟网卡插在docker0上,也就意味着eth0变成docker0网桥的“从设备”。从设备会降级成docker0设备的端口,而调用网络协议栈处理数据包的资格全部交给docker0网桥。

所以,在收到ARP请求之后,docker0就会扮演二层交换机的角色,把ARP广播发给其它插在docker0网桥的虚拟网卡上,这样,127.17.0.3就会收到这个广播,并把其MAC地址返回给容器1。有了这个MAC地址,容器1的eth0的网卡就可以把数据包发送出去。这个数据包会经过Veth Pair在宿主机的另一端veth26cf2cc,直接交给docker0。

docker0转发的过程,就是继续扮演二层交换机,docker0根据数据包的目标MAC地址,在CAM表查到对应的端口为veth8762ad2,然后把数据包发往这个端口。而这个端口,就是容器2的Veth Pair在宿主机的另一端,这样,数据包就进入了容器2的Network Namespace,最终容器2将响应(Ping)返回给容器1。在真实的数据传递中,Linux内核Netfilter/Iptables也会参与其中,这里不再赘述。

CAM就是交换机通过MAC地址学习维护端口和MAC地址的对应表

这里介绍的容器间的通信方式就是docker中最常见的bridge模式,当然此外还有host模式、container模式、none模式等,对其它模式有兴趣的可以去阅读相关资料。

好了,这里不禁问个问题,到目前为止只是单主机内部的容器间通信,那跨主机网络呢?在Docker默认配置下,一台宿主机的docker0网桥是无法和其它宿主机连通的,它们之间没有任何关联,所以这些网桥上的容器,自然就没办法多主机之间互相通信。但是无论怎么变化,道理都是一样的,如果我们创建一个公共的网桥,是不是集群中所有容器都可以通过这个公共网桥去连接?

当然在正常的情况下,节点与节点的通信往往可以通过NAT的方式,但是,这个在互联网发展的今天,在容器化环境下未必适用。例如在向注册中心注册实例的时候,肯定会携带IP,在正常物理机内的应用当然没有问题,但是容器化环境却未必,容器内的IP很可能就是上文所说的172.17.0.2,多个节点都会存在这个IP,大概率这个IP是冲突的。

如果我们想避免这个问题,就会携带宿主机的IP和映射的端口去注册。但是这又带来一个问题,即容器内的应用去意识到这是一个容器,而非物理机,当在容器内,应用需要去拿容器所在的物理机的IP,当在容器外,应用需要去拿当前物理机的IP。显然,这并不是一个很好的设计,这需要应用去配合配置。所以,基于此,我们肯定要寻找其他的容器网络解决方案。

在上图这种容器网络中,我们需要在我们已有的主机网络上,通过软件构建一个覆盖在多个主机之上,且能把所有容器连通的虚拟网络。这种就是Overlay Network(覆盖网络)。

关于这些具体的网络解决方案,例如Flannel、Calico等,我会在后续篇幅继续陈述。

声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com
可以在网上开通农村信用社快捷支付吗怎么开通 农村信用社如何开通电子支付 我和一个女生联系两三年了,她是我的同学,她和我聊天一直都很热情,也什... 我是二十岁男生,和一个女生是多年同学,和她关系不错的。我在假期准备... 如果一个男生约一个女生出去玩 小学毕业考有个同学的试卷改错了能改回来吗??? UI生物超微介入治疗女性压力性尿失禁要多少费用? 压力性尿失禁手术费 肯尼-西尔斯几号球衣 honest轨道锯怎么样 每年冬天我都要咳嗽,一咳就是将近一个月,有没有好点的药啊? 一到冬天特容易咳痰怎么治 冬天夜里,总是喉咙痒,痰多,后背凉,如何才能治本? 歌曲缘分让我认识了你原唱祁隆,缘分让我认识了你。歌名是什么 缘分让我认识你的原唱歌曲,《缘分让我认识了你》原唱是祁隆唱吗? 全球挪车项目到底怎么样? 办公室的正确坐姿有哪些 办公室的正确坐姿是什么 古希腊最具有智慧的七位学者是哪些? 七年级地理下册教材分析 我在使用CAD 画本子上的图时 出现很多误差,请问这些是要如何处理 CAD作图总是画不准怎么办 如何解决CAD标注误差现象 圣斗士星矢手游能不能把转QQ上 圣斗士星矢手游怎么换么换桌面贵鬼 圣斗士星矢手游在哪可以看到自己的账号 圣斗士星矢手游大厅皮肤怎么更换 《齐策》中,《孟尝君将入秦》的“独”是什么意思? 淘宝爱多家家居家纺的那件贡缎四件套很便宜,有没有人用过 请问淘宝网店那家的家纺好点?性价比较高!不一定是品牌! Docker容器间网络互联原理,讲不明白算我输 如何用qq号申请不用手机号 怎样用qq号申请不用手机号 没有手机号跟qq怎么申请? qq号怎么申请不用手机号 怎么用qq号申请,而不是用手机号申请 古诗词大赛开场白 古诗词朗诵比赛开场白 古诗词大赛主持开场白 急需一份大学生入党思想汇报,内容是有关科学发展观的,急需~~!!! 怎么改第二次 怎么第二次修改? 缘分让我认识了你的歌,缘分让我认识了你是什么歌 怎么第二次修改 未满一年怎么改第二次 缘分让我认识是意外,缘份让我认识了你是什么歌名 黑檀木佛珠和小叶紫檀佛珠哪个更加好 怎么二次更改 第二次该如何修改? 怎么修改第二次
  • 焦点

最新推荐

猜你喜欢

热门推荐