文章目录
基础理论
在顶层设计中,Docker 网络架构由 3 个主要部分构成:CNM、Libnetwork 和驱动。
- CNM 是设计标准。在 CNM 中,规定了 Docker 网络架构的基础组成要素。
- Libnetwork 是 CNM 的具体实现,并且被 Docker 采用,Libnetwork 通过 Go 语言编写,并实现了 CNM 中列举的核心组件。
- 驱动通过实现特定网络拓扑的方式来拓展该模型的能力。
下图展示了顶层设计中的每个部分是如何组装在一起的。
libnetwork(CNM)介绍
Docker 网络架构源自一种叫作容器网络模型(CNM)的方案,该方案是开源的并且支持插接式连接。
Libnetwork 是 Docker 对 CNM 的一种实现,提供了 Docker 核心网络架构的全部功能。不同的驱动可以通过插拔的方式接入 Libnetwork 来提供定制化的网络拓扑。
libnetwork是容器网络库,其核心内容是其定义的Container Network Model,这个模型对容器网络进行了抽象,由三个组件组成
-
Sandbox(沙盒)
沙盒是一个隔离的网络运行环境,保存了容器网络栈的配置,包括了对网络接口、路由表和DNS的管理。在Linux平台上,Sandbox是用Linux Network Namespace实现的,Sandbox可以包含来自多个网络的多个Endpoint(端点)。
-
Endpoint
Endpoint的作用是将Sandbox接入Network,Endpoint的典型实现是veth pair。一个Endpoint只能属于一个网络,也只能属于一个Sandbox。通过给沙盒增加多个Endpoint可以将沙盒加入多个网络
-
Network
包含一组Endpoint,同一Network的Endpoint可以直接通信。Network的实现driver可以是Linux Bridge,VxLAN等。
veth pair介绍
veth-pair 就是一对的虚拟设备接口,和 tap/tun 设备不同的是,它都是成对出现的。一端连着协议栈,一端彼此相连着。它常常充当着一个桥梁,连接着各种虚拟网络设备,典型的例子像“两个 namespace 之间的连接”,“Bridge、OVS 之间的连接”,“Docker 容器之间的连接” 等等,以此构建出非常复杂的虚拟网络结构,比如 OpenStack Neutron。
网络驱动
Docker的网络子系统是可插拔的,使用驱动程序。默认情况下存在多个驱动程序,并提供核心网络功能:
- bridge:Docker默认的容器网络驱动。Container通过一对veth pair连接到docker0网桥上,由Docker为容