Docker网络模式
docker默认网络驱动模式
- birdge 桥接模式(docker在安装完成之后,默认的网络模式,可以认为是一个二层交换机,能力有限,只是一些简单的学习与转发的功能,向外通信数据报使用iptables做SNAT地址转换,最后通过主机路由实现跨节点及互联网通信)
- host 主机模式(顾名思义,不做网络隔离,与宿主机使用一个网络namespace,容器与主机使用同样的网络)
- none 自定义(自选网络插件,一般用不到)
- container 容器模式(如果在创建容器时,--netword=container:container_id,即代表与该指定的容器共享一个网络namespace)
Overlay
Overlay网络,是建立在现有的网络之上的虚拟逻辑网络,Overlay网络大多数都是基于Vxlan技术实现的(在现有的三层网络建立虚拟二层网络),也可以理解为一条虚拟的Vxlan隧道
Vxlan通过在UDP数据包中封装2层以太网数据帧,类似于Vlan的技术,并且突破VLAN4096的网络ID限制
Vxlan环境的必备条件,每个Contaienr都有一个veth网络接口用来接入,Vxlan的桥接Bridge虚拟交换机;每个节点都都有虚拟的二层bridge虚拟交换机,用来与其它节点通信的隧道
通信过程(单节点)通过本节点的bridge设备转发流量,不需要数据帧封装
以下摘抄地址http://c.biancheng.net/view/3198.html
- C1 发起 ping 请求,目标 IP 为 C2 的地址 10.0.0.4。该请求的流量通过连接到 Br0 虚拟交换机 veth 接口发出。虚拟交换机并不知道将包发送到哪里,因为在虚拟交换机的 MAC 地址映射表(ARP 映射表)中并没有与当前目的 IP 对应的 MAC 地址
- 所以虚拟交换机会将该包发送到其上的全部端口。连接到 Br0 的 VTEP 接口知道如何转发这个数据帧,所以会将自己的 MAC 地址返回。这就是一个代理 ARP 响应,并且虚拟交换机 Br0 根据返回结果学会了如何转发该包。接下来虚拟交换机会更新自己的 ARP 映射表,将 10.0.0.4 映射到本地 VTEP 的 MAC 地址上
- 现在 Br0 交换机已经学会如何转发目标为 C2 的流量,接下来所有发送到 C2 的包都会被直接转发到 VTEP 接口。VTEP 接口知道 C2,是因为所有新启动的容器都会将自己的网络详情采用网络内置 Gossip 协议发送给相同 Swarm 集群内的其他节点
- 交换机会将包转发到 VTEP 接口,VTEP 完成数据帧的封装,这样就能在底层网络传输。具体来说,封装操作就是把 VXLAN Header 信息添加以太帧当中
- VXLAN Header 信息包含了 VXLAN 网络 ID(VNID),其作用是记录 VLAN 到 VXLAN 的映射关系。每个 VLAN 都对应一个 VNID,以便包可以在解析后被转发到正确的 VLAN
- 封装的时候会将数据帧放到 UDP 包中,并设置 UDP 的目的 IP 字段为 node2 节点的 VTEP 的 IP 地址,同时设置 UDP Socket 端口为 4789。这种封装方式保证了底层网络即使不知道任何关于 VXLAN 的信息,也可以完成数据传输
- 当包到达 node2 之后,内核发现目的端口为 UDP 端口 4789,同时还知道存在 VTEP 接口绑定到该 Socket。所以内核将包发给 VTEP,由 VTEP 读取 VNID,解压包信息,并根据 VNID 发送到本地名为 Br0 的连接到 VLAN 的交换机。在该交换机上,包被发送给容器 C2
总结,现在容器网络大多数不会运用Overlay网络,数据帧封装会影响性能