Docker(二) 网络原理
前言
上一次我们讲述了 docker 文件系统中的一些原理。发现了容器的一些猫腻,
我们进入容器看到的目录其实是联合文件系统做出来的伪操作系统。 docker 使用这种方式实现了目录和文件系统的隔离。
但要让一个容器成型光有文件系统的隔离是不够的, 我们进入容器后运行一个 ps aux
的时候会看到其他容器或者宿主机启动的进程,运行一个 ifconfig 的时候会看到其他容器的网卡。所以除此之外还需要进程和网络的隔离。
这样才能让一个容器看起来就是一个真正的操作系统一样。
namespace
namespace(名称空间),我们可以理解为这是 linux
为了隔离网络,进程,文件等等搞出来个一个机制,所以它就有网络名称空间,进程名称空间,挂载文件系统名称空间等。
不同名称空间是隔离的,互相无法通信,也无法感知。 也就是说如果在你名称空间 A 中创建了一个进程,那在名称空间 B
中你是看不到这个进程的,也无法与这个进程进行网络通信。不同的名称空间之间的关系就好像是平行宇宙一样。
每个名称空间都可以拥有自己的网络设备,路由表,Iptables/Netfilter 设置。
这样,通过上一篇我们讲到的联合文件系统和名称空间,docker
就能实现对一个操作系统的模拟以及容器之间的隔离,所以我们在进入容器的时候也就会发现我们看不到宿主机和其他容器的任何东西
(进程,网络设备,文件)。
网络名称空间操作
我们来模拟一下 docker 对名称空间的操作。
ip netns add Container_ns1sudo
ip netns add Container_ns2sudo
ip netns list$ sudo
Container_ns2
Container_ns1
我们探索一下新创建的 ns 的网络空间 (通过 ip netns exec 命令可以在特定 ns 的内部执行相关程序
ip netns Container_ns1 ip a$ sudo exec
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1
/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00link
ip netns Container_ns2 ip a$ sudo exec
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1
/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00link
ip netns Container_ns2 ip route$ sudo exec
可以看到,新建的 ns 的网络设备只有一个 loopback 口,并且路由表为空。而且他们双方都看不到对方的
loopback,你也看不到宿主机(也就是 root 名称空间)的任何进程和网络设备。所以说,我们的宿主机 (root), Container_ns1 和
Container_ns2 三者之间是隔离的。
Veth 设备对
当我们有了名称空间后可以实现网络和进程的隔离。但我们是有跟其他容器和外界网络进行通讯的需求的,那这个怎么办呢? 我们再来看看
linux 基础网络设备中的 Veth(虚拟网卡设备对)。 引入 Veth
设备对是为了在不同的网络名称空间之间进行通信,利用它可以直接将两个名称空间连接起来。 由于要连接两个网络名称空间,所以 Veth
设备都是成对出现的,很像一对网卡,并且中间有一根相连的线。 我们将其中一端称为另一端的 peer。 Veth
设备对的特性是无论像任何一端发送网络请求,它都会转发给他的 peer 进行接收。 所以如果我们把一对 veth
设备放到两个名称空间中,那么名称空间 A 就可以通过向自己的 Veth 设备发送网络请求的方式与名称空间 B 进行通信了。
linux 网桥
通过 Veth 我们能让两个不同的名称空间进行网络通信,但这还不够。
如果说一个容器对应一个名称空间的话,那么我们需要把无限多个容器网络打通仅仅靠 Veth 就不够了。 这时候就出现了 linux 网桥。briage
是 Linux 提供的一种虚拟网络设备之一。其工作方式非常类似于物理的网络交换机设备。Linux Bridge
可以工作在二层,也可以工作在三层,默认工作在二层。工作在二层时,可以在同一网络的不同主机间转发以太网报文;一旦你给一个 Linux
Bridge 分配了 IP 地址,也就开启了该 Bridge 的三层工作模式。在 Linux 下,你可以用 iproute2 工具包或 brctl 命令对 Linux bridge
进行管理。所以结合着名称空间,网桥和 Veth。我们就有如下的网络模型。