docker容器间网络互联原理,讲不明白算我输

author author     2023-03-15     339

关键词:

参考技术A

如上红字所描述:同一个宿主机上的不同容器之间的网络如何互通的???

我们安装完docker之后,docker daemon会为我们自动创建3个网络,如下:

其实docker有4种网络通信模型,分别是:bridge、host、none、container

默认的使用的网络模型是bridge,也是我们生产上会使用到的网络模型。

下文中跟大家分享docker容器互通原理到时候呢,用到的也是bridge网络模型

另外,当我们安装完docker之后,docker会为我们创建一个叫docker0的网络设备

通过ifconfig命令可以查看到它,看起来它貌似和eth0网络地位相当,像是一张网卡。然而并不是,docker0其实是一个Linux网桥

何以见得?可以通过下面的命令查看操作系统上的网桥信息

那大家怎么理解Linux网桥的概念呢?

其实大家可以把docker0理解成一台虚拟的交换机!然后像下面这样类比着理解,就会豁然开朗

1、它好比是大学在机房上课时,老师旁边的那个大大的交换机设备。

2、把机房里的电脑都连接在交换机上,类比成docker 容器作为一台设备都连接着宿主机上的docker0。

3、把交换机和机房中的机器的ip在同一个网段,类比成docker0、和你启动的docker容器的ip也同属于172网段。

类比成这样:

我们刚才做类比理解docker0的时候说:把机房里的电脑都连接在交换机上,类比成docker 容器作为一台设备都连接着宿主机上的docker0。那具体的实现落地实现用的是啥技术呢?

答案是:veth pair

veth pair的全称是:virtual ethernet,就是虚拟的以太网卡。

说到以太网卡大家都不陌生呀,不就是我们常见的那种叫eth0或者是ens的网络设备吗?

那这个veth pair是怎么玩的呢?有啥用呢?大家可以看下面这张图

veth-pair设备总是会成对的出现,用于连接两个不同network-namespace.

就上图来说,从network-namespace1的veth0中发送的数据会出现在 network-namespace2的veth1设备中。

虽然这种特性很好,但是如果出现有多个容器,你就会发现组织架构会越来越复杂,越来越乱

不过好在我们已经循序渐进的了解Linux网桥(docker0),以及这里的veth-pair设备,于是我们可以把整体的架构图重新绘制成下面这样

因为不同容器有自己隔离后的network-namespace所以他们都有自己的网络协议栈

那我们能不能找到容器里面的网卡和物理机上的哪张卡是一对网络vethpair设备呢?

如下:

回到宿主机

意思是就是说,容器545ed62d3abf的eth0网卡和宿主机通过ip addr命令查看的网络设备标号55的设备组成一对vethpair设备,彼此流量互通!

先看个简单的,同一个局域网中的不同主机A、B之间是如何互联交换数据的。如下图

那,既然是同一个局域网中,说明A、B的ip地址在同一个网段,如上图就假设它们都在192.168.1.0网段。

还得再看下面这张OSI 7层网络模型图。

主机A向主机B发送数据,对主机A来说数据会从最上层的应用层一路往下层传递。比如应用层使用的http协议、传输层使用的TCP协议,那数据在往下层传递的过程中,会根据该层的协议添加上不同的协议头等信息。

根据OSI7层网络模型的设定,对于接受数据的主机B来说,它会接收到很多数据包!这些数据包会从最下层的物理层依次往上层传递,依次根据每一层的网络协议进行拆包。一直到应用层取出主机A发送给他的数据。

那么问题来了,主机B怎么判断它收到的数据包是否是发送给自己的呢?万一有人发错了呢?

答案是:根据MAC地址,逻辑如下。

那对于主机A来说,它想发送给主机B数据包,还不能让主机B把这个数据包扔掉,它只能中规中矩的按以太网网络协议要求封装将要发送出去的数据包,往下传递到数据链路层(这一层传输的数据要求,必须要有目标mac地址,因为数据链路层是基于mac地址做数据传输的)。

那数据包中都需要哪些字段呢?如下:

其中的dst ip好说,我们可以直接固定写,或者通过DNS解析域名得到目标ip。

那dst mac怎么获取呢?

这就不得不说ARP协议了! ARP其实是一种地址解析协议,它的作用就是:以目标ip为线索,找到目的ip所在机器的mac地址。也就是帮我们找到dst mac地址!大概的过程如下几个step

推荐阅读:白日梦的DNS笔记

简述这个过程:主机A想给主机B发包,那需要知道主机B的mac地址。

嗯,在arp协议的帮助下,主机A顺利拿到了主机B的mac地址。于是数据包从网络层流转到数据链路层时已经被封装成了下面的样子:

根据OIS7层网络模型,我们都知道数据包经过物理层发送到机器B,机器B接收到数据包后,再将数据包向上流转,拆包。流转到主机B的数据链路层。

那主机B是如何判断这个在数据链路层的包是否是发给自己的呢?

答案前面说了,根据目的mac地址判断。

这个例子比较简单,dst ip就是主机B的本机ip 所以它自己会处理这个数据包。

那数据包处理完之后是需要给主机A一个响应包,那问题又来了,响应包该封装成什么样子呢?对主机B来说响应包也需要src ip、src mac、dst ip、dst mac

同样的道理,响应包也会按照如下的逻辑被主机A接受,处理。

这一次,让我在百度告诉你,当你请求 www.baidu.com 时都发生了什么?

有了上面那些知识储备呢?再看我们今天要探究的问题,就不难了。

如下红字部分:同一个宿主机上的不同容器是如何互通的?

那我们先分别登陆容器记录下他们的ip

先看实验效果:在9001上curl9002

实验结果是网络互通!

我们再完善一下上面的图,把docker0、以及两个容器的ip补充上去,如下图:

那两台机器之前要通信是要遵循OSI网络模型、和以太网协议的。

我们管172.17.0.2叫做容器2

我们管172.17.0.3叫做容器3

比如我们现在是从:容器2上curl 容器3,那么容器2也必须按照以太网协议将数据包封装好,如下

那现在的问题是容器3的mac地址是多少?

容器2会先查自己的本地缓存,如果之前没有访问过,那么缓存中也没有任何记录!

不过没关系,还有arp机制兜底,于是容器2会发送arp请求包,大概如下

容器2会查询自己的路由表,将这个arp请求从自己的gateway发送出去

我们发现容器2的网关对应的网络设备的ip就是docker0的ip地址,并且经由eth0发送出去!

哎?eth0不就是我们之前说的veth-pair设备吗?

并且我们通过下面的命令可以知道它的另一端对应着宿主机上的哪个网络设备:

而且我们可以下面的小实验,验证上面的观点是否正确

所以说从容器2的eth0出去的arp请求报文会同等的出现在宿主机的第53个网络设备上。

通过下面的这张图,你也知道第53个网络设备其实就是下图中的veth0-1

所以这个arp请求包会被发送到docker0上,由docker0拿到这个arp包发现,目标ip是172.17.0.3并不是自己,所以docker0会进一步将这个arp请求报文广播出去,所有在172.17.0.0网段的容器都能收到这个报文!其中就包含了容器3!

那容器3收到这个arp报文后,会判断,哦!目标ip就是自己的ip,于是它将自己的mac地址填充到arp报文中返回给docker0!

同样的我们可以通过抓包验证,在宿主机上

于是容器2就拿到了容器3的mac地址,以太网数据包需要的信息也就齐全了!如下:

再之后容器2就可以和容器3正常互联了!

容器3会收到很多数据包,那它怎么知道哪些包是发给自己的,那些不是呢?可以参考如下的判断逻辑

codevs6003一次做对算我输

    6003一次做对算我输 时间限制:1s空间限制:1000KB题目等级:大师Master   题目描述Description更新数据了!!!!!!!更新数据了!!!!!!!更新数据了!!!!!!!更新数据了!!!!!!!... 查看详情

docker网络-2(代码片段)

...减,通常用于本地调试,容器性能的衰减主要来自网络。dockerdaemon一旦停止,所有容器将退出;dockerd启动docker0虚拟网桥默认分配172.17.0.1/16网络,可修改配置文件:"bip":"192.168.1.1/24"修改docker0默认配置/etc/docker/daemo... 查看详情

docker容器网络通信原理分析

概述自从docker容器出现以来,容器的网络通信就一直是大家关注的焦点,也是生产环境的迫切需求。而容器的网络通信又可以分为两大方面:单主机容器上的相互通信和跨主机的容器相互通信。而本文将分别针对这两方面,对容... 查看详情

docker容器间通信

容器间通信可以通过IP、DockerDNSServer或joined容器三种方式通信1.IP通信两个容器要能通信,必须要有使用同一个网络的网卡,具体做法是在创建容器时通过--network指定相应网络,或是通过dockernetworkconnect将现有的容器加入到指定网... 查看详情

docker的底层原理实现(二十)

参考技术ADocker采用了C/S架构,包括客户端和服务端。Docker守护进程(Daemon)作为服务端接受来自客户端的请求,并处理这些请求(创建、运行、分发容器)。客户端和服务端既可以运行在一个机器上,也可通过socket或者RESTfulAPI... 查看详情

docker之容器间通信配置(代码片段)

当你开始大规模使用Docker时,你会发现需要了解很多关于网络的知识。Docker作为目前最火的轻量级容器技术,有很多令人称道的功能,如Docker的镜像管理。然而,Docker同样有着很多不完善的地方,网络方面就是Docker比较薄弱的部... 查看详情

docker学习docker容器网络通信原理分析(代码片段)

   概述自从docker容器出现以来,容器的网络通信就一直是大家关注的焦点,也是生产环境的迫切需求。而容器的网络通信又可以分为两大方面:单主机容器上的相互通信,和跨主机的容器相互通信。而本文将分别针对... 查看详情

为啥我的 Docker 容器中的网络/互联网这么慢?

】为啥我的Docker容器中的网络/互联网这么慢?【英文标题】:Whyisnetwork/internetinmyDockercontainersoslow?为什么我的Docker容器中的网络/互联网这么慢?【发布时间】:2017-06-1421:06:10【问题描述】:我问这个问题是因为我花了很长时间... 查看详情

前端啃完这些题,你拿不到20k算我输!

Vue面试题生命周期函数面试题1.什么是vue生命周期2.vue生命周期的作用是什么3.第一次页面加载会触发哪几个钩子4.简述每个周期具体适合哪些场景5.created和mounted的区别6.vue获取数据在哪个周期函数7.请详细说下你对vue生命周期的... 查看详情

docker网络管理(容器间通信)(代码片段)

一、前言由于docker技术的火爆,导致现在越来越多的企业都在使用docker这种虚拟化技术。企业中使用docker这种虚拟化技术,其目的就是为了让docker中的容器对外提供服务。因此,我们必须深入了解一下docker的网络知识,以满足更... 查看详情

25道神奇的javascript示例,全答对算我输!!!(代码片段)

前言JavaScript是一种很好的语言。它有一个简单的语法,庞大的生态系统,以及最重要,最伟大的社区。同时,我们都知道,JavaScript是一个非常有趣又充满戏法的语言。他们中的有些可以迅速将我们的日常工作... 查看详情

docker网络类型访问原理(代码片段)

•bridge–net=bridge默认网络,Docker启动后创建一个docker0网桥,默认创建的容器也是添加到这个网桥中。•host–net=host容器不会获得一个独立的networknamespace,而是与宿主机共用一个。这就意味着容器不会有自己的网卡信... 查看详情

docker容器网络通信原理分析

...;熟悉CloudStack,OpenStack等开源云平台软件,同时对docker有一定研究积累和经验。概述自从docker容器出现以来,容器的网络通信就一直是大家关注的焦点,也是生产环境的迫切需求。而容器的网络通信又可以分为两... 查看详情

容器化工具--------docker的网络操作(代码片段)

文章目录Docker网络操作Docker网络实现的原理Docker的网络模式host网络模式container模式none模式Bridge模式自定义网络Docker网络操作Docker网络实现的原理1.Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一... 查看详情

容器化工具--------docker的网络操作(代码片段)

文章目录Docker网络操作Docker网络实现的原理Docker的网络模式host网络模式container模式none模式Bridge模式自定义网络Docker网络操作Docker网络实现的原理1.Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一... 查看详情

❤『面试知识集锦100篇』3.mysql篇丨mysql基础知识和面试真题,看完不收藏算我输!!

作者:不吃西红柿简介:CSDN博客专家、蓝桥签约作者、大数据&Python领域优质创作者。谢谢那些曾经击倒我的人,躺着可真TM舒服。目录一、知识体系1、关系型数据库术语2、事务的基本要素(ACID) 查看详情

深度分析:面试阿里,字节跳动,美团90%被问到的list集合,看完还不懂算我输

1List集合1.1List概述在Collection中,List集合是有序的,可对其中每个元素的插入位置进行精确地控制,可以通过索引来访问元素,遍历元素。在List集合中,我们常用到ArrayList和LinkedList这两个类。关于JavaList的一些重要观点是;JavaList... 查看详情

docker网络技术剖析

Docker中的网络功能介绍docker容器访问外网,外网访问docker容器,docker容器间互访,编译包制作成rpm包,docker容器分割VLAN通信,实验环境:未开启selinux防伪码:青春以梦为马默认情况下,容器可以建立到外部网络的连接,但是外... 查看详情