0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

分享關(guān)于容器網(wǎng)絡(luò)模型CNM和libnetwork

冬至子 ? 來源:月影的成長日記 ? 作者:月影 ? 2023-05-20 14:17 ? 次閱讀

CNM

CNM (Container Network Model) 是 Docker 發(fā)布的容器網(wǎng)絡(luò)標(biāo)準(zhǔn)。也有不是Docker發(fā)布的標(biāo)準(zhǔn),例如CNI.CNI是由以Kubernetes為代表的公司發(fā)布的標(biāo)準(zhǔn)。主要還是因?yàn)镵ubernetes面對的是多容器而不是單容器,所以標(biāo)準(zhǔn)和docker的不一樣,有專門的博客來介紹為什么Kubernetes不選擇CNM作為容器的網(wǎng)絡(luò)標(biāo)準(zhǔn)。雖然最后k8s的CNI成為了容器網(wǎng)絡(luò)標(biāo)準(zhǔn),但是libnetwork的容器網(wǎng)絡(luò)模式使得pod中容器共享網(wǎng)絡(luò)環(huán)境成為可能。

libnetwork

Docker網(wǎng)絡(luò)部分代碼被抽離并單獨(dú)成為了Docker的網(wǎng)絡(luò)庫,即libnetwork。

圖片

(圖片來自網(wǎng)絡(luò),侵刪)

從上圖可以看到libnetwork和docker daemon之間的關(guān)系。Docker daemon通過調(diào)用libnetwork對外提供的API完成網(wǎng)絡(luò)的創(chuàng)建和管理等功能。libnetwork中則使用了CNM來完成網(wǎng)絡(luò)功能的提供。同時(shí)也可以看到CNM的三個(gè)重要元素:

沙箱(sandbox):沙箱代表一個(gè)容器網(wǎng)絡(luò)棧的信息??梢詫θ萜鞯?a target="_blank">接口、路由和DNS設(shè)置等進(jìn)行管理。沙盒的實(shí)現(xiàn)可以是Linux network namespace、FreeBSD Jail或者類似的機(jī)制。一個(gè)沙盒可以有多個(gè)端點(diǎn)和多個(gè)網(wǎng)絡(luò)。

接入點(diǎn)(Endpoint):接入點(diǎn)將沙箱連接到網(wǎng)絡(luò)中,代表容器的網(wǎng)絡(luò)接口,接入點(diǎn)的實(shí)現(xiàn)通常是 Linux 的 veth 設(shè)備。一個(gè)接入點(diǎn)只可以屬于一個(gè)網(wǎng)絡(luò)并且只屬于一個(gè)沙箱。

網(wǎng)絡(luò)(Network):網(wǎng)絡(luò)是一組可以直接互相聯(lián)通的接入點(diǎn)。網(wǎng)絡(luò)的實(shí)現(xiàn)可以是Linux bridge、VLAN等。它將多接入點(diǎn)組成一個(gè)子網(wǎng),并且多個(gè)接入點(diǎn)之間可以相互通信。

了解了CNM,接下來我們來認(rèn)識libnetwork的四種常見網(wǎng)絡(luò)模式:

  1. null 空網(wǎng)絡(luò)模式:可以幫助我們構(gòu)建一個(gè)沒有網(wǎng)絡(luò)接入的容器環(huán)境,以保障數(shù)據(jù)安全。
  2. bridge 橋接模式:可以打通容器與容器間網(wǎng)絡(luò)通信的需求。
  3. host 主機(jī)網(wǎng)絡(luò)模式:可以讓容器內(nèi)的進(jìn)程共享主機(jī)網(wǎng)絡(luò),從而監(jiān)聽或修改主機(jī)網(wǎng)絡(luò)。
  4. container 網(wǎng)絡(luò)模式:可以將兩個(gè)容器放在同一個(gè)網(wǎng)絡(luò)命名空間內(nèi),讓兩個(gè)業(yè)務(wù)通過 localhost 即可實(shí)現(xiàn)訪問。

(1)null 空網(wǎng)絡(luò)模式

空網(wǎng)意味著沒有網(wǎng)絡(luò)信息,就是一個(gè)單純的沒有連接網(wǎng)絡(luò)的一個(gè)容器。我們可以使用docker命令來創(chuàng)建一個(gè)空網(wǎng)模式的容器來檢查容器內(nèi)部的網(wǎng)絡(luò)信息,首先我們可以先打開正常模式的容器來看一下網(wǎng)絡(luò)信息:

/yapi # ifconfig                                                                                             
eth0      Link encap:Ethernet  HWaddr 02:42:AC:12:00:02                                                      
          inet addr:172.18.0.2  Bcast:172.18.255.255  Mask:255.255.0.0                                       
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1                                                 
          RX packets:597521 errors:0 dropped:0 overruns:0 frame:0                                            
          TX packets:1194752 errors:0 dropped:0 overruns:0 carrier:0                                         
          collisions:0 txqueuelen:0                                                                          
          RX bytes:126660347 (120.7 MiB)  TX bytes:254347460 (242.5 MiB)                                     


lo        Link encap:Local Loopback                                                                          
          inet addr:127.0.0.1  Mask:255.0.0.0                                                                
          UP LOOPBACK RUNNING  MTU:65536  Metric:1                                                           
          RX packets:38 errors:0 dropped:0 overruns:0 frame:0                                                
          TX packets:38 errors:0 dropped:0 overruns:0 carrier:0                                              
          collisions:0 txqueuelen:1000                                                                       
          RX bytes:2362 (2.3 KiB)  TX bytes:2362 (2.3 KiB)    
/yapi # route -n                                                                                             
Kernel IP routing table                                                                                      
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface                                
0.0.0.0         172.18.0.1      0.0.0.0         UG    0      0        0 eth0                                 
172.18.0.0      0.0.0.0         255.255.0.0     U     0      0        0 eth0

可以看到里面是有網(wǎng)卡信息eth0,ip也正常展示。接下來我們新建空網(wǎng)模式的容器,再來觀察它的網(wǎng)卡信息和路由信息:

[root@VM-12-13-centos ~]# docker run --net=none -it busybox                                                  
/ # ifconfig                                                                                                 
lo        Link encap:Local Loopback                                                                          
          inet addr:127.0.0.1  Mask:255.0.0.0                                                                
          UP LOOPBACK RUNNING  MTU:65536  Metric:1                                                           
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0                                                 
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0                                               
          collisions:0 txqueuelen:1000                                                                       
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)                                                             


/ # route -n                                                                                                 
Kernel IP routing table                                                                                      
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface                                
/ #

可以看到,新建的容器沒有eth0的信息,并且沒有ip信息。這種模式如果不進(jìn)行特定的配置是無法正常使用的,但是優(yōu)點(diǎn)也非常明顯,它給了用戶最大的自由度來自定義容器的網(wǎng)絡(luò)環(huán)境。

(2)bridge 橋接模式

bridge橋接模式是Docker網(wǎng)絡(luò)模型中的一種常見網(wǎng)絡(luò)模式,它可以讓多個(gè)容器之間相互通信,也可以與外部網(wǎng)絡(luò)進(jìn)行通信。在bridge模式下,每個(gè)容器都會(huì)分配一個(gè)唯一的IP地址,并且可以通過容器名稱或者IP地址互相訪問。我們先來了解關(guān)于Docker的bridge模式的實(shí)現(xiàn)原理。

linux veth 和linux bridge

圖片

(圖片來自網(wǎng)絡(luò),侵刪)

docker 的bridge模式就是這樣的,可以看到docker0像一個(gè)交換機(jī),把不同的容器連通,是他們可以互相通信。一般我們在使用docker做網(wǎng)絡(luò)映射時(shí),通常都加了-p指定端口,用來做容器間的通信或者與容器外部通信。

(3)host 主機(jī)網(wǎng)絡(luò)模式

host 主機(jī)網(wǎng)絡(luò)模式讓容器內(nèi)的進(jìn)程共享主機(jī)的網(wǎng)絡(luò)棧,從而使得容器內(nèi)的應(yīng)用程序能夠直接與主機(jī)和外部網(wǎng)絡(luò)進(jìn)行通信,同時(shí)也可以避免了端口映射和NAT等額外的網(wǎng)絡(luò)開銷。使用這種模式的時(shí)候,libnetwork并不會(huì)創(chuàng)建獨(dú)立的network namespace。同樣,我們查看host模式下容器內(nèi)部的網(wǎng)絡(luò)信息

[root@VM-12-13-centos ~]# docker run -it --net=host busybox                                                                                                                                                                                                                 
/ # ip a                                                                                                                                                                                                                                                                    
1: lo:  mtu 65536 qdisc noqueue qlen 1000                                                                                                                                                                                                             
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00                                                                                                                                                                                                                   
    inet 127.0.0.1/8 scope host lo                                                                                                                                                                                                                                          
       valid_lft forever preferred_lft forever                                                                                                                                                                                                                              
    inet6 ::1/128 scope host                                                                                                                                                                                                                                                
       valid_lft forever preferred_lft forever                                                                                                                                                                                                                              
2: eth0:  mtu 1500 qdisc mq qlen 1000                                                                                                                                                                                                      
    link/ether 52:54:00:4f:76:46 brd ff:ff:ff:ff:ff:ff                                                                                                                                                                                                                      
    inet 10.0.12.13/22 brd 10.0.15.255 scope global eth0                                                                                                                                                                                                                    
       valid_lft forever preferred_lft forever                                                                                                                                                                                                                              
    inet6 fe80::5054:ff:fe4f:7646/64 scope link                                                                                                                                                                                                                             
       valid_lft forever preferred_lft forever                                                                                                                                                                                                                              
3: br-85f2d3e30fa7:  mtu 1500 qdisc noqueue                                                                                                                                                                                              
    link/ether 02:42:3e:54:35:a5 brd ff:ff:ff:ff:ff:ff                                                                                                                                                                                                                      
    inet 172.22.0.1/16 brd 172.22.255.255 scope global br-85f2d3e30fa7                                                                                                                                                                                                      
       valid_lft forever preferred_lft forever                                                                                                                                                                                                                              
4: br-c42d4a549c65:  mtu 1500 qdisc noqueue                                                                                                                                                                                                
    link/ether 02:42:39:a3:4a:26 brd ff:ff:ff:ff:ff:ff                                                                                                                                                                                                                      
    inet 172.18.0.1/16 brd 172.18.255.255 scope global br-c42d4a549c65                                                                                                                                                                                                      
       valid_lft forever preferred_lft forever                                                                                                                                                                                                                              
    inet6 fe80::42:39ff:fea3:4a26/64 scope link                                                                                                                                                                                                                             
       valid_lft forever preferred_lft forever                                                                                                                                                                                                                              
5: docker0:  mtu 1500 qdisc noqueue                                                                                                                                                                                                        
    link/ether 02:42:fd:43:ed:84 brd ff:ff:ff:ff:ff:ff                                                                                                                                                                                                                      
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0                                                                                                                                                                                                              
       valid_lft forever preferred_lft forever                                                                                                                                                                                                                              
    inet6 fe80::42:fdff:fe43:ed84/64 scope link                                                                                                                                                                                                                             
       valid_lft forever preferred_lft forever                                                                                                                                                                                                                              
6: br-f057a92711b7:  mtu 1500 qdisc noqueue                                                                                                                                                                                              
    link/ether 02:42:78:b5:0a:b4 brd ff:ff:ff:ff:ff:ff                                                                                                                                                                                                                      
    inet 172.21.0.1/16 brd 172.21.255.255 scope global br-f057a92711b7                                                                                                                                                                                                      
       valid_lft forever preferred_lft forever                                                                                                                                                                                                                                                                                                                                                                                                                                                      
/ #

可以看到容器內(nèi)的網(wǎng)絡(luò)環(huán)境與主機(jī)完全一致。但是,但是,容器其他方面,如文件系統(tǒng)、進(jìn)程列表等還是和宿主機(jī)隔離的。所以如果是集群規(guī)模比較大的情況,還是不是用這種host模式的。

(4)container 網(wǎng)絡(luò)模式

container 網(wǎng)絡(luò)模式可以將多個(gè)容器放在同一個(gè)網(wǎng)絡(luò)命名空間內(nèi)。當(dāng)這些容器需要共享網(wǎng)絡(luò),但其他資源仍然需要隔離時(shí)就可以使用 container 網(wǎng)絡(luò)模式,例如我們開發(fā)了一個(gè) http 服務(wù),但又想使用 nginx 的一些特性,讓 nginx 代理外部的請求然后轉(zhuǎn)發(fā)給自己的業(yè)務(wù),這時(shí)我們使用 container 網(wǎng)絡(luò)模式將自己開發(fā)的服務(wù)和 nginx 服務(wù)部署到同一個(gè)網(wǎng)絡(luò)命名空間中。

當(dāng)創(chuàng)建一個(gè)新容器時(shí),我們可以使用以下命令將其加入到已存在的網(wǎng)絡(luò)命名空間:

docker run -d --name my-nginx1 nginx
docker run -d --name my-nginx2 --network container:my-nginx1 nginx

通過上述命令,我們可以在my-nginx2容器中通過 curl http://localhost來訪問my-nginx1容器的Web服務(wù)。在container模式下,所有的容器都共享同一個(gè)網(wǎng)絡(luò)棧和IP地址,因此它們之間的網(wǎng)絡(luò)性能通常比bridge模式更高,但安全性可能會(huì)降低。

總結(jié):

  • Docker使用CNM為通信標(biāo)準(zhǔn)來完成網(wǎng)絡(luò)實(shí)現(xiàn);
  • CNM三要素:沙箱(Sandbox)、接入點(diǎn)(Endpoint)、網(wǎng)絡(luò)(Network);
  • Libnetwork 常見四種網(wǎng)絡(luò)模式:null 空網(wǎng)絡(luò)模式、bridge 橋接模式、host 主機(jī)網(wǎng)絡(luò)模式、container 網(wǎng)絡(luò)模式;
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • freebsd
    +關(guān)注

    關(guān)注

    0

    文章

    37

    瀏覽量

    10741
  • VLAN技術(shù)
    +關(guān)注

    關(guān)注

    0

    文章

    45

    瀏覽量

    6357
  • LINUX內(nèi)核
    +關(guān)注

    關(guān)注

    1

    文章

    315

    瀏覽量

    21557
收藏 人收藏

    評論

    相關(guān)推薦

    網(wǎng)絡(luò)模型.pdf

    網(wǎng)絡(luò)模型.pdf
    發(fā)表于 09-15 12:50

    關(guān)于BP神經(jīng)網(wǎng)絡(luò)預(yù)測模型的確定??!

    請問用matlab編程進(jìn)行BP神經(jīng)網(wǎng)絡(luò)預(yù)測時(shí),訓(xùn)練結(jié)果很多都是合適的,但如何確定最合適的?且如何用最合適的BP模型進(jìn)行外推預(yù)測?
    發(fā)表于 02-08 14:23

    網(wǎng)絡(luò)中心戰(zhàn)構(gòu)建模型是什么?

    網(wǎng)絡(luò)中心戰(zhàn)理論是人們對歷史上信息和戰(zhàn)爭之間不解之緣深化認(rèn)識的具體體現(xiàn)。眾所周知,空間和時(shí)間是軍事行動(dòng)中兩個(gè)非常重要的要素,而網(wǎng)絡(luò)可以很好地聯(lián)系這兩個(gè)要素,因此隨著網(wǎng)絡(luò)技術(shù)的發(fā)展,網(wǎng)絡(luò)
    發(fā)表于 10-23 06:04

    容器模型/關(guān)鍵參數(shù)/類型

    一、電容器模型實(shí)際的電容器模型如下:二、電容器的關(guān)鍵參數(shù)二、ESR和ESL對電容器頻率響應(yīng)的影
    發(fā)表于 12-01 16:42

    介紹一種多層陶瓷電容器的動(dòng)態(tài)模型

    介紹一種多層陶瓷電容器的動(dòng)態(tài)模型
    發(fā)表于 06-08 06:44

    關(guān)于網(wǎng)絡(luò)通信的特性描述

    這些年,關(guān)于網(wǎng)絡(luò)通信’的特性描述,聽過最多的擬合場景就是:一個(gè)人在講話,哪些人(們)可以聽得到?最近有機(jī)會(huì)進(jìn)一步的琢磨這些事,這里做個(gè)總結(jié)。單播、多播、廣播:在tcpi/ip四層模型中, 網(wǎng)
    發(fā)表于 08-05 07:24

    電機(jī)中的熱阻網(wǎng)絡(luò)模型該怎么建立

    前言這篇詳細(xì)的介紹了電機(jī)中的熱阻網(wǎng)絡(luò)模型該怎么建立,雖然是以某一個(gè)特定的永磁同步電機(jī)為例子,但是把它的思路給領(lǐng)會(huì)到了,在刻畫其他模型的時(shí)候就是舉一反三的事。再次感謝《基于熱阻網(wǎng)絡(luò)法的電
    發(fā)表于 08-30 07:42

    卷積神經(jīng)網(wǎng)絡(luò)模型發(fā)展及應(yīng)用

    卷積神經(jīng)網(wǎng)絡(luò)模型發(fā)展及應(yīng)用轉(zhuǎn)載****地址:http://fcst.ceaj.org/CN/abstract/abstract2521.shtml深度學(xué)習(xí)是機(jī)器學(xué)習(xí)和人工智能研究的最新趨勢,作為一個(gè)
    發(fā)表于 08-02 10:39

    關(guān)于容器的使用壽命

    關(guān)于容器的使用壽命
    發(fā)表于 11-17 15:22 ?19次下載

    探究Overlay網(wǎng)絡(luò)模型和Underlay網(wǎng)絡(luò)模型。

    本文分別介紹Overlay網(wǎng)絡(luò)模型和Underlay網(wǎng)絡(luò)模型。 (一) Overlay網(wǎng)絡(luò)模型
    的頭像 發(fā)表于 06-04 16:00 ?2316次閱讀
    探究Overlay<b class='flag-5'>網(wǎng)絡(luò)</b><b class='flag-5'>模型</b>和Underlay<b class='flag-5'>網(wǎng)絡(luò)</b><b class='flag-5'>模型</b>。

    剖析容器網(wǎng)絡(luò)的基本概念及發(fā)展

    容器并不需要鏡像,以及另一個(gè)方面,構(gòu)建鏡像需要運(yùn)行一些容器。 現(xiàn)在是時(shí)候解決容器網(wǎng)絡(luò)問題了?;蛘吒鼫?zhǔn)確地說,單主機(jī)容器
    的頭像 發(fā)表于 08-27 10:17 ?2364次閱讀
    剖析<b class='flag-5'>容器</b><b class='flag-5'>網(wǎng)絡(luò)</b>的基本概念及發(fā)展

    CNM Ingenuity IoT植物澆水系統(tǒng)

    電子發(fā)燒友網(wǎng)站提供《CNM Ingenuity IoT植物澆水系統(tǒng).zip》資料免費(fèi)下載
    發(fā)表于 11-25 09:13 ?0次下載
    <b class='flag-5'>CNM</b> Ingenuity IoT植物澆水系統(tǒng)

    組織容器網(wǎng)絡(luò)的原理及方案

    Podman 容器管理器的一個(gè)很好的特性是關(guān)注于 rootless 容器。但是,你可能注意到,本文使用了很多 sudo 命令。說明,沒有 root 權(quán)限無法配置網(wǎng)絡(luò)。
    發(fā)表于 12-31 16:01 ?285次閱讀

    關(guān)于容器網(wǎng)絡(luò)下使用UDP協(xié)議無法通訊問題的分析和處理

    這個(gè)問題抽象出來是這樣的:如果有 UDP 服務(wù)運(yùn)行在宿主機(jī)上(或者運(yùn)行在網(wǎng)絡(luò)模型為 host 的容器里),并且監(jiān)聽在 0.0.0.0 地址(也就是所有的 ip 地址),從運(yùn)行在 docker bridge(網(wǎng)橋?yàn)?docker0
    的頭像 發(fā)表于 05-19 15:11 ?927次閱讀
    <b class='flag-5'>關(guān)于</b><b class='flag-5'>容器</b><b class='flag-5'>網(wǎng)絡(luò)</b>下使用UDP協(xié)議無法通訊問題的分析和處理

    SDNLAB技術(shù)分享:容器網(wǎng)絡(luò)大觀

    1、虛擬機(jī)擁有完善的隔離機(jī)制,虛擬網(wǎng)卡與硬件網(wǎng)卡在使用上沒有什么區(qū)別,而容器則使用network namespace提供網(wǎng)絡(luò)在內(nèi)核中的隔離,因此為了保障容器的安全性,容器
    發(fā)表于 06-16 09:49 ?487次閱讀
    SDNLAB技術(shù)分享:<b class='flag-5'>容器</b><b class='flag-5'>網(wǎng)絡(luò)</b>大觀