Libnetwork 底层原理

CNM是什么?

        CNM (Container Network Model) 是 Docker 发布的容器网络标准,意在规范和指定容器网络发展标准,CNM 抽象了容器的网络接口


CNM定义网络标准的三个重要元素

       1、沙箱(Sandbox):沙箱代表了一系列网络堆栈的配置,其中包含路由信息、网络接口等网络资源的管理

    2、入口点(Endpoint):接入点将沙箱连接到网络中,代表容器的网络接口,接入点的实现通常是 Linux 的 veth 设备对。

    3、网络(Network):网络是一组可以互相通信的接入点,它将多接入点组成一个子网,并且多个接入点之间可以相互通信。

CNM 的三个要素基本抽象了所有网络模型


docker把网络功能剥离出来,Libnetwork开源项目就诞生了,golang编写完全遵循CNM网络规范


Libnetwork 的工作流程

第一步:Docker 通过调用 libnetwork.New 函数来创建 NetworkController 实例。NetworkController 是一个接口类型,提供了各种接口,代码如下:

type NetworkController interface {
    // 创建一个新的网络。 options 参数用于指定特性类型的网络选项。
    NewNetwork(networkType, name string, id string, options ...NetworkOption) (Network, error)
    // ... 此次省略部分接口
}


第二步:通过调用 NewNetwork 函数创建指定名称和类型的 Network,其中 Network 也是接口类型,代码如下:

type Network interface {
    // 为该网络创建一个具有唯一指定名称的接入点(Endpoint)
    CreateEndpoint(name string, options ...EndpointOption) (Endpoint, error)

   // 删除网络
    Delete() error
// ... 此次省略部分接口
}



第三步:通过调用 CreateEndpoint 来创建接入点(Endpoint)。在 CreateEndpoint 函数中为容器分配了 IP 和网卡接口。其中 Endpoint 也是接口类型,代码如下:

// Endpoint 表示网络和沙箱之间的逻辑连接。
type Endpoint interface {
    // 将沙箱连接到接入点,并将为接入点分配的网络资源填充到沙箱中。
    // the network resources allocated for the endpoint.
    Join(sandbox Sandbox, options ...EndpointOption) error
    // 删除接入点
    Delete(force bool) error
    // ... 此次省略部分接口
}


第四步:调用 NewSandbox 来创建容器沙箱,主要是初始化 Namespace 相关的资源。

第五步:调用 Endpoint 的 Join 函数将沙箱和网络接入点关联起来,此时容器就加入了 Docker 网络并具备了网络访问能力。



Libnetwork 常见网络模式

  1. null 空网络模式:可以帮助我们构建一个没有网络接入的容器环境,以保障数据安全。

  2. bridge 桥接模式:可以打通容器与容器间网络通信的需求。

  3. host 主机网络模式:可以让容器内的进程共享主机网络,从而监听或修改主机网络。

  4. container 网络模式:可以将两个容器放在同一个网络命名空间内,让两个业务通过 localhost 即可实现访问。


















posted @ 2020-10-09 15:18  MKY-门可意  阅读(723)  评论(0编辑  收藏  举报