网络模型

网络

要想实现网络通信,机器至少需要一个网络接口(物理接口或虚拟接口)与外界相通,并可以收发数据包;另外,如果不同子网之间要进行通信,则需要额外的路由机制。Docker 的网络接口默认都是虚拟接口。虚拟接口的最大优势就是转发效率极高!之所以会这样,那是因为 Linux 通过在内核中进行数据复制来实现虚拟接口间的数据转发,即直接复制发送接口的发送缓存中的数据包到接收接口的接收缓存中,而无需通过外部物理网络设备进行交换。对于本地系统和容器内系统来看,虚拟接口和一个正常的以太网卡相比并无区别,只是虚拟接口的速度要快得多。

创建一对虚拟接口,分别放到宿主机和容器的命名空间中;宿主机一端的虚拟接口连接到默认的 docker0 网桥或指定网桥上,并具有一个以 veth 开头的唯一的名字;容器一端的虚拟接口将被放到容器中,并修改名称为 eth0,且这个接口只对该容器的命名空间可见;4. 从网桥可用地址段中获取一个空闲的地址分配给容器的 eth0(如 172.17.0.2/16),并配置默认路由网关为 docker0 网卡的内部接口 docker0 的 IP 地址(如 172.17.42.1/16);完成以上这些,容器就可以使用自身可见的 eth0 虚拟网卡来连接其他容器和访问外部网络。另外,可以在容器创建启动时通过–net 参数来指定容器的网络配置

CNM 网络模型

Docker 通过 libnetwork 实现了 CNM 网络模型。libnetwork 设计 doc 中对 CNM 模型的简单诠释如下:

image

CNM 模型有三个组件:

Sandbox(沙盒):每个沙盒包含一个容器网络栈(network stack)的配置,配置包括:容器的网口、路由表和 DNS 设置等。 Endpoint(端点):通过 Endpoint,沙盒可以被加入到一个 Network 里。 Network(网络):一组能相互直接通信的 Endpoints。

CNM 模型在 Linux 上的参考实现技术,比如:沙盒的实现可以是一个 Linux Network Namespace;Endpoint 可以是一对 VETH;Network 则可以用 Linux Bridge 或 Vxlan 实

veth 对只是不同网络命名空间通信的一种解决方案,还有其他方案。

Linux Bridge,即 Linux 网桥设备,是 Linux 提供的一种虚拟网络设备之一。其工作方式非常类似于物理的网络交换机设备。Linux Bridge 可以工作在二

层,也可以工作在三层,默认工作在二层。工作在二层时,可以在同一网络的不同主机间转发以太网报文;一旦你给一个 Linux Bridge 分配了 IP 地址,

也就开启了该 Bridge 的三层工作模式。在 Linux 下,你可以用 iproute2 工具包或 brctl 命令对 Linux bridge 进行管理。

VETH(Virtual Ethernet )是 Linux 提供的另外一种特殊的网络设备,中文称为虚拟网卡接口。它总是成对出现,要创建就创建一个 pair。一个 Pair 中的

veth 就像一个网络线缆的两个端点,数据从一个端点进入,必然从另外一个端点流出。每个 veth 都可以被赋予 IP 地址,并参与三层网络路由过程。Network namespace,网络名字空间,允许你在 Linux 创建相互隔离的网络视图,每个网络名字空间都有独立的网络配置,比如:网络设备、路由表

等。新建的网络名字空间与主机默认网络名字空间之间是隔离的。我们平时默认操作的是主机的默认网络名字空间。

image

下一页