Linux Namespace和Cgroup的概念
一 Linux Namespace
1.1 Namespace基本概念
Namespace(命名空间) 是 Linux 内核提供的一种资源隔离机制。它允许将系统资源分隔成多个虚拟的“空间”,每个命名空间内的进程只能访问该命名空间下的资源,而不能访问其他命名空间中的资源。通过 namespace,不同的进程可以在同一个操作系统内共享硬件资源,但又能感知到各自独立的环境。
Docker 正是通过为每个容器创建一套独立的命名空间,让容器具备了类似 “独立虚拟机” 的运行环境,但无需像虚拟机那样加载完整操作系统内核(共享宿主机内核),因此更轻量。
1.2 Docker依赖的6类namespace及其作用
- PID Namespace
用来隔离进程 ID 编号,让每个命名空间内的进程有独立的 PID 序列。 容器内的init进程(如/sbin/init或容器入口命令)会被分配PID 1,与宿主机的PID 1(系统 init 进程)不冲突。容器内看不到宿主机或其他容器的进程。 - NET Namespace(网络)
用来隔离网络栈,每个命名空间有独立的网卡、IP、路由表、端口、防火墙规则。 Docker 为每个容器创建独立的虚拟网卡(如eth0),并分配私有 IP(如172.17.0.0/16网段)。容器的端口(如80)仅在自身网络命名空间内可见,需通过 “端口映射”(-p)才能被宿主机或外部访问。 - MNT Namespace(挂载)
用来隔离文件系统挂载点。每个命名空间有独立的挂载目录树。 Docker 为每个容器挂载独立的 “根文件系统(RootFS)”(即容器镜像的文件结构),容器内的/目录与宿主机的/完全隔离。容器内挂载的文件(如/tmp)不会影响宿主机。 - UTS Namespace(主机名 / 域名)
用来隔离主机名(hostname)和域名解析(NIS 域名)。UTS :UNIX Time-sharing System。 每个容器可以通过–hostname设置独立的主机名,容器内执行hostname命令看到的是自己的主机名,而非宿主机的主机名。 容器的/etc/hostname文件也与宿主机独立。 - IPC Namespace(进程间通信)
用来隔离进程间通信资源(如消息队列、共享内存、信号量)。 容器内进程只能与同一容器内的其他进程通过 IPC 通信(如msgget创建消息队列),无法访问宿主机或其他容器的 IPC 资源,避免进程间通信干扰。 - USER Namespace(用户 ID)
隔离用户 / 组 ID,允许容器内的root用户(UID 0)映射为宿主机的非 root 用户。 可以提高安全性:即使容器内的进程以root身份运行,其在宿主机上对应的实际用户可能是普通用户(如UID 1000),避免容器内权限泄露影响宿主机。
(注:部分场景下 Docker 可能默认关闭 USER Namespace,需手动配置启用)
1.3 使用命令查看docker的namespace
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e1766a145de9 image:xyz "bash" About an hour ago Up About an hour reverent_nobel$ docker inspect -f '{{.State.Pid}}' e1766a145de9
472512$ ls -l /proc/472512/ns
total 0
lrwxrwxrwx 1 root root 0 Sep 9 18:27 ipc -> ipc:[4026534957]
lrwxrwxrwx 1 root root 0 Sep 9 18:27 mnt -> mnt:[4026534953]
lrwxrwxrwx 1 root root 0 Sep 9 17:20 net -> net:[4026535130]
lrwxrwxrwx 1 root root 0 Sep 9 18:27 pid -> pid:[4026534969]
lrwxrwxrwx 1 root root 0 Sep 9 18:27 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0 Sep 9 18:27 uts -> uts:[4026534956]#宿主机上面ps -ef 是可以看到docker里面跑的进程(pid:473767)的
$ ps -ef | grep 472512
root 13713 247726 0 18:31 pts/3 00:00:00 grep --color=auto 472512
root 472512 472491 0 17:20 pts/0 00:00:00 bash
root 473767 472512 3 17:22 pts/0 00:02:11 MyExe -c tmp.xml
二 Linux Cgroup
2.1 Cgroup概念
Linux cgroup(Control Groups,控制组) 是 Linux 内核提供的一种核心资源管理机制,用于 限制、统计和隔离 一组进程对系统资源(如 CPU、内存、IO、网络等)的使用。它是容器技术(如 Docker、Kubernetes)实现资源隔离的核心底层技术之一,也广泛用于服务器运维中对进程资源的精细化管控。
cgroup 的核心目标是对进程组进行 “资源管控”,具体包含三大能力:
- 资源限制(Resource Limiting)
限制进程组可使用的资源上限,例如:
CPU:限制进程组的 CPU 使用率(如最多占用 1 个核心、50% 单核算力)。
内存:限制进程组可使用的物理内存 / 交换分区上限(如最多 512MB)。
块设备 IO:限制进程组对磁盘的读写速率(如读 100MB/s、写 50MB/s)。
网络:限制进程组的网络带宽(需结合 tc 工具)。 - 资源统计(Resource Accounting)
精确统计进程组对资源的实际使用量,例如:
统计进程组当前使用的 CPU 时间、内存占用量、IO 读写量。
数据可通过内核暴露的文件接口(如 /sys/fs/cgroup)实时读取,用于监控或计费。 - 任务控制(Task Control)
对进程组执行统一的操作,例如:
暂停 / 恢复进程组(freezer 子系统)。
终止进程组内的所有进程。
2.2 cgroup 的典型应用场景
- 容器技术(Docker/Kubernetes)
容器的 “资源限制”(如 docker run --memory=512M --cpus=0.5)本质就是通过 cgroup 实现的:每个容器对应一个 cgroup,Docker/K8s 自动创建 cgroup 并配置资源规则。 - 服务器进程管控
对高资源消耗进程(如数据库、Web 服务)设置资源上限,防止其占用过多资源导致系统崩溃。例如:
限制 MySQL 进程最多使用 2 个 CPU 核心、4GB 内存。
限制日志切割进程的 IO 速率,避免影响业务磁盘性能。 - 多租户资源隔离
在共享服务器中,通过 cgroup 为不同租户的进程分配独立资源配额(如租户 A 用 20% CPU,租户 B 用 30% CPU),实现资源隔离。
参考资料
【1】https://blog.csdn.net/Dreaming_TI/article/details/144539894 Linux资源隔离机制 — 命名空间(Namespace)详解