国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Libnetwork CNM框架與實現(xiàn)

sixgo / 2642人閱讀

摘要:本文將描述以下內(nèi)容框架模的實現(xiàn)原理框架模型下的網(wǎng)絡(luò)模型如上所示。的一種典型實現(xiàn)是。將這些加入到,即實現(xiàn)了多個的互通。注意三種接口都有其對應(yīng)的實現(xiàn)如接口的實現(xiàn)為。而插件型的是運行在上,通過通道與之間進行通信。

簡介

Libnetwork是從docker1.6開始,逐漸將docker項目中的網(wǎng)絡(luò)部分抽離出來形成的Lib,作用是為其他應(yīng)用程序(如docker engine)提供一套抽象的容器網(wǎng)絡(luò)模型,該模型也被稱為Container Network Model,簡稱CNM。本文將描述以下內(nèi)容

CNM框架模

Libnetwork的實現(xiàn)原理

plugin demo

CNM 框架


CNM模型下的docker網(wǎng)絡(luò)模型如上所示。它由Sandbox, Endpoint, Network 三種組件組成。注意,該模型只是規(guī)定了三種組件各自的作用,他們都有各自的具體實現(xiàn)方式。
Sandbox: Sandbox包含了一個Container的網(wǎng)絡(luò)相關(guān)的配置,如網(wǎng)卡Interface,路由表等。Sandbox在Linux上的典型實現(xiàn)是Network namespace。在Linux系統(tǒng)上的docker環(huán)境中,Container,Network namespace,Sandbox 這三者是綁定在一起的。一個Sandbox可以包含多個Endpoint,這些Endpoint 可以來自多個Network
Endpoint: Sandbox加入Network的方式是通過Endpoint完成的。Endpoint的典型實現(xiàn)方式是veth pair,每個Endpoint 都是由某個Network創(chuàng)建,創(chuàng)建后,它就歸屬于該Network,同時,Endpoint還可以加入(Join)一個Sandbox,加入后,相當(dāng)于該Sandbox也加入了此Network。
Network:Network的一種典型實現(xiàn)是Linux bridge。一個Network可以創(chuàng)建多個Endpoint。將這些Endpoint加入到Sandbox,即實現(xiàn)了多個Sandbox的互通。

總結(jié)起來:如果要想兩個Container之間可以直接通信,那么最簡單的辦法就是由一個Network創(chuàng)建兩個Endpoint,分別加入這兩個Container對應(yīng)的Sandbox。

注意: 不同Network之間默認的隔離性是docker通過設(shè)置iptables完成的,通過改變iptables的設(shè)置,可以使得兩個Network互通。

Libnetwork 實現(xiàn) 核心對象

LibNetwork是CNM框架的實現(xiàn),Network、Sandbox、Endpoint三種接口描述了前面的三種組件,三種接口分別在network.go 、sandbox.goendpoint.go實現(xiàn)

三個接口需要實現(xiàn)的方法的關(guān)系如上圖所示。注意:三種接口都有其對應(yīng)的實現(xiàn)(如Network接口的實現(xiàn)為network)。

NetworkController 為 docker engine提供創(chuàng)建Network的API,比如我們在使用命令 docker network create 創(chuàng)建網(wǎng)絡(luò)時,都是通過controller創(chuàng)建。

除此之外NetworkController接口的實現(xiàn)結(jié)構(gòu)controller還維護了一張Driver的注冊表(Registry),它記錄了所有支持的Driver

Driver 每個Network都有對應(yīng)的底層Driver,這些Driver負責(zé)在主機上真正實現(xiàn)需要網(wǎng)絡(luò)功能(如創(chuàng)建Veth設(shè)備)。Driver有兩種類型:1. 內(nèi)置型(如Bridge Host None) 2. 插件型。


無論是哪種類型,其工作方式都類似,docker engine發(fā)送請求,Libnetwork做一些框架性的動作,然后將請求傳給Driver做一些特異性的動作。兩者的差別在于,內(nèi)置性的Driver是內(nèi)置在Libnetwork內(nèi)部,它們也就是docker原生支持的網(wǎng)絡(luò)類型。而插件型的Driver是運行在Host上,通過socket通道與Libnetwork之間進行通信。

創(chuàng)建Controller

controller.go 中的 New() 是創(chuàng)建controller的入口。

func New(cfgOptions ...config.Option) (NetworkContriller, error) {
     c := controller{
         id: stringid.GenerateRandomID();
         sandboxes: sandboxTable{},
         .....
     }
     drvRegistry, err := drvregistry.New(......)
     for _, i := range getInitizers(c.cfg.Daemon.Experimental){
         drvRegistry.AddDriver(i.ntype,i.fn, dcfg)
     }
    
     c.drvRegistry = drvRegistry
}

可以看到,首先是創(chuàng)建controller,此外 它還創(chuàng)建了drvRegistry記錄注冊的Driver,并將 getInitizers() 的返回內(nèi)置型的 Driver 添加到 drvRegistry 上。

func getInitializers(experimental bool) []initialize {
    return []initializer {
        {bridge.Init, "bridge"},
        {host.Init, "host"},
        {macvlan.Init, "macvlan"},
        {null.Init, "null"},
        {remote.Init, "remote"},
        {overlay.Init, "overlay"},
        ......
    }
}

getInitizers() 包含的內(nèi)置型Driver如上圖所示,其中的每一項的Init()方法會被調(diào)用

創(chuàng)建網(wǎng)絡(luò)


創(chuàng)建 network 的入口NewNetwork()同樣在controller.go中,它首先創(chuàng)建一個通用的 network 結(jié)構(gòu),進而解析出 其Driver 類型,然后調(diào)用特定 DriverCreateNetwork() 方法。注意,如果是該網(wǎng)絡(luò)的類型不在 drvRegistry 上,則 Libnetwork 會嘗試從 Plugin 路徑 (/var/run/docker/plugins) 尋找 plugin-name.sock .之后,向該 socket 發(fā)送創(chuàng)建網(wǎng)絡(luò)的 request

bridge 為例,其最后會調(diào)用到 drivers/bridge/bridge.gocreateNetwork() 方法,該方法中,使用netlink提供的接口建立了 bridge net device

容器加入

在使用 docker run 啟動容器時可以通過指定 -net 參數(shù)將容器連接到特定的網(wǎng)絡(luò)。入口是 docker 項目中的 container_operations.goconnectToNetwork() 方法

圖中左側(cè)部分是屬于 docker engine ,中間部分屬于 Libnetwork , 右側(cè)部分屬于 Driver ??梢运紫葎?chuàng)建Endpoint,創(chuàng)建 Sandbox 和 Endpoint,然后將 Endpoint 加入該 Sandbox 。

Plugin Demo

docker 原生 Bridge 網(wǎng)絡(luò)的功能插件化,制作名為 myPlugin 的網(wǎng)絡(luò)插件,效果和原生的 Bridge 一樣.

Code

root@sb:/home/yc# ls -l /run/docker/plugins/
total 0
srw-rw---- 1 root root 0 8月  26 14:41 myplugin.sock

root@sb:/home/yc# docker network create --driver myplugin mynet
460db416c6f90fb16c499c5fd56b5e984d6472a113f5d8ed3f8633174159aa53
root@sb:/home/yc# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
6f5763ae335d        bridge              bridge              local
71d355df68ec        host                host                local
460db416c6f9        mynet               myplugin            local
91360b8a5fe4        none                null                local
docker run -tid --net=mynet busybox
617a314c4f69f835ab1a4e5cf9ce211a55e4651be4fa47e4ebd849c34c192e9d

root@sb:/home/yc# docker network inspect mynet
[
    {
        "Name": "mynet",
        "Id": "460db416c6f90fb16c499c5fd56b5e984d6472a113f5d8ed3f8633174159aa53",
        "Created": "2018-08-26T14:42:51.998760172+08:00",
        "Scope": "local",
        "Driver": "myplugin",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "617a314c4f69f835ab1a4e5cf9ce211a55e4651be4fa47e4ebd849c34c192e9d": {
                "Name": "gallant_wozniak",
                "EndpointID": "90ce305bea6a2054ee953f6fcebd0d23c94058026ac594d686f4d731464d45d8",
                "MacAddress": "",
                "IPv4Address": "172.18.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/27531.html

相關(guān)文章

  • Cisco思科網(wǎng)絡(luò)插件Contiv (三) Plugin 實現(xiàn)原理

    摘要:網(wǎng)絡(luò)結(jié)構(gòu)上圖為的網(wǎng)絡(luò)模型,大體上可分為和兩個組件其中運行在每臺宿主機上主要負責(zé)與交互實現(xiàn)插件邏輯配置底層進程實現(xiàn)具體的網(wǎng)絡(luò)功能組件是與交互的核心邏輯以常用的為例該邏輯即是實現(xiàn)框架下所規(guī)定的種種接口實現(xiàn)與的消息交互關(guān)于和請查看與框架與實現(xiàn)同 Contiv網(wǎng)絡(luò)結(jié)構(gòu) showImg(https://segmentfault.com/img/remote/1460000017001034?w=...

    DevTalking 評論0 收藏0
  • Docker網(wǎng)絡(luò)

    摘要:容器與主機共享同一,共享同一套網(wǎng)絡(luò)協(xié)議棧路由表及規(guī)則等?;揪W(wǎng)絡(luò)配置平臺下,容器網(wǎng)絡(luò)資源通過內(nèi)核的機制實現(xiàn)隔離,不同的有各自的網(wǎng)絡(luò)設(shè)備協(xié)議棧路由表防火墻規(guī)則等,反之,同一下的進程共享同一網(wǎng)絡(luò)視圖。設(shè)計的網(wǎng)絡(luò)模型。 整理自《Docker進階與實戰(zhàn)》 Docker網(wǎng)絡(luò)現(xiàn)狀 為了解決容器網(wǎng)絡(luò)性能低下、功能不足的問題,Docker啟動了子項目Libnetwork。Libnetwork提出了新的...

    Euphoria 評論0 收藏0
  • docker系列--網(wǎng)絡(luò)模式解讀

    摘要:網(wǎng)絡(luò)主要是單機網(wǎng)絡(luò)和多主機通信模式。下面分別介紹一下的各個網(wǎng)絡(luò)模式。設(shè)計的網(wǎng)絡(luò)模型。是以對定義的元數(shù)據(jù)。用戶可以通過定義這樣的元數(shù)據(jù)來自定義和驅(qū)動的行為。 前言 理解docker,主要從namesapce,cgroups,聯(lián)合文件,運行時(runC),網(wǎng)絡(luò)幾個方面。接下來我們會花一些時間,分別介紹。 docker系列--namespace解讀 docker系列--cgroups解讀 ...

    haitiancoder 評論0 收藏0
  • docker系列--網(wǎng)絡(luò)模式解讀

    摘要:網(wǎng)絡(luò)主要是單機網(wǎng)絡(luò)和多主機通信模式。下面分別介紹一下的各個網(wǎng)絡(luò)模式。設(shè)計的網(wǎng)絡(luò)模型。是以對定義的元數(shù)據(jù)。用戶可以通過定義這樣的元數(shù)據(jù)來自定義和驅(qū)動的行為。 前言 理解docker,主要從namesapce,cgroups,聯(lián)合文件,運行時(runC),網(wǎng)絡(luò)幾個方面。接下來我們會花一些時間,分別介紹。 docker系列--namespace解讀 docker系列--cgroups解讀 ...

    zollero 評論0 收藏0
  • docker系列--網(wǎng)絡(luò)模式解讀

    摘要:網(wǎng)絡(luò)主要是單機網(wǎng)絡(luò)和多主機通信模式。下面分別介紹一下的各個網(wǎng)絡(luò)模式。設(shè)計的網(wǎng)絡(luò)模型。是以對定義的元數(shù)據(jù)。用戶可以通過定義這樣的元數(shù)據(jù)來自定義和驅(qū)動的行為。 前言 理解docker,主要從namesapce,cgroups,聯(lián)合文件,運行時(runC),網(wǎng)絡(luò)幾個方面。接下來我們會花一些時間,分別介紹。 docker系列--namespace解讀 docker系列--cgroups解讀 ...

    xiaotianyi 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<