什么是 Linux 的命名空间(Namespaces)?Docker 运用了哪些命名空间来实现隔离?
在 Docker 和容器化技术中,Linux 命名空间(Namespaces) 是最核心的底层基石之一。简单来说,命名空间实现了“视线”上的隔离(让容器觉得自已拥有独立的系统),而 cgroups(控制组)则实现了“资源”上的限制(限制 CPU、内存等)。
下面我们详细拆解什么是 Linux 命名空间,以及 Docker 具体使用了哪些命名空间。
一、 什么是 Linux 命名空间(Namespaces)?
Linux 命名空间是 Linux 内核的一个功能,它能够对系统资源进行隔离。
在没有命名空间的情况下,系统上的所有进程都共享相同的资源(如 PID、网络设备、挂载点等)。
而一旦将进程放入特定的命名空间中,该进程及其子进程就只能“看到”和“访问”该命名空间内的资源。
- 比喻:命名空间就像是把一栋大楼(物理服务器/宿主机)隔断成一个个独立的公寓(容器)。每个公寓里的居民(进程)都以为自己拥有独立的客厅、厨房和厕所,但实际上他们共享整栋大楼的物理地基、管道和电线。
二、 Docker 运用了哪些命名空间来实现隔离?
Docker 在启动容器时,会为每个容器创建一组专属的命名空间。主要包括以下 6+2 个命名空间:
1. PID Namespace(进程隔离)
- 作用:隔离进程 ID。
- Docker 中的应用:在容器内部,你运行
ps -ef或top,会发现容器的主进程(如 Nginx)的 PID 是 1(类似于系统的初始化进程)。但在宿主机上,这个进程其实有一个普通的、很大的 PID(例如 12345)。 - 效果:容器内部的进程无法看到或杀死宿主机或其他容器中的进程。
2. NET Namespace(网络隔离)
- 作用:隔离网络设备、IP 地址、路由表、端口号等。
- Docker 中的应用:每个容器都有自己独立的虚拟网卡(如
eth0)、独立的 IP 地址和端口范围。容器 A 绑定了 80 端口,容器 B 也可以绑定 80 端口,它们互不冲突。 - 效果:容器拥有独立的网络栈,通过虚拟网桥(如
docker0)与外界通信。
3. MNT Namespace(挂载点/文件系统隔离)
- 作用:隔离文件系统挂载点。
- Docker 中的应用:每个容器都有自己独立的文件系统目录树。容器内部看到的
/(根目录)是 Docker 镜像提供的,与宿主机的/相互隔离。 - 效果:容器内对文件系统的修改(如删除
/etc)不会影响到宿主机或其他容器。
4. IPC Namespace(进程间通信隔离)
- 作用:隔离 System V IPC 和 POSIX 消息队列等进程间通信机制。
- Docker 中的应用:防止容器内的进程与宿主机或其他容器的进程进行共享内存(Shared Memory)或消息队列通信。
- 效果:只有在同一个容器内的进程才能通过 IPC 进行通信。
5. UTS Namespace(主机名与域名隔离)
- 作用:隔离主机名(Hostname)和 NIS 域名(Domain name)。
- Docker 中的应用:每个容器可以有自己独立的主机名。例如,你可以将容器的主机名设置为
web-server-01。 - 效果:容器内的应用获取到的主机名是容器专属的,便于在网络中进行标识。
6. USER Namespace(用户和组隔离)
- 作用:隔离用户 ID(UID)和组 ID(GID)。
- Docker 中的应用:允许容器内的
root用户(UID 0)映射到宿主机上的一个非特权用户(如 UID 10001)。 - 效果:极大提高了安全性。即使容器内的黑客获取了
root权限,由于用户命名空间的映射,他在宿主机上也只是一个毫无权限的普通用户,无法危害宿主机。(注:Docker 默认未开启此功能,但支持配置开启)。
较新 Linux 内核引入的命名空间(Docker 同样支持):
7. CGROUP Namespace(控制组隔离)
- 作用:隔离 cgroups 目录视图。
- Docker 中的应用:在容器内部查看
/proc/self/cgroup时,只能看到该容器自身的 cgroup 限制,而看不到宿主机的完整 cgroup 树。 - 效果:防止容器泄露宿主机的资源配置信息。
8. TIME Namespace(时间隔离 - 较新内核支持)
- 作用:隔离系统时间(如单调钟和实时钟)。
- Docker 中的应用:允许容器拥有与宿主机不同的系统时间。
总结
Docker 并不是一种“虚拟化”技术(不像 VMware 那样虚拟化硬件),它是一种“隔离”技术。
通过联合使用上述的 Namespaces(命名空间),Docker 成功地在单个 Linux 宿主机上构建出了一个个互不干扰、以为自己独占系统的“集装箱”(容器)。