docker1.1 新特性--libnetwork模块
来源:互联网 发布:淘宝官方网址是多少 编辑:程序博客网 时间:2024/06/10 18:05
本次分析的libnetwork版本0.7.0-rc.6,对比的是docker1.10.0使用的libnetwork版本0.6.0-rc7。
下图是Docker官方定义的容器网络模型(Container Network Model)。其中包括三个组件,分别是Sandbox、Endpoint和Network。
在Docker1.11中,Sandbox是一个GO语言接口,GO语言不是一种典型的面向对象语言,它在语法上没有类和继承的概念,没有继承是否就无法拥有面向对象中的“多态”行为,但是GO语言引入了一种新类型“接口”,它在效果上实现了面向对象中“多态”的概念。Sandbox接口结构体如下:
typeSandbox interface { ID() string Key() string ContainerID() string Labels() map[string]interface{} Statistics()(map[string]*types.InterfaceStatistics, error) Refresh(options ...SandboxOption) error SetKey(key string) error Rename(name string) error Delete() error ResolveName(name string, iplen int)([]net.IP, bool) ResolveIP(name string) string Endpoints() []Endpoint}相比Docker1.10,ResolveName方法增加了对IPv6地址的支持。
在Docker1.11中,Endpoint接口结构体同Docker1.10没有变化。
在Docker1.11中,Endpoint接口结构体如下:
typeNetwork interface { Name() string ID() string Type() string CreateEndpoint(name string, options ...EndpointOption)(Endpoint, error) Delete() error Endpoints() []Endpoint WalkEndpoints(walker EndpointWalker) EndpointByName(name string) (Endpoint,error) EndpointByID(id string) (Endpoint, error) Info() NetworkInfo}
这个结构体同Docker1.10来说没有变化,有变化的是这个结构体中的Info()变量,这个变量对应的接口结构体是NetworkInfo,如下所示:
typeNetworkInfo interface { IpamConfig() (string, map[string]string,[]*IpamConf, []*IpamConf) IpamInfo() ([]*IpamInfo, []*IpamInfo) DriverOptions() map[string]string Scope() string IPv6Enabled() bool Internal() bool Labels() map[string]string}这个接口结构体同Docker1.10相比增加了IPv6Enabled和Labels两个变量。第一个变量IPv6Enabled表示是否使用IPv6,第二个变量Labels用于存储Network标签。
上面这些GO语言接口定义了容器网络模型(Container NetworkModel)中三个组件的对外操作接口,形成了CNM操作标准。
Docker1.11中libnetwork负责管理网络的接口结构体是NetworkController:
typeNetworkController interface { ID() string Config() config.Config NewNetwork(networkType, name string,options ...NetworkOption) (Network, error) Networks() []Network WalkNetworks(walker NetworkWalker) NetworkByName(name string) (Network,error) NetworkByID(id string) (Network, error) NewSandbox(containerID string, options...SandboxOption) (Sandbox, error) Sandboxes() []Sandbox WalkSandboxes(walker SandboxWalker) SandboxByID(id string) (Sandbox, error) SandboxDestroy(id string) error Stop() ReloadConfiguration(cfgOptions...config.Option) error}Docker1.11中新增加了ReloadConfiguration,用于DockerDaemon热变更网络配置。
在Docker1.10中libnetwork提供了五个驱动包,分别是bridge、host、null、remote和overlay,在Docker1.11中新增加了两个实验性质的驱动包,分别是macvlan和ipvlan。每个驱动包都需要实现Driver接口中的方法:
typeDriver interface { discoverapi.Discover CreateNetwork(nid string, optionsmap[string]interface{}, ipV4Data, ipV6Data []IPAMData) error DeleteNetwork(nid string) error CreateEndpoint(nid, eid string, ifInfoInterfaceInfo, options map[string]interface{}) error DeleteEndpoint(nid, eid string) error EndpointOperInfo(nid, eid string)(map[string]interface{}, error) Join(nid, eid string, sboxKey string,jinfo JoinInfo, options map[string]interface{}) error Leave(nid, eid string) error ProgramExternalConnectivity(nid, eidstring, options map[string]interface{}) error RevokeExternalConnectivity(nid, eidstring) error Type() string}
其中Docker内置的驱动包括bridge、host、null、overlay、macvlan和ipvlan,remote是外挂驱动,需要第三方提供网络驱动程序,ipvlan驱动和macvlan驱动是docker1.11新增加的两个测试性模式。
对于bridge驱动,在Docker1.11中新增加了载入netfilter的xt_conntrack模块。在bridge驱动方式下,创建sandbox就是在创建linux netnamespace,创建network就是创建linux bridge,创建endpoint就是创建一对veth虚拟设备,通过linux brige和veth虚拟设备来实现不同linux net namespace之间的网络通信,如下为bridge驱动下sendbox、network和endpoint的实现示意图,其中红色字体表示在linux上的具体实现,虚线方块表示libnetwork的逻辑概念:
对于ipvlan驱动,需要linuxkernel版本大于等于4.2才能使用,支持ipvlan的二层和三层两种模式;对于macvlan驱动,需要linux kernel版本大于等于3.9才能使用,支持macvlan的四种模式,分别是private、vepa、bridge和passthru。
在ipvlan驱动方式下,创建sandbox就是在创建linux netnamespace,创建network就是在物理网卡上创建类型是ipvlan的虚拟link网络接口,创建endpoint就是给新创建的虚拟link网络接口设置mac地址和IP地址网络信息,如下为ipvlan驱动下sendbox、network和endpoint的实现示意图(endpoint的概念其实可以忽略不计),其中红色字体表示在linux上的具体实现,虚线方块表示libnetwork的逻辑概念:
通过比较上面bridge驱动方式同ipvlan驱动方式两张图,因为不需要通过linux bridge这一层进行处理,所以ipvlan方式是效率更高的一种方式,随着linux kernel中ipvlan驱动的成熟,随着docker对ipvlan支持的完善,将来ipvlan有望成为docker网络通讯中效率最高的一种方式。
- docker1.1 新特性--libnetwork模块
- Docker1.11新特性
- docker1.11的新特性
- Docker1.12新特性之集群
- GIS+=地理信息+容器技术(8)——Docker1.10新特性介绍
- 7.0新特性新1
- Docker libnetwork
- EJB3.1新特性
- RPT8.1新特性
- C99新特性(1)
- java7新特性(1)
- oracle12c新特性(1)
- ios7新特性--1
- HTTP1.1新特性
- Spring3.1新特性
- Spring3.1新特性
- Xcode8 新特性1
- Spark2.1新特性
- 关于RelativeLayout设置垂直居中对齐不起作用的问题
- iOS开发实用技术_Touch ID
- http状态协议码大全
- iOS属性声明strong和retain竟然不一样
- Web.xml配置详解之context-param
- docker1.1 新特性--libnetwork模块
- ubuntu+nginx 出现502 bad gateway解决方法
- UI高总结
- sql查询20到30条记录
- Android drawPath的简单使用
- Firefox必备的24款web开发插件
- Android 蓝牙
- PullToRefresh
- Maven学习总结(一)——Maven入门