Docker网络模型

Docker的四种网络模式

一.Closed Container模式(全封闭式网络,又叫Docker的none模式)
特点:容器只有一个环回口
通信方式:无法与其他容器和宿主机之外的机器进行通信,只能容器内的服务之间通过环回口通信
在这里插入图片描述
二.bridged Container模式(NAT桥模式,又叫Docker的bridge模式)
特点:docker创建一个虚拟软交换机,容器有一对网卡,一个在容器上,另一个在软交换机上(docker0桥),两个网卡天然连接(相当于通过线直连在一起)
通信:宿主机内连接在同一网桥上的容器之间可以直接通信,不连在同一网桥上的,可以通过内核开启转发,但是默认会有防火墙规则进行阻挡。宿主机内的容器与外部进行沟通时,通过真实网卡,使用NAT技术进行通信

在这里插入图片描述
注:图中的Container Virtual interface 是在Docker 0 网桥上的那半块网卡,private interface是在容器上的那半块网卡(专业点讲,其实两块网卡构成一个Veth设备对,设备对两端连接的两个终端可以进行通信,我们这里是将这个设备对的一个放在容器上,另一个放在网桥上,来实现同一Host容器间和外部的通信的)

三.Joined Container模式(联盟式网络,又叫Docker的container模式)
特点:几个容器共享使用相同的网络空间和协议栈(一部分命名空间共享,一部分不共享),这几个容器称为一个联盟
通信方式:联盟内部的容器之间通信使用的是本地的环回口,联盟内容器与联盟外容器通信时,使用联盟的网络空间和协议栈
在这里插入图片描述
四.Open Container模式(又叫Docker的host模式)
特点:容器与真实宿主机共享同一个网络命名空间和协议栈
通信:同一宿主机内的Host通信使用的是宿主机的环回口,与外部主机通信使用的宿主机的协议栈
在这里插入图片描述

Docker与外部主机通信的原理

一.常见的三种跨宿主机通信的方式
1.Host模式
容器直接使用宿主机的网络(即我们上边介绍的Host模式),这样天生就可以支持跨主机通信,这种方式虽然可以解决跨主机通信的问题,但应用场景非常的有限,容易出现端口冲突,也无法对容器的网络环境进行隔离,一个容器崩溃很有可能造成其他容器也崩溃

2.端口绑定:通过绑定容器端口到宿主机端口,跨主机通信时使用“主机IP+端口”的方式访问容器中的服务。显然这种方式仅能支持网络栈的4层及以上的应用,并且容器与宿主机紧耦合,很难灵活的处理问题

3.定义容器网络:使用Open vSwitch或Flannel等第三方SDN工具,为容器构建出可以跨主机通信的网络环境。这类方案一般要求各个主机上的Docker0网桥的cidr(网段)不同,以避免出现IP冲突的问题,限制容器在宿主机上可获取的IP范围

二.从网络实现方式来看两种不同的方案
(1)隧道方案:隧道方案在IaaS层的网络中应用也比较多,它的主要缺点是随着节点规模的增长复杂度会提升,而且出了网络问题后跟踪起来比价麻烦,大规模集群情况下这是一个需要考虑的一个问题
Open vSwitch(OVS):基于VxLan和GRE协议,但是性能方面损失比较严重
Flannel:UDP广播,VxLan
Racher:IPsec

(2)路由方案:一般是基于3层或者2层实现网络隔离和跨主机容器互通的,出了问题也很容易排查
Calico:基于BGP协议的路由方案,支持很细致的ACL控制,对混合云亲和度比较高

我们着重介绍一些Flannel网络方案,因为Flannel是kubernets默认使用的网络方案

三.Flannel网络方案
Flannel是由CoreOS维护的一个虚拟网络方案,由go语言编写,是kubernetes默认的网络,Flannel之所以可以搭建Kubernetes依赖的底层网络,是因为
(1)它为每个Node的Docker容器分配互不冲突的IP地址
(2)它能为这些IP地址之间建立一个叠加网络(overlay),通过叠加网络将数据包原封不动的传递到目标容器内

其设计的目的是:为集群中的所有节点重新规划IP地址的使用规则,从而使得不同节点上的容器能够获得同属一个内网且不重复的IP地址,并让属于不同节点上的容器能够直接通过内网IP通信

Flannel实质是一种叠加网络,也就是将TCP数据包装在另一种网络包里面进行路由转发和通信,目前已经支持UDP,Vxlan等数据转发方式,默认的节点间数据通信方式是UDP转发
在这里插入图片描述
一个网络报文从一个容器发送到另一个容器需要经过如下过程
(1)容器直接使用目标容器的IP访问,默认通过容器内部的veth0发送出去
(2)报文通过veth0被发送到veth pair
(3)veth pair是直接连接到虚拟交换机Docker0上的,报文通过bridge Docker0发送出去(Docker0查找路由表)
(4)查找路由表,外部容器IP的报文都会转发到Flannel0虚拟网卡上,这是一个P2P的虚拟网卡,然后报文就被转发到监听在另一端的flanneld
(5)Flanneld通过etcd维护了各个节点之间的路由表,将数据包封装在UDP报文里再重新封装新的IP头部(Flanneld知道对应的容器地址再哪个节点上)
(6)报文通过主机之间的网络找到目标主机
(7)报文继续往上送,到达传输层,交给监听在8285端口的flanneld程序处理
(8)数据包被解包,然后发送给Flannel0虚拟网卡
(9)查找路由表,发现对应容器的报文要交给Docker0
(10)Docker0找到连到自己的容器,把报文发送出去

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值