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,主机名,文件名,网络和进程间通信等资源的隔离。

相关推荐
九皇叔叔1 分钟前
Kubernetes 命令式对象配置详解:使用 YAML 管理 Kubernetes 资源
docker·容器·k8s
^Rocky39 分钟前
IT 疑难杂症诊疗室:复杂技术问题解决实录
运维·bug
CVer儿1 小时前
docker内llama.cpp和TRT-LLM win11本机部署qwen3.8
docker
萤火夜1 小时前
Docker(四) Docker介绍
docker·容器
挖掘狂人1 小时前
当生产环境"变慢",我用这套 perf + strace 30 分钟定位瓶颈
linux·运维·性能优化
.冰块.2 小时前
Docker 镜像深度学习:分层 Copy‑on‑Write、Dockerfile 语法、Harbor 私有仓库实操
docker·容器·harbor·镜像·dockerfile·images
szephyr2 小时前
Docker 镜像瘦身实战:从 1.2GB 压到 85MB 的完整过程
docker·容器·部署·多阶段构建·镜像优化
小马同学-2 小时前
Containerd入门:架构原理与安装部署
容器·containerd
阿明63 小时前
Linux进程【Linux】
linux·运维·服务器
Android系统攻城狮3 小时前
Linux Gstreamer深度解析之gst_audio_resampler_update调用流程与实战(三十)
linux·运维·服务器·gstreamer音视频·音视频进阶