Libnetwork作为Docker网络部分的依赖库,在Docker1.9中正式脱离实验阶段,进入主分支正式投入生产使用阶段。有了新的Networking我们可以创建虚拟网络,然后将container加入到虚拟网络中,以获得最适合所部署应用的网络拓扑结构。
1 组件的标准化
为了标准化网络驱动的开发步骤和支持多种网络驱动,Docker公司在Libnetwork中实现了CNM(Container Network Model)。CNM主要建立在如下三个组件上。
沙盒(Sandbox):一个沙盒包含了一个容器网络栈的信息。沙盒可以对容器的接口,路由和DNS设置等进行管理。沙盒的实现可以是Linux Network Namespace, FreeBSD Jail或者类似的机制。一个沙盒可以有多个端点(Endpoint)和多个网络(Network)。
端点(Endpoint):一个端点可以加入一个沙盒和一个网络。端点的实现可以是veth pair, Open vSwitch内部端口或者相似的设备。一个端点只可以属于一个网络并且只属于一个沙盒。
网络(Network):一个网络是一组可以直接互相联通的端点。网络的实现可以是Linux bridge,VLAN等等。一个网络可以包含多个端点。
2 CNM对象详细介绍
介绍了CNM中三个主要的组件之后,下面对CNM中的各个对象做一个详细的介绍。
NetworkController:NetworkController通过暴露给用户创建和管理网络的API,以便用户对libnetwork进行调用。Libnetwork支持多种驱动,其中包括内置的bridge,host,container和overlay,也对远程驱动进行了支持(即支持用户使用自定义的网络驱动)。
Driver:Driver不直接暴露给用户接口,但是driver是真正实现了网络功能的对象。NetworkController可以对特定driver提供特定的配置选项,其选项对libnetwork透明。为了满足用户使用需求和开发需求,driver既可以是内置的类型,也可以是用户指定的远程插件。每一种驱动可以创建自己独特类型的network,并对其进行管理。在未来可以会对不同插件的管理功能进行整合,以求做到方便管理不同类型的网络。
Network:Network对象是CNM的一种实现。NetworkController通过提供API对Network对象进行创建和管理。NetworkController当需要创建或者更新Network的时候,它所对应的Dri