什么是 Namespace?
Namespace 是 Linux 内核的一个特性,该特性可以实现在同一主机系统中,对进程 ID、主机名、用户 ID、文件名、网络和进程间通信等资源的隔离。Docker 利用 Linux 内核的 Namespace 特性,实现了每个容器的资源相互隔离,从而保证容器内部只能访问到自己 Namespace 的资源。
最新的 Linux 5.6 内核中提供了 8 种类型的 Namespace:
Namespace 名称 | 作用 |
---|---|
Mount(mnt) | 隔离挂载点 |
Process ID (pid) | 隔离进程 |
Network (net) | 隔离网络设备 |
nterprocess Communication (ipc) | 隔离 System V IPC 和 POSIX message queues |
UTS Namespace(uts) | 隔离主机名和域名 |
User Namespace (user) | 隔离用户和用户组 |
Control group (cgroup) Namespace | 隔离 Cgroups 根目录 |
Time Namespace | 隔离系统时间 |
虽然 Linux 内核提供了8种 Namespace,但是最新版本的 Docker 只使用了其中的前6 种,分别为Mount Namespace、PID Namespace、Net Namespace、IPC Namespace、UTS Namespace、User Namespace。
Linux 内核从 2002 年 2.4.19 版本开始加入了 Mount Namespace,而直到内核 3.8 版本加入了 User Namespace 才为容器提供了足够的支持功能。
当 Docker 新建一个容器时, 它会创建这六种 Namespace,然后将容器中的进程加入这些 Namespace 之中,使得 Docker 容器中的进程只能看到当前 Namespace 中的系统资源。
正是由于 Docker 使用了 Linux 的这些 Namespace 技术,才实现了 Docker 容器的隔离,可以说没有 Namespace,就没有 Docker 容器。