0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

分享关于容器网络模型CNM和libnetwork

冬至子 来源:月影的成长日记 作者:月影 2023-05-20 14:17 次阅读

CNM

CNM (Container Network Model) 是 Docker 发布的容器网络标准。也有不是Docker发布的标准,例如CNI.CNI是由以Kubernetes为代表的公司发布的标准。主要还是因为Kubernetes面对的是多容器而不是单容器,所以标准和docker的不一样,有专门的博客来介绍为什么Kubernetes不选择CNM作为容器的网络标准。虽然最后k8s的CNI成为了容器网络标准,但是libnetwork的容器网络模式使得pod中容器共享网络环境成为可能。

libnetwork

Docker网络部分代码被抽离并单独成为了Docker的网络库,即libnetwork。

图片

(图片来自网络,侵删)

从上图可以看到libnetwork和docker daemon之间的关系。Docker daemon通过调用libnetwork对外提供的API完成网络的创建和管理等功能。libnetwork中则使用了CNM来完成网络功能的提供。同时也可以看到CNM的三个重要元素:

沙箱(sandbox):沙箱代表一个容器网络栈的信息。可以对容器的接口、路由和DNS设置等进行管理。沙盒的实现可以是Linux network namespace、FreeBSD Jail或者类似的机制。一个沙盒可以有多个端点和多个网络。

接入点(Endpoint):接入点将沙箱连接到网络中,代表容器的网络接口,接入点的实现通常是 Linux 的 veth 设备。一个接入点只可以属于一个网络并且只属于一个沙箱。

网络(Network):网络是一组可以直接互相联通的接入点。网络的实现可以是Linux bridge、VLAN等。它将多接入点组成一个子网,并且多个接入点之间可以相互通信

了解了CNM,接下来我们来认识libnetwork的四种常见网络模式:

  1. null 空网络模式:可以帮助我们构建一个没有网络接入的容器环境,以保障数据安全。
  2. bridge 桥接模式:可以打通容器与容器间网络通信的需求。
  3. host 主机网络模式:可以让容器内的进程共享主机网络,从而监听或修改主机网络。
  4. container 网络模式:可以将两个容器放在同一个网络命名空间内,让两个业务通过 localhost 即可实现访问。

(1)null 空网络模式

空网意味着没有网络信息,就是一个单纯的没有连接网络的一个容器。我们可以使用docker命令来创建一个空网模式的容器来检查容器内部的网络信息,首先我们可以先打开正常模式的容器来看一下网络信息:

/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

可以看到里面是有网卡信息eth0,ip也正常展示。接下来我们新建空网模式的容器,再来观察它的网卡信息和路由信息:

[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信息。这种模式如果不进行特定的配置是无法正常使用的,但是优点也非常明显,它给了用户最大的自由度来自定义容器的网络环境。

(2)bridge 桥接模式

bridge桥接模式是Docker网络模型中的一种常见网络模式,它可以让多个容器之间相互通信,也可以与外部网络进行通信。在bridge模式下,每个容器都会分配一个唯一的IP地址,并且可以通过容器名称或者IP地址互相访问。我们先来了解关于Docker的bridge模式的实现原理。

linux veth 和linux bridge

图片

(图片来自网络,侵删)

docker 的bridge模式就是这样的,可以看到docker0像一个交换机,把不同的容器连通,是他们可以互相通信。一般我们在使用docker做网络映射时,通常都加了-p指定端口,用来做容器间的通信或者与容器外部通信。

(3)host 主机网络模式

host 主机网络模式让容器内的进程共享主机的网络栈,从而使得容器内的应用程序能够直接与主机和外部网络进行通信,同时也可以避免了端口映射和NAT等额外的网络开销。使用这种模式的时候,libnetwork并不会创建独立的network namespace。同样,我们查看host模式下容器内部的网络信息

[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                                                                                                                                                                                                                                                                                                                                                                                                                                                      
/ #

可以看到容器内的网络环境与主机完全一致。但是,但是,容器其他方面,如文件系统、进程列表等还是和宿主机隔离的。所以如果是集群规模比较大的情况,还是不是用这种host模式的。

(4)container 网络模式

container 网络模式可以将多个容器放在同一个网络命名空间内。当这些容器需要共享网络,但其他资源仍然需要隔离时就可以使用 container 网络模式,例如我们开发了一个 http 服务,但又想使用 nginx 的一些特性,让 nginx 代理外部的请求然后转发给自己的业务,这时我们使用 container 网络模式将自己开发的服务和 nginx 服务部署到同一个网络命名空间中。

当创建一个新容器时,我们可以使用以下命令将其加入到已存在的网络命名空间:

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服务。在container模式下,所有的容器都共享同一个网络栈和IP地址,因此它们之间的网络性能通常比bridge模式更高,但安全性可能会降低。

总结:

  • Docker使用CNM为通信标准来完成网络实现;
  • CNM三要素:沙箱(Sandbox)、接入点(Endpoint)、网络(Network);
  • Libnetwork 常见四种网络模式:null 空网络模式、bridge 桥接模式、host 主机网络模式、container 网络模式;
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • freebsd
    +关注

    关注

    0

    文章

    36

    浏览量

    10698
  • VLAN技术
    +关注

    关注

    0

    文章

    45

    浏览量

    6334
  • LINUX内核
    +关注

    关注

    1

    文章

    311

    浏览量

    21389
收藏 人收藏

    评论

    相关推荐

    网络模型.pdf

    网络模型.pdf
    发表于 09-15 12:50

    基于网络性能的VoIP语音质量评价模型

    .本文提出一种基于网络性能的VoIP语音质量评价模型,该模型在E-Model的基础上进行了改进,只考虑网络性能的动态变化对语音质量的影响.新的模型
    发表于 04-24 09:26

    关于BP神经网络预测模型的确定!!

    请问用matlab编程进行BP神经网络预测时,训练结果很多都是合适的,但如何确定最合适的?且如何用最合适的BP模型进行外推预测?
    发表于 02-08 14:23

    网络中心战构建模型是什么?

    网络中心战理论是人们对历史上信息和战争之间不解之缘深化认识的具体体现。众所周知,空间和时间是军事行动中两个非常重要的要素,而网络可以很好地联系这两个要素,因此随着网络技术的发展,网络
    发表于 10-23 06:04

    容器模型/关键参数/类型

    一、电容器模型实际的电容器模型如下:二、电容器的关键参数二、ESR和ESL对电容器频率响应的影
    发表于 12-01 16:42

    介绍一种多层陶瓷电容器的动态模型

    介绍一种多层陶瓷电容器的动态模型
    发表于 06-08 06:44

    关于网络通信的特性描述

    这些年,关于网络通信’的特性描述,听过最多的拟合场景就是:一个人在讲话,哪些人(们)可以听得到?最近有机会进一步的琢磨这些事,这里做个总结。单播、多播、广播:在tcpi/ip四层模型中,
    发表于 08-05 07:24

    电机中的热阻网络模型该怎么建立

    前言这篇详细的介绍了电机中的热阻网络模型该怎么建立,虽然是以某一个特定的永磁同步电机为例子,但是把它的思路给领会到了,在刻画其他模型的时候就是举一反三的事。再次感谢《基于热阻网络法的电
    发表于 08-30 07:42

    卷积神经网络模型发展及应用

    卷积神经网络模型发展及应用转载****地址:http://fcst.ceaj.org/CN/abstract/abstract2521.shtml深度学习是机器学习和人工智能研究的最新趋势,作为一个
    发表于 08-02 10:39

    关于容器的使用寿命

    关于容器的使用寿命
    发表于 11-17 15:22 19次下载

    探究Overlay网络模型和Underlay网络模型

    本文分别介绍Overlay网络模型和Underlay网络模型。 (一) Overlay网络模型
    的头像 发表于 06-04 16:00 2170次阅读
    探究Overlay<b class='flag-5'>网络</b><b class='flag-5'>模型</b>和Underlay<b class='flag-5'>网络</b><b class='flag-5'>模型</b>。

    如何去解决一些单主机容器网络问题?

    现在是时候解决容器网络问题了。或者更准确地说,单主机容器网络问题。
    的头像 发表于 06-10 15:09 1594次阅读

    剖析容器网络的基本概念及发展

    容器并不需要镜像,以及另一个方面,构建镜像需要运行一些容器。 现在是时候解决容器网络问题了。或者更准确地说,单主机容器
    的头像 发表于 08-27 10:17 2247次阅读
    剖析<b class='flag-5'>容器</b><b class='flag-5'>网络</b>的基本概念及发展

    CNM Ingenuity IoT植物浇水系统

    电子发烧友网站提供《CNM Ingenuity IoT植物浇水系统.zip》资料免费下载
    发表于 11-25 09:13 0次下载
    <b class='flag-5'>CNM</b> Ingenuity IoT植物浇水系统

    关于容器网络下使用UDP协议无法通讯问题的分析和处理

    这个问题抽象出来是这样的:如果有 UDP 服务运行在宿主机上(或者运行在网络模型为 host 的容器里),并且监听在 0.0.0.0 地址(也就是所有的 ip 地址),从运行在 docker bridge(网桥为 docker0
    的头像 发表于 05-19 15:11 715次阅读
    <b class='flag-5'>关于</b><b class='flag-5'>容器</b><b class='flag-5'>网络</b>下使用UDP协议无法通讯问题的分析和处理