资源隔离:为什么构建容器需要Namespace?
我们知道,Docker是基于Linux内核的Namespace技术实现各种资源隔离的。
那么什么是Namespace?各种Namespace都有什么作用?为什么docker需要Namespace呢?
首先我们先来了解一下什么是Namespace。
什么是Namespace?
下面是Namespace维基百科的定义
Namespace 是 Linux 内核的一项功能,该功能对内核资源进行分区,以使一组进程看到一组资源,而另一组进程看到另一组资源。Namespace 的工作方式通过为一组资源和进程设置相同的 Namespace 而起作用,但是这些 Namespace 引用了不同的资源。 资源可能存在于多个 Namespace 中。这些资源可以是进程 ID、主机名、用户 ID、文件名、与网络访问相关的名称和进程间通信。
简单来说,Namespace 是 Linux 内核的一个特性,该特性可以实现在同一主机系统中,对进程 ID、主机名、用户 ID、文件名、网络和进程间通信等资源的隔离。Docker 利用 Linux 内核的 Namespace 特性,实现了每个容器的资源相互隔离,从而保证容器内部只能访问到自己 Namespace 的资源。
最新的linux5.6内核中,提供了8种类型的Namespace

虽然Linux内核提供了8种Namespace,但是最新版本的docker只用了其中的前6种。分别为
Mount Namespace、PID Namespace、Net Namespace、IPC Namespace、UTS Namespace、User Namespace。
下面,我们详细了解下Docker使用的6种Namespace都有什么作用。
Mount Namespace
隔离不同的进程或者进程组看到的挂载点,实现容器内只能看到自己的挂载信息,在容器内的挂载操作不会影响主机的挂载目录
unshare是一个uitl-linux工具包中的一个工具,可以时间创建并访问不同类型的Namespace。
UTS Namespace
主要是用来隔离主机名的
它允许每个UTS Namespace拥有独立的主机名
IPC Namespace
主要是用来隔离进程间通信的
PID Namespace 和 IPC Namespace 一起使用可以实现同一IPC Namespace 内的进程可以彼此通信,不同IPC的Namespace的进程却不能通信
User Namespace
主要是用来隔离用户和用户组的
使用User Namespace 可以实现进程在容器内部拥有root权限,而在主机上却只是普通用户
Net Namespace
用来隔离网络设备、IP地址和端口等信息
Net Namespace 可以让每个进程拥有自己独立的IP地址,端口和网卡信息
例如主机IP为172.16.4.1,容器内可以设置独立的IP地址为192.168.10.1
为什么Docker需要NamespaceS?
Linux内核从2002年2.4.19版本开始加入了 Mount Namespace
内核3.8版本加入了User Namespace 为容器提供了足够的支持功能
当Docker创建一个容器时,会创建这六种Namespace,然后将容器中的进程加入这些Namespace中。
参照https://blog.csdn.net/qq_34556414/article/details/111567863这篇博客。

浙公网安备 33010602011771号