zoukankan      html  css  js  c++  java
  • 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 即可实现访问。


















  • 相关阅读:
    redis 操作
    Xcode 改时间问题 lua代码没反应问题
    apk 反编译
    mysql远程连接命令
    python 利用三方的xlrd模块读取excel文件,处理合并单元格
    eclipse 新建项目不可选择Java Project 解决方法
    eclipse左边的工程列表窗口不见了解决方案
    python_pycham,连接数据库,执行sql
    Eclipse修改默认的语言编码设置,处理乱码
    httprunner中的分层(api、testcase、testsuite)及实际使用
  • 原文地址:https://www.cnblogs.com/menkeyi/p/13785937.html
Copyright © 2011-2022 走看看