网络
要想实现网络通信,机器至少需要一个网络接口(物理接口或虚拟接口)与外界相通,并可以收发数据包;另外,如果不同子网之间要进行通信,则需要额外的路由机制。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模型的简单诠释如下:
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创建相互隔离的网络视图,每个网络名字空间都有独立的网络配置,比如:网络设备、路由表
等。新建的网络名字空间与主机默认网络名字空间之间是隔离的。我们平时默认操作的是主机的默认网络名字空间。