基于本文回答
0
评论

什么是 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 -eftop,会发现容器的主进程(如 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 宿主机上构建出了一个个互不干扰、以为自己独占系统的“集装箱”(容器)。

右滑查看面试常问