容器网络,可以理解为隔离在该容器内的一些要素构建起来的网络请求的基本环境。这些要素包括网卡(Network Interface)、回环设备(Loopback Device)、路由表(Routing Table)和iptables规则。
在大多数情况下,我们都希望容器进程能使用自己的网卡里的网络栈,即拥有自己的 IP地址和端口。在介绍这种网络模式前,我们先介绍下被隔离的容器进程和其他Network Namespace里的容器进程是怎样进行交互的。
关于这个问题,我们可以把每一个容器看做一台主机,也就是说如何让两台主机进行通信,其实解决方案就是把两台主机分别连接到一台交换机上。在 Linux系统中,可以起到虚拟交换机作用的网络设备是网桥(Bridge)。网桥是一个工作在数据链路层的设备,主要功能是根据 MAC地址学习来将数据包转发到网桥的不同端口上。
而为了将数据包转发到网桥的不同端口上,Docker项目会默认在宿主机上创建一个名叫 dokcer0的网桥,凡是连接在 docker0网桥上的容器,都可以通过它来进行通信。
那么docker0又是如何工作的来实现网桥的作用的呢?我们可以这样理解:在这里使用到了一个虚拟设备——Veth Pair,它的特点就是被创建出来后,总是以两张虚拟网卡(Veth Peer)的形式成对出现,并且从其中一个“网卡”发出的数据包,直接可以出现在与它对应的另一张“网卡”上,即使这两个网卡在不同的 Network Namespace当中。由此,容器网络的架构就完成了。