Skip to content

53 Linux网络虚拟化(下):Docker所提供的容器通讯方案有哪些?

你好,我是周志明。今天我们接着上节课介绍的Linux网络知识,继续来学习它们在虚拟化网络方面的应用,从而为后续学习容器编排系统、理解各个容器是如何通过虚拟化网络来协同工作打好基础。

虚拟化网络设备

首先我们要知道,虚拟化网络并不需要完全遵照物理网络的样子来设计。不过,由于现在大量现成的代码,原来就是面向于物理存在的网络设备来编码实现的,另外也有出于方便理解和知识继承方面的考虑,因此虚拟化网络与物理网络中的设备还是具有相当高的相似性。

所以接下来,我就会从网络中那些与网卡、交换机、路由器等对应的虚拟设施,以及如何使用这些虚拟设施来组成网络入手,给你介绍容器间网络的通信基础设施。

好了,我们开始吧。

网卡:tun/tap、veth

首先是虚拟网卡设备。

目前主流的虚拟网卡方案有tun/tapveth两种,其中tun/tap出现得时间更早,它是一组通用的虚拟驱动程序包,里面包含了两个设备,分别是用于网络数据包处理的虚拟网卡驱动,以及用于内核空间与用户空间交互的字符设备(Character Devices,这里具体指/dev/net/tun)驱动。

大概在2000年左右,Solaris系统为了实现隧道协议(Tunneling Protocol)开发了这套驱动,从Linux Kernel 2.1版开始,tun/tap移植到了Linux内核中,当时它是作为源码中的可选模块,而在2.4版之后发布的内核,都会默认编译tun/tap的驱动。tun和tap是两个相对独立的虚拟网络设备,其中tap模拟了以太网设备,操作二层数据包(以太帧),tun则是模拟了网络层设备,操作三层数据包(IP报文)。