docker网络架构是建立在一个接口集合之上,该接口集合被称为容器网络模型(Container Networking Mode,CNM)。设计CNM的目的是提供程序的可移植性。 网络模型结构图如下:
CNM结构
CNM包含下面三部分:
Sandbox — sandbox包含container的网络栈配置,比如container的接口管理、路由表和DNS设置。可以通过Linux network space实现sandbox。Sandbox可以包含源于过个网络的多个 endpoint。
Endpoint — Endpoint用于把Sandbox加入Network. Endpoint将程序到netork的实际连接剥离开。这有助于维护可移植性,service可以使用不同类型的网络驱动接口而不必关心是如何连接到network。
Network — 就OSI模型而言,CNM没有指定具体的网络。Network可以通过Linux bridge、VLAN等方式实现。Network汇集了相互间有连通性的多个endpoints。如果endpoint没有连接到network,那么和network间就没有连通性。
CNM驱动接口
CNM提供了两种可插拔的、开放的接口:
1. Network
Drivers — docker 网络驱动使得network正常运行。当前docker engine或者cluster可以使用多个网络驱动,但是每个Docker network只能通过一个网络驱动实例化。目前有两种CNM网络驱动:
本地网络驱动(Native Network Drivers) — dockers自身提供的本地网络驱动,它属于docker engine的一部分。有多种驱动可以选择,比如overlay networks、local bridges。
远程网络驱动(Remote Network Drivers) — 远程网络驱动是由社区或者其它供应商创建。
2. IPAM
Drivers — docker拥有一个本地IP地址管理驱动,如果没有指定network和endpoint,那么它会为之提供默认子网或地址。也可以通过network、container和service创建命令手动分配IP地址。也存在Remote IPAM drivers,并且提供对当前IPAM工具的集成。
Docker本地网络驱动器
Docker本地网络驱动是Dockers Engine的一部分,它不需要额外的模块。它们通过docker network命令调用。下表列出了native network drivers:
Host---使用host驱动, container使用主机的网络栈。因为没有命名空间隔离,所有主机的所有接口都可以被container直接使用。
Bridge---Bridge驱动在主机上创建一个可以被docker管理的Linux 网桥。 默认情况下,网桥上的container可以相互通信。通过bridge驱动也可以配置外部访问container。
Overlay---Overlay驱动创建一个overlay 网络,它支持多主机网络。它联合使用本地的Linux bridge和vxlan 来覆盖基于物理网络container-to-container通信。
MACVLAN---Macvlan驱动使用MACVLAN 桥接模式在container接口和主机接口间建立连接。它能给container提供可以在物理网络路由的IP地址。
None---None驱动给予container自身网络栈和网络命名空间,但是并没有在container内部配置接口。 由于没有额外的配置,container对主机网络栈是完全隔离的。
网络范围
在docker network ls的输出结果中,dockers网络驱动有一个“范围”的概念。有两种:local和swarm。
1. Local驱动在主机范围内提供连通性和网络服务(比如DNS和IPAM)。
2. Swarm驱动跨swarm集群提供连通性和网络范服务。