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上的特定容器相关联,因此它只是一个局部的概念。

CNM Attribute

Options 提供了一种通用灵活的机制,可以让用户直接向Driver传递特定的配置选项。Option其实只是一些key-value pair,其中key由一个字符串表示,value由一个generic object表示(例如go中的interface{})。Libnetwork只有在Option中的key和net-labels包中已知的Label匹配是才对它进行操作。同时Options也包含了下面要描述的Labels。通常,Options对于用户是不可见的,但是Labels可以。

Labels和Options非常类似,事实上,它是Options的一个子集。Labels对于用户是可见的,可以在UI中呈现通过使用--labels选项。它们从UI传递到Driver,从而Driver能够使用它并且执行一些特定的操作(例如从一个Network中申请IP地址)

CNM Lifecycle

CNM的用户通过与CNM的Object以及API的交互来管理对应容器的网络。

  1. Driver要向NetworkController注册。内置的Driver在Libnetwork内注册,远程的Driver则通过Plugin mechanism注册。每一个Driver处理特定的networkType。
  2. NetworkController通过libnetwork.New()创建,用于Network的创建以及通过一些特定的Options配置Driver。
  3. Network通过给controller的NewNetwork()API提供name和networkType来创建。networkType参数用来选择特定的Driver并且将创建的Network和该Driver相关联。从此以后,对于Network的任何操作都由Driver处理。
  4. controller.NewNetwork()还有一个可选的options参数,用于提供特定Driver的options和Labels。
  5. network.CreateEndpoint()可以用于在给定的Network中创建一个新的Endpoint。同时该API还有一个可选的options参数供Driver使用。这个"options"既可以携带已知的labels,也可以携带和特定Driver相关的labels。之后调用相应的Driver的driver.CreateEndpoint,它可以为在一个Endpoint在Network中被创建时,为它们保留IP地址。Driver会通过driverapi中定义的InterfaceInfo进行这些地址的赋值。IP地址将和endpoint暴露的端口用来完善Endpoint作为Service的定义。事实上,Service endpoint不是其他什么东西,仅仅只是一个网络地址以及该应用的容器监听的端口号。
  6. endpoint.Join()用于将Endpoint与一个容器相连接。Join操作会先创建一个Sandbox如果对应的容器中还没有的话。Driver可以使用Sandbox Key来识别连接到同一个容器的多个Endpoint。这个API同样接受可选的options参数供Driver使用。
    • 虽然这并不是Libnetwork直接的设计要求,但是我们鼓励像Docker这样的用户在执行容器的Start()操作时,即在容器可以操作之前,调用endpoint.Join()。
    • 另一个关于endpoint.join()这个API经常被提到的问题是,为什么我们需要一个API创建Endpoint和另一个API来join endpoint。事实上Endpoint代表的是一个Service,它可能有,也可能并没有容器支持。当一个Endpoint被创建的时候,会预留它所需的资源,因此任何容器都能连接该Endpoint并且获得一个一致的网络行为。
  7. endpoint.Leave()会在容器停止的时候被调用。Driver可以清除它在调用Join()时获取的状态。Libnetwork会在最后一个Endpoint离开的时候删除Sandbox。但是只要该Endpoint依旧存在,Libnetwork会依然保有IP地址并且在有新的容器加入的时候进行重用。这保证了容器的资源在停止并重启的过程中能够重用。
  8. endpoint.Delete()用于从一个Network中删除Endpoint。这将导致Endpoint的删除以及清空缓存的sandbox.Info
  9. network.Delete()用于删除Network。如果还有Endpoint连接到该网络,Libnetwork是不允许对它进行删除的。

Docker libnetwork(CNM)设计简介的更多相关文章

  1. 小D课堂 - 新版本微服务springcloud+Docker教程_1_01课程简介

    笔记 ============================================= SpringCloud课程笔记.txt 第一章 课程介绍和学习路线 1.微服务架构SpringClou ...

  2. PHP实现微信随机红包算法和微信红包的架构设计简介

    微信红包的架构设计简介: 原文:https://www.zybuluo.com/yulin718/note/93148 @来源于QCon某高可用架构群整理,整理朱玉华. 背景:有某个朋友在朋友圈咨询微 ...

  3. 【Dubbo 源码解析】01_Dubbo 设计简介

    Dubbo 设计简介 Dubbo 采用 Microkernel + Plugin (微内核 + 插件)模式,Microkernel 只负责组装 Plugin,Dubbo 自身的功能也是通过扩展点实现的 ...

  4. PHP实现微信红包算法和微信红包的架构设计简介

    微信红包的架构设计简介: 原文:https://www.zybuluo.com/yulin718/note/93148 @来源于QCon某高可用架构群整理,整理朱玉华. 背景:有某个朋友在朋友圈咨询微 ...

  5. docker——libnetwork插件网络功能

    从1.7.0版本开始,Docker正是把网络和存储这两部分的功能都以插件化形式剥离出来,允许用户通过指令来选择不同的后端实现.剥离出来的独立容器网络项目叫libnetwork,从名字就能看出,它希望将 ...

  6. Docker学习笔记(1)-简介

    1. 简介 Docker使用Google公司推出的Go语言开发实现,基于Linux内核的cgroup, namespace以及AUFS类的UnionFS等技术,对进程进行封装隔离,属于操作系统层面的虚 ...

  7. ENode 2.6 架构与设计简介以及全新案例分享

    前言 ENode是一个应用开发框架,为开发人员提供了一整套基于DDD+CQRS+ES+EDA架构风格的解决方案.ENode从发布1.0开始到现在的差不多两年时间,我几乎每周都在更新设计或实现代码.以至 ...

  8. 【原创】运维基础之Docker(1)简介、安装、使用

    docker 18.09 官方:https://docs.docker.com/ 一 简介 Docker is a platform for developers and sysadmins to d ...

  9. WEB入门.五 页面设计简介

    学习内容 Ø        XHTML 的发展历程 Ø        XHTML 和 HTML 的区别 Ø        XHTML的DOCTYPE和基本标签 Ø        CSS 常用属性 能力 ...

随机推荐

  1. 浅谈 Objective-C 下对象的初始化

    转自:http://www.oschina.net/question/54100_32468 众所周知,Objective-C是一门面向对象的语言,一般情况下,我们在Objective-C中定义一个类 ...

  2. 从Python的角度来看编码与解码

    导语: Python2和Python3中,因为默认字符集的不同而造成的麻烦,简直是程序员的梦魇!要彻底告别这个麻烦,就需要从本质上来理解编码和解码. 为什么要有编码? 对于不会英文的中国人来说,将英文 ...

  3. ThinkPHP分页实例

    ThinkPHP分页实例 (2014-09-20 15:34:36)   很多人初学thinkphp时,不太熟悉thinkphp的分页使用方法,现在将自己整理的分页方法分享下,有需要的朋友可以看看. ...

  4. shell 实现mysql写入操作

    mysql -uroot study -proot << EOF > insert into top_n_movie(movie,sumprice)values('hello kit ...

  5. linux-centos jdk安装

    第一步:查看Linux自带的JDK是否已安装 (卸载centOS已安装的1.4) 安装好的CentOS会自带OpenJdk,用命令 java -version ,会有下面的信息: java versi ...

  6. VM虚拟机不能上网的问题解决

    VM虚拟机不能上网的问题解决 说在前面的话:很多网友看了我的文章后,虚拟机还是不能上网,就联系我帮忙,结果帮他们给弄好后,都说怪自己太粗心,没有仔细看文章.我不是怕网友麻烦我,我是真诚的希望各位要首先 ...

  7. javascript中的函数作用域和声明提前

    在一些类C的编程语言中,花括号内的每一段代码都具有各自作用域,并且变量在声明他们的代码段之外是不可见的,这个概念叫做块级作用域. javascript中没有块级作用域的概念,有的是函数作用域的概念:变 ...

  8. maven项目编译:程序包com.sun.image.codec.jpeg不存在 这个类文件的位置在jre/lib/rt.jar

    转载:http://superich2008.iteye.com/blog/2047830 失败提示信息为:程序包com.sun.image.codec.jpeg不存在 这个类文件的位置在jre/li ...

  9. hdu6058 Kanade's sum 区间第k大

    /** 题目:Kanade's sum 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6058 题意:给定[1,n]的排列,定义f(l,r,k)表示区间[l ...

  10. 卧槽! JavaScript JVM运行Java!!

    由于任何计算机语言都具有巨大的灵活性,软件世界变得有点疯狂.一旦你已经吸收了用这种语言编写的编译器的想法,那么它会编译还有什么可以留下来的?但是......用JavaScript编写的Java虚拟机J ...