CNM是什么?
CNM (Container Network Model) 是 Docker 发布的容器网络标准,意在规范和指定容器网络发展标准,CNM 抽象了容器的网络接口
CNM定义网络标准的三个重要元素
1、沙箱(Sandbox):沙箱代表了一系列网络堆栈的配置,其中包含路由信息、网络接口等网络资源的管理
2、入口点(Endpoint):接入点将沙箱连接到网络中,代表容器的网络接口,接入点的实现通常是 Linux 的 veth 设备对。
3、网络(Network):网络是一组可以互相通信的接入点,它将多接入点组成一个子网,并且多个接入点之间可以相互通信。
CNM 的三个要素基本抽象了所有网络模型
docker把网络功能剥离出来,Libnetwork开源项目就诞生了,golang编写完全遵循CNM网络规范
Libnetwork 的工作流程
第一步:Docker 通过调用 libnetwork.New 函数来创建 NetworkController 实例。NetworkController 是一个接口类型,提供了各种接口,代码如下:
type NetworkController interface {
// 创建一个新的网络。 options 参数用于指定特性类型的网络选项。
NewNetwork(networkType, name string, id string, options ...NetworkOption) (Network, error)
// ... 此次省略部分接口
}
第二步:通过调用 NewNetwork 函数创建指定名称和类型的 Network,其中 Network 也是接口类型,代码如下:
type Network interface {
// 为该网络创建一个具有唯一指定名称的接入点(Endpoint)
CreateEndpoint(name string, options ...EndpointOption) (Endpoint, error)
// 删除网络
Delete() error
// ... 此次省略部分接口
}
第三步:通过调用 CreateEndpoint 来创建接入点(Endpoint)。在 CreateEndpoint 函数中为容器分配了 IP 和网卡接口。其中 Endpoint 也是接口类型,代码如下:
// Endpoint 表示网络和沙箱之间的逻辑连接。
type Endpoint interface {
// 将沙箱连接到接入点,并将为接入点分配的网络资源填充到沙箱中。
// the network resources allocated for the endpoint.
Join(sandbox Sandbox, options ...EndpointOption) error
// 删除接入点
Delete(force bool) error
// ... 此次省略部分接口
}
第四步:调用 NewSandbox 来创建容器沙箱,主要是初始化 Namespace 相关的资源。
第五步:调用 Endpoint 的 Join 函数将沙箱和网络接入点关联起来,此时容器就加入了 Docker 网络并具备了网络访问能力。
Libnetwork 常见网络模式
null 空网络模式:可以帮助我们构建一个没有网络接入的容器环境,以保障数据安全。
bridge 桥接模式:可以打通容器与容器间网络通信的需求。
host 主机网络模式:可以让容器内的进程共享主机网络,从而监听或修改主机网络。
container 网络模式:可以将两个容器放在同一个网络命名空间内,让两个业务通过 localhost 即可实现访问。