Docker中的网络详解以及与OpenStack网络对比

来源:互联网 发布:js数组的排序函数 编辑:程序博客网 时间:2024/06/02 04:29

Docker中的网络详解以及与OpenStack网络对比

  Docker由于它出众的资源占有率和秒级启动等优势在PaaS层大行其道。那OpenStack是作为IaaS层服务的。他们的网络有什么共同点和区别呢?
  创建Docker用一句话概括就是“使用Docker创建一个进程,为这个进程创建隔离的环境,这样的环境可以称为Docker Container(容器),然后再在容器内部运行用户应用进程。”
       那么namespace和cgroup就不介绍了,都是Linux内核的知识,一个是隔离资源,一个是对资源的限制。这些实现了Docker网络的底层依赖(OpenStack也是一样的)。但是通过这几天的学习,觉得Docker的网络比OpenStack的更加简单。
       这张图是经典的OpenStack Neutron结构图(Juno),分析docker网络的时候可以跟这张图进行对比。
这里写图片描述
  Docker网络主流几种方法如下:
1、bridge桥接模式网络
  这里写图片描述
  Docker通过宿主机上的网桥(docker0)来连通容器内部的网络栈与宿主机的网络栈,实现容器与宿主机乃至外界的网络通信。
  文章开头的图是OpenStack Neutron的架构图。其实是利用了相同的知识。VM对应的是Container,veth就是Neutron中的vnet,是一个虚拟的接口。然后都是连接到了Linux bridge。只不过Docker中的Linux bridge叫做docker0,OpenStack上的叫做qbrXXX而已。而且OpenStack的网络不仅仅通过Linux bridge就能连通了,下面还有更复杂的Plugin(如ovs或者Linux bridge)。而Docker就是通过Linnux bridge就能让Container之间进行网络通信了。如果Docker要跟外界进行通信的话就需要利用NAT转换了。

2、Host模式
  这里写图片描述
  Docker Container的host网络模式在实现过程中,由于不需要额外的网桥以及虚拟网卡,故不会涉及docker0以及veth pair。创建出的子进程会与父进程共享同一个网络namespace。实现Docker Container与宿主机共享同一个网络环境,即实现host网络模式。
      这个网络环境也正好体现出了Docker的依赖宿主机(共用Linux内核)的特性。上层的Docker共用宿主机的ip地址和端口号。类似于在VMware或者Virtualbox虚拟化中的“桥接”网络。利用主机的物理网络进行对外界的通信,这样的优点就是对网络的配置变得更加简单。但是这样的缺点也很明显。Docker网络的灵活性被严重限制了。OpenStack中的Instance则不会有这样的网络形式。它们是完整的操作系统,内部有自己的Linux Bridge和端口号。OpenStack为Instance提供的只是vNIC网卡,以及Instance之间的连接和对外的L3-agent的实现。

3、使用Open vSwitch(OVS)打通网络
这里写图片描述
  这个架构图非常像使用Neutron Plugin的OpenStack网络。可以对照上图。同样是虚拟接口veth连接到Linux bridge,接着连接到OpenvSwitch的br-0上。通过OpenvSwitch的GRE或者VxLAN进行不同容器之间的网络连通。
那么使用这种方式优点是灵活、对现有物理网络没要求、业界主流。当然缺点也很明显,软件封装导致性能下降、复杂度相对较高、排错难度高(这个也是OpenStack网络为什么复杂的原因, OpenStack在Liberty版本之后已经使用架构较为简单的Linux Bridge作为网络Plugin了)
这里写图片描述
  这个是OpenvSwitch的结构图。那OpenvSwitch中其实也包含了Linux bridge。其实Docker0与这里的br-int其实结构是一样的。所以说OpenvSwitch中间包含了Docker0这个Linux bridge。所以换句话说Docker的实现方式3就是功能复杂一点的实现方式1。那么这样的优点也很清楚了,使用Open vSwitch(OVS)打通网络,就可以使用Open vSwitch的网络配置实现更加复杂的功能,如vxlan,gre等。但是缺点也很明显,引入了Open vSwitch使得网络变得复杂,Docker中的网络问题也更加不容易Debug了。

那么下面就介绍两种Docker特有的网络模式:
4、other container网络模式
  这个就是采用了other container网络模式,它能使用的网络环境即为左侧Docker Container brdige桥接模式下的网络。不创建自己的接口,而是使用现成的左边的container的网络。一个container只是创建了自己的进程,然后将网络通过命令参数直接指向另一个网络已经READY的container上。在这种模式下的Docker Container可以通过localhost来访问namespace下的其他容器,传输效率较高。这样的优点也就是配置简单,但是缺点就是不能配置自身的网络属性了。而在OpenStack中的虚拟机这样做是不现实的。OpenStack中的虚拟机是不同的操作系统,Instance之间是相互独立的。不可能共享网络的namespace。这个网络特性也就只有共用Linux kernel的Docker才有这么独特的网络形式了吧。
这里写图片描述

5、none模式
  Docker Container的第五种网络模式是none模式。网络环境为none,即不为Docker Container任何的网络环境。一旦Docker Container采用了none网络模式,那么容器内部就只能使用loopback网络设备,不会再有其他的网络资源。
  这也体现了Docker设计理念的开放。开发者才能自由创建自己想要的网络组件了。而这种概念在OpenStack的虚拟机上是没有的,操作系统必须是有网络资源存在的。也体现了Docker的特点和不可替代性。

  总结:OpenStack的网络由于太复杂和不容易debug正在变得轻量化,更像是Docker的第一种组网方式,不过是多了一层Linux bridge。而Docker的网络(第一种)由于太简单,所以可以引入OpenvSwitch进行更加多功能的配置,而在业界生产环境大部分也都是这么做的。而由于Docker的天然特性(只是进程组成),所以使得Docker中的网络更加的开放可以供developer自由发挥也更加的包容。但是OpenStack和Docker的网络组成仍然很相似,或许是因为Linux的namespace和cgroup就这些网络组件的表现形式了吧。

参考文章:
孙宏亮 《docker源码分析》
https://www.gitbook.com/book/yeasy/docker_practice/details Docker——从入门到实践

0 0