• docker——libnetwork插件网络功能


    从1.7.0版本开始,Docker正是把网络和存储这两部分的功能都以插件化形式剥离出来,允许用户通过指令来选择不同的后端实现。
    剥离出来的独立容器网络项目叫libnetwork,从名字就能看出,它希望将来为不同容器定义统一规范的网络标准层。

    一、容器网络模型

    libNetwork中容器网络模型(Container Networking Model,CNM)十分简介,
    可以让上层使用网络的大量应用容器最大程度上不去关心底层实现。
    容器网络模型的结构如下图:

    包括三种基本元素:
      Sandbox(沙盒):代表一个容器,准确的说,是其网络命名空间。
      Endpoint(接入点):代表网络上可以挂载容器的接口,会分配IP地址。
      Network:可以接通多个接入点的子网。

    可见,对于使用CNM的容器管理系统来说,具体底下网络如何实现,不同子网彼此怎么隔离,有没有Qos,都可以不关心。
    只要插件能提供网络和接入点,只需要把容器给接上或者拔下,剩下的都是插件驱动自己去实现,这样就解耦容器和网络功能,十分灵活。

    CNM的典型生命周期如图所示。

    首先,是驱动注册自己到网络控制器,网络驱动器使用驱动类型,来创建网络。
    然后在创建的网络上创建接口,最后把容器连接到接口上即可
    销毁过程则正好相反,先把容器从接口上卸载,然后删除接口和网络即可。

    目前CNM支持的驱动类型有四种:Null、Bridge、Overlay、Remote。
      Null:不提供网络服务,容器启动后无网络连接。
      Bridge:Docker传统上默认用Linux网桥和Iptables实现的单机网络。
      Overlay:是用vxlan隧道实现的跨主机容器网络。
      Remote:扩展类型,预留给其它外部实现的方案。

    从位置上看,libnetwork上面支持Docker,下面支持网络插件,自身处于十分关键的中间层。
    目前,已有大量的网络方案开始支持libnetwork。包括OpenStack Kuryr项目,通过支持libnetwork,
    让Docker可以直接使用Neutron提供的网络功能。
    Calico等团队也编写了插件支持libnetwork,从而可以无缝的支持Docker网络功能。

                                        

    二、Docker网络相关命令

    在libnetwork支持下,Docker网络相关命令作为network的子命令出现。
    围绕着管理CNM的生命周期,主要包括以下命令:
      ls:列出所有的网络
      create:创建一个网络
      rm:删除一个网络
      connect:把容器接入到网络
      disconnect:把容器从网络卸载下来
      inspect:查看网络的详细信息

    1.列出网络

    格式:
      docker network ls [OPTIONS]

    完整格式:
      docker network ls [-f|--filter[=[]]] [--format="TEMPLATE"] [--no-trunc[=true|false]] [-q|--quiet[=true|false]] [--help]
    参数说明:
      --format="TEMPLATE"
        ID - 网络的ID
        Name - 网络的名称
        Driver - 使用者
        Scope - Network scope (local, global)
        IPv6 - Whether IPv6 is enabled on the network or not
        Internal - Whether the network is internal or not
        Labels - All labels assigned to the network
        Label - Value of a specific label for this network. For example {{.Label "project.version"}}

      --no-trunc=true|false 

      -q, --quiet=true|false

        -f, --filter=[]:过滤
      通过DRIVER:
        docker network ls --filter driver=bridge
      通过ID:
        docker network ls --filter id=63d1ff1f77b07ca51070a8c227e962238358bd310bde1529cf62e6c307ade161
        docker network ls --filter id=95e74588f40d
        docker network ls --filter id=95e
      通过label:
        docker network ls -f "label=usage"
        docker network ls -f "label=usage=prod"
      通过NAME:
        docker network ls --filter name=foobar
        docker network ls --filter name=foo
      通过user:
        docker network ls --filter type=custom

    2.创建网络

    格式:
      docker network create [option] NETWORK
    完整格式:
      docker network create [--attachable] [--aux-address=map[]] [-d|--driver=DRIVER] [--gateway=[]] [--help] [--internal] [--ip-range=[]]
      [--ipam-driver=default] [--ipam-opt=map[]] [--ipv6] [--label[=[]]] [-o|--opt=map[]] [--subnet=[]] NETWORK-NAME
    参数说明:
      --aux-address=map[]:辅助的IP地址
      -d, --driver=DRIVER:网络驱动类型
      --gateway value:网管地址
      --internal:禁止外部对创建的网络访问
      --ip-range value:分配IP的地址范围
      --ipam-driver=default: IP地址管理的插件类型
      --ipam-opt value:IP地址管理插件的选项
      --ipv6:支持IPv6地址
      --label value:为网络添加元标签信息
      -o,--opt value:网络驱动支持的选项
      --subnet value:网络地址段

    3.删除网络

    格式:
      docker network rm NETWORK [NETWORK ...]
    示例:
      docker network rm my-network
      docker network rm 3695c422697f my-network

    4.接入容器

    将一个容器连接到一个已存在的网络上。
    命令格式:
      docker network connect [OPTIONS] NETWORK CONTAINER
    参数支持:
      --alias value:为容器添加一个别名,此别名仅在所添加网络上可见;
      --ip string:指定IP地址
      --ip6 string:指定IPv6地址
      --link value:添加链接到另一个容器
      --link-local-ip value:为容器添加一个链接地址
    示例:
      docker network connect multi-host-network container1
      docker run -itd --network=multi-host-network --ip 172.20.88.22 --ip6 2001:db8::8822 busybox

    5.卸载容器

    将一个连接到网络上的容器从网络上移除。
    格式:
      docker network inspect [option] NETWORK [NETWORK ...]
    参数说明:
      -f,--force:强制把容器从网络上移除。
    示例:
      docker network disconnect multi-host-network container1

    6.查看网络信息

    格式:
      docker network inspect [OPTIONS] NETWORK [NETWORK ...]
    示例:
      sudo docker run -itd --name=container1 busybox

  • 相关阅读:
    揭开Socket编程的面纱(留着自己慢慢看)
    XML 新手入门基础知识
    RocketMQ集群平滑下线或重启某个节点
    RocketMQ borker配置文件
    ES:在线迁移集群索引,数据不丢失
    SQL命令汇总
    Redis过期key淘汰策略
    中间件服务器内核参数优化
    在线做RAID命令
    CPU网卡亲和绑定
  • 原文地址:https://www.cnblogs.com/yangmingxianshen/p/10153377.html
Copyright © 2020-2023  润新知