Docker原生网络技术简介
http://www.dockerinfo.net/2973.html
docker 手册;http://c.biancheng.net/view/3118.html
1、默认网络
在宿主机部署好Docker Engine后会默认创建三种网络:bridge,host和none。
# docker network ls
NETWORK ID NAME DRIVER SCOPE
93dab79cdb5a bridge bridge local
c920c9c10e62 host host local
d2a11ea1c70a none null local
在创建容器时可使用–network=bridge/host/none来指定容器所在的网络。
Bridge
默认的bridge网络是我们比较熟悉的docker0,它在安装完Engine后自动创建,并且在创建容器不指定network参数的时候默认就是该网络。
如上图,Docker的bridge网络和虚拟化的NAT网络模式很相似。容器通过docker0分配到各自的IP地址并可以通过eth0与外界通信(outbound)。若要实现容器中应用的跨主机访问,则需要将容器的端口映射到主机端口,客户端通过访问主机的IP和Port来访问容器应用(inbound)。该模式是单节点或小规模Docker环境的常用模式,易于理解,使用成本也不高。
Host
Host网络让容器直接使用宿主机的网络,简单理解就是Host网络的容器使用的IP地址等网络配置信息和宿主机一样。
如上图,Host网络中的容器使用的是主机的网络配置。容器中的应用可直接通过主机IP+端口的方式进行访问而无需映射。该模式下每个容器的端口不能重复,否则会出现冲突。而且容器和主机网络没做隔离,得注意安全方面的考量。
None
None网络将容器加网入到容器自有网络,有自己的Network Namespace,但没有网卡等网络相关的配置信息,无法和宿主机通信或外部主机通信。
如上图,None网络中的容器没有网络配置信息(仅一个lo0,无其他网卡和IP配置)。该模式将容器的网络管理从Docker中剥离出来,用户可根据自己的需求自定义容器的网络(如使用ovs来管理)。看似最简单,实则最复杂。
2、用户定义网络
Bridge
用户也可以自定义bridge网络,使用方式基本跟默认的bridge一样,映射出容器中应用或服务的端口供其他应用访问即可。
Container
Other Container网络为容器级的复用网络,实现多个容器共用一个网络配置。容器间共享Network Namespace、IP地址和端口区间,其他相关的Namespace依然隔离。
如上图,容器A和容器B共用网络,有点类似kubernetes的Pod,跟之前提到的Host模式也有点像。只不过一个是容器和主机共用,一个是容器和容器共用。容器A和B之间的通信基于localhost进行,提升了网络传输效率。
以上介绍的几种网络主要适用于单节点或者小规模的容器环境,在规模比较大的容器集群环境中,实现多主机容器间的通信和调度是非常必要的。下面介绍一下Docker原生的多主机网络。
Overlay
Overlay网络是在现有的网络架构之上构建一个不同主机容器间的二层虚拟网络,以实现容器跨主机的通信,多用于规模比较大的容器集群环境。
Docker的Overlay网络需要基于键值存储来实现,K-V存储里面存放了各个主机上容器和网络相关的信息。
如上图,Overlay将多主机中的容器划分到一个虚拟的二层网络中,以实现容器的跨主机通信。
Docker Overlay网络的构建支持VxLAN技术,将二层的MAC地址封装到4层的UDP数据包中,只要传输层端到端可达,则可以基于VxLAN隧道实现容器间大二层网络的构建,这也体现了Overlay网络与底层网络基础架构的相对无关性。
Macvlan
Macvlan网络虚拟化技术的引进让我们回到了熟悉的企业虚拟化环境中虚机网络的管理模式,即将容器连接到现有的二层网络中,每个容器都拥有一个跟宿主机同一VLAN的IP地址,从而实现容器跨主机的通信。
上图为Macvlan的bridge模式,该模式跟我们平时接触的桌面版虚拟化软件的网络桥接模式类似,容器直接接入跟主机相同的二层网络并获得独立的IP地址。
上图为Macvlan的Trunk模式,该模式跟企业虚拟化常用网络模式类似。主机网卡绑定了多个不同VLAN的IP地址,主机中的容器基于主机不同VLAN的网络获取对应VLAN的独立IP地址,实现容器跨主机通信的同时加强了网络层的安全性。
Macvlan的出现更多的将容器网络管理剥离出Docker本身,容器变得跟虚拟机一样基于现有的企业网络来获取所需要的网络配置信息,初探感觉比Overlay来得简单并易于理解,但具体是否这样还需实操证明。