为了支持网络协议栈的多个实例,Linux在网络栈中引入了网络命名空间,这些独立的协议栈被隔离到不同的命名空间中。处于不同命名空间中的网络栈是完全隔离的,彼此之间是无法通信的。通过对网络资源的隔离,就能在一个宿主机上虚拟多个不同的网络环境。Docker 正是利用了网络的命名空间特性,实现了不同容器之间的网络隔离。
在Linux 的网络命名空间中可以有自己独立的路由表以及独立的 iptables 设置来提供包转发、NAT 以及 IP包过滤等功能。
为了隔离出独立的协议栈,需要纳入命名空间的元素有进程、套接字、网络设备等。进程创建的套接字必须属于某个命名空间,套接字的操作也必须在命名空间中进行。同样,网络设备也必须属于某个命名空间。
命名空间的内核数据结构(如下图):
在新生成的私有命名空间中只有回环设备,其他设备默认都不存在,如果需要,则需要