深入剖析Docker核心原理之Namespace

摘要:PID 命名空间(PID Namespace):允许容器内的进程有独立的进程 ID(PID),这样容器内的进程与宿主机上的进程相互隔离。Network 命名空间(Network Namespace):允许容器拥有独立的网络栈,包括网络设备、IP 地址、端口等,

Docker是云原生的核心,也是云技术的重要组成,今天就重点详解Doker核心原理之namespace@mikechen

本文作者:陈睿|mikechen

文章来源:mikechen.cc

Docker利用 Linux 内核提供的命名空间Namespaces来实现容器化,Linux命名空间namespace用于进程隔离和资源隔离。

命名空间Namespaces允许在同一系统上运行的进程拥有独立的视图,不同命名空间中的资源互相隔离,避免冲突。

命名空间允许容器内的进程有独立的进程 ID、网络栈、文件系统挂载点、独立的主机名和域名、独立的进程间通信资源等独立的环境。

namespace在docker中的作用使用使得容器可以在一个相对独立的环境中运行,不会与宿主机或其他容器产生冲突。

Docker 使用了namespace的六项隔离来实现容器的隔离,主要有以下几种:

PID 命名空间(PID Namespace): 允许容器内的进程有独立的进程 ID(PID),这样容器内的进程与宿主机上的进程相互隔离。Network 命名空间(Network Namespace): 允许容器拥有独立的网络栈,包括网络设备、IP 地址、端口等,从而实现容器之间的网络隔离。Mount 命名空间(Mount Namespace): 允许容器拥有独立的文件系统挂载点,使得容器可以拥有自己的文件系统视图,不受宿主机文件系统的影响。UTS 命名空间(UTS Namespace): 允许容器拥有独立的主机名和域名。IPC 命名空间(IPC Namespace): 允许容器拥有独立的进程间通信资源,如消息队列、信号量等。User 命名空间(User Namespace): 允许容器内的进程以一个不同于宿主机上的用户和用户组的身份运行,提供了更强的安全性。

namespace实现原理也非常简单,每个进程(task_struct)都有一个关于namespace的属性nsproxy,表示自己所属的namespace。

如下所示:

struct task_struct { ... /* namespaces */struct nsproxy *nsproxy;...}

其中的nsproxy就是指向各种namespace的一个代理:

当新进程被创建后会继承其父进程的namespace,这就是为啥一个容器里面的所有进程都共享namespace。

在创建容器时,Docker通过调用 Linux 内核提供的系统调用,为容器创建一个或多个命名空间,并在这些命名空间中运行容器内的进程。

PID 命名空间: 允许容器内的进程有独立的进程ID。每个容器都有自己的PID命名空间,这样容器内的进程在视觉上就像在一个独立的操作系统中运行一样。Network 命名空间: 允许容器拥有独立的网络栈,包括网络设备、IP 地址和端口。这样容器之间的网络可以相互隔离,每个容器都有自己的网络命名空间。Mount 命名空间: 允许容器拥有独立的文件系统挂载点。每个容器都有自己的Mount命名空间,这样容器内的文件系统与宿主机以及其他容器的文件系统相互隔离。UTS 命名空间: 允许容器拥有独立的主机名和域名。这使得每个容器可以有自己独特的主机标识符。IPC 命名空间: 允许容器拥有独立的进程间通信资源,如消息队列和信号量。这样,容器内的进程可以独立于宿主机上的其他进程进行进程间通信。User 命名空间: 允许容器内的进程以一个不同于宿主机上的用户和用户组的身份运行。这提高了容器内部进程的安全性。

来源:小茵论科技

相关推荐