资源隔离:为什么构建容器需要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这篇博客。

posted @ 2021-10-22 10:35  羊脂玉净瓶  阅读(138)  评论(0)    收藏  举报