Docker libnetwork(CNM)设计简介
The Container Network Model
CNM由以下三个组件构成:Sandbox,Endpoint以及Network

Sandbox
一个Sandbox包含了一个容器网络栈的配置。其中包括了对容器的网卡,路由表以及对DNS设置的管理。通常,一个Sandbox的实现可以是一个Linux Network Namespace,一个FreeBSD Jail或者其他类似的东西。一个Sandbox可以包含多个处于不同Network的Endpoint。
Endpoint
Endpoint将一个Sandbox加入一个Network。Endpoint的实现可以是一个veth对,一个Open vSwitch internal port或者其他类似的东西。一个Endpoint只能属于一个Network和一个Sandbox。
Network
Network是一个能够互相通信的Endpoint的集合。Network的实现可以是一个Linux网桥,一个VLAN等等。
CNM Objects
NetworkController object为用户(例如Docker Engine)创建和管理Network提供了简单的API。libnetwork支持多种类型的driver(包括内置的和远程的)。NetworkController允许用户将特定的driver和给定的Network绑定在一起。
Driver object对于用户并不是可见的,但是是它让Network能够正常工作。NetworkController提供了用专用的options/labels配置特定的driver的API,这些options/labels对于libnetwork是透明的,但是能被driver直接处理。其中Driver可以是内置的(例如Bridge,Host,None或者Overlay),也可以是远程的(由plugin provider提供)用来满足不同的使用和部署场景。此时,Driver拥有一个Network并且负责管理该Network(包括IPAM等等)。将来可以让多个Driver参与处理各种Network的管理。
Network object是上述CNM:Network的具体实现。NetworkController提供了创建和管理Network object的API。当一个Network被创建或更新时,相应的Driver会收到一个事件通知。LibNetwork使用Network object作为一个抽象层,用于将一系列属于同一个Network的Endpoint连接起来,并且隔离其余的Endpoint。而具体的对于连接和隔离的操作是由Driver提供的。连通的Endpoint可以位于同一个Host,也可以跨多个Host。因此,Network是一个全局的概念。
Endpoint代表了一个Service Endpoint。它为本容器暴露的Service和同一Network中的其他容器暴露的Service提供了连通性。Network object提供了用于创建和管理Endpoint的API。一个Endpoint只能和一个Network相连。Endpoint的创建和相应的Driver相对应,因为Driver负责为相应的Sandbox申请资源。因为Endpoint代表的是一个Service而不一定是特定的容器,因此Endpoint也是一个全局的概念。
Sandbox object代表了一个容器的网络配置,例如IP地址,Mac地址,路由以及DNS。Sandbox object是用户请求在一个Network里创建一个Endpoint时被创建的。该Network相对应的Driver负责申请相应的网络资源(例如IP地址)并且返回一个SandboxInfo的结构给libnetwork。libnetwork通过一些特定于操作系统的结构(例如Linux中的netns)将网络配置传递给容器,通常由一个Sandbox表示。一个Sandbox可以有多个Endpoint用于连接不同的Network。因为Sandbox和给定Host上的特定容器相关联,因此它只是一个局部的概念。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-40290-1.html
老成持重并不优于年轻热血