Docker 容器网络管理

2018-11-30 0 By admin

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

CNM 主要由沙盒(sandbox)、端点(endport)和网络(network)三个组件组成。
libnetwork中内置了5个网络驱动(bridge\host\overlay\remote\null)提供不同类型的网络服务。

CNM组件

Sandbox

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

Endpoint

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

Network

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

libnetwork的5个内置驱动

Bridge 驱动

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

host驱动

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

null驱动

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

overlay驱动

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

remote驱动

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

Joined Container

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

补充

网络信息工具
yum install -y bridge-utils
brctl show