Docker原理之一的Namespace详解

一,什么是Namespace?

维基定义:Namespace 是 Linux 内核的一项功能,该功能对内核资源进行分区,以使一组进程看到一组资源,而另一组进程看到另一组资源。Namespace 的工作方式通过为一组资源和进程设置相同的 Namespace 而起作用,但是这些 Namespace 引用了不同的资源。资源可能存在于多个 Namespace 中。这些资源可以是进程 ID、主机名、用户 ID、文件名、与网络访问相关的名称和进程间通信。

简单来说就是,它为进程提供了一个隔离的视角。在一个命名空间内进行的资源操作,对其他命名空间通常是不可见的,从而实现了进程间的隔离。

二,Namespace的创建

Namespaces 是通过以下几个系统调用在 Linux 中实现的:

1,clone():

这个系统调用用于创建一个新的进程。通过传入特定的 CLONE_NEW* 标志(例如 CLONE_NEWPID),可以在创建子进程时,为子进程创建一个或多个新的命名空间,并将该子进程放入其中。

2,unshare():

用于将当前进程 从现有的命名空间中分离 出来,放入一个新的命名空间。例如,一个正在运行的进程可以调用 unshare(CLONE_NEWNET) 为自己创建一个新的、隔离的网络环境。

3,setns():

用于将当前进程 加入到一个已存在的 命名空间中。这通常通过打开目标命名空间对应的 /proc/[pid]/ns/[type] 文件描述符来实现。

三,各种Namespace的解释

Linux内核主要提供了以上八种Namespace,但是docker目前使用的只有前面六种Namespace。

①Mount namespace(mnt)

隔离不同的进程或者进程组看到的挂载点,实现容器内只能看到自己的挂载信息,在容器内的挂载操作不会影响主机的操作目录。

②PID namespace(pid)

其主要的作用是隔离进程,例如一个进程在主机上PID为1234,使用PID namespace的话可以实现该进程在容器内部看到的PID为1。

③UTS namespace(uts)

它允许每一个uts namespace下都拥有一个独立的主机名

④IPC namespace(IPC)

PID Namespace 和IPC Namespace 一起使用可以实现同一IPC Namespace 内的进程彼此可以通信,但不同IPC Namespace 的进程却不能通信。

其主要实现的效果是隔离进程之间的通信。能够防止容器内的进程通过共享内存、信号量等方式干扰其他容器或宿主机进程。

⑤User namespace(User)

使用User namespace可以实现进程在容器内部拥有root权限,但是在主机上时却还是普通用户。

⑥Net namespace(Net)

Net namespace可以让每一个进程有自己独立的IP地址,端口和网卡信息。

四,总结

Docker容器基于以上六种namespace,实现了一个容器与外界的进程ID,用户ID,主机名,文件名,网络和进程间通信等资源的隔离。

相关推荐
龙飞0518 小时前
Kubernetes 疑难杂症:Pod 始终处于 Terminating 状态的真实原因与安全修复方案
安全·云原生·容器·kubernetes
耀耀_很无聊18 小时前
09_Jenkins安装JDK环境
java·运维·jenkins
MaximusCoder19 小时前
等保测评命令——Centos Linux
linux·运维·经验分享·python·安全·centos
ノBye~19 小时前
Centos7.6 Docker安装redis(带密码 + 持久化)
java·redis·docker
卷Java19 小时前
Linux服务器Docker部署OpenClaw:腾讯云/阿里云/VPS安装避坑指南
linux·运维·服务器
原来是猿21 小时前
Linux-【动静态库】
linux·运维·服务器
深圳市恒讯科技21 小时前
云服务器怎么选?从CPU、内存到IOPS的零基础选型手册
运维·服务器
艾莉丝努力练剑1 天前
【脉脉】AI创作者崛起:掌握核心工具,在AMA互动中共同成长
运维·服务器·c++·人工智能·安全·企业·脉脉
MonkeyKing_sunyuhua1 天前
K8S执行MAC打出的本地镜像错误:exec /usr/local/bin/uvicorn: exec format error
macos·容器·kubernetes
4t4run1 天前
3、k8s安装
云原生·容器·kubernetes