Docker 容器服务网络管理介绍

2018-11-30 0 By admin

前提知识点
1、NameSpace 命名空间由6部分组成。其中包括NET网络、IPC进程通信、UTS主机名。
2、Docker服务的网络部分的代码被整理为单独的Docker网络库,即libnetwork。
3、libnetwork使用了CNM(Container Network Model)定义了构建容器虚拟化网络的模型,并提供了标准化的接口和组件。

一、CNM组件

CNM 主要由沙盒(sandbox)、端点(endport)和网络(network)三个组件组成。

1.1、Sandbox

一个Sandbox包含了一个容器网络栈的配置。其中包括了对容器的网卡,路由表以及对DNS设置的管理。可以理解为网卡驱动。
Sandbox的实现可以是一个Linux Network Namespace,一个FreeBSD Jail或者其他类似的东西。一个Sandbox可以包含多个处于不同Network的Endpoint。

1.2、Endpoint

Endpoint可以加入一个沙盒和一个网络。可以理解为(虚拟)网卡。
Endpoint的实现可以是一个veth pair,一个Open vSwitch内部端口或者其他类似的东西。
一个Endpoint只能属于一个Network和一个Sandbox。

1.3、Network

Network是一组能够直接互相通信的Endpoint的集合。可以理解为虚拟交换机。
Network的实现可以是一个Linux网桥,一个VLAN等等。

二、libnetwork的5个内置驱动

libnetwork中内置了5个网络驱动(bridge\host\overlay\remote\null)提供不同类型的网络服务。

2.1、Bridge 驱动

默认驱动。libnetwork将创建的容器连接到Docker网桥(Docker0网卡|网桥)上。
虚拟桥接到网络上,使用nat方式和外界通讯,因容器对外不可见使用过程中有很多限制。
这里的桥接方式是NAT桥接,并不是虚拟化技术中的物理桥接。

2.2、host驱动

libnetwork直接使用宿主机的网卡配置,即共用一个network namespace。
容器其他方面(文件系统,进程列表等)和宿主机依然隔离。
容器更好的和外界进行网络通信,不需要进行地址转换。
降低了容器和容器之间、容器和宿主机之前网络层的隔离性。

2.3、null驱动

Docker容器拥有自己的network namespace,并不为容器做网络配置。即只有一个lo网卡。

2.4、overlay驱动

采用IETF标准VXLAN方式,是最适合大规模的云服务器虚拟化环境的模式。
需要额外配置存储服务如etcd,zookeeper。
在不改变现有网络基础设施的前提下,通过某种约定通信协议,把二层报文封装在IP报文之上的新的数据格式;采用扩展的隔离标识位数。

2.5、remote驱动

调用用户自行实现的网络驱动插件,是libnetwork实现了驱动的可查简化。
此驱动并未实现真正的网络服务。

2.6、Joined Container

联合网络,使用这种方法容器和容器之间可以共用一个网卡配置。
类似host驱动,容器和宿主机共用一个网卡配置。

三、网络信息工具

在管理Docker 容器服务时,我们可能会需要对网络情况进行自定义配置和修改;这样的话,我们可以使用brctl命令工具。
yum install -y bridge-utils
brctl show