Hello Folks! Welcome to Our Blog.

什么是 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。

为什么 Docker 需要 Namespace?

Linux 内核从 2002 年 2.4.19 版本开始加入了 Mount Namespace,而直到内核 3.8 版本加入了 User Namespace 才为容器提供了足够的支持功能。

当 Docker 新建一个容器时, 它会创建这六种 Namespace,然后将容器中的进程加入这些 Namespace 之中,使得 Docker 容器中的进程只能看到当前 Namespace 中的系统资源。

正是由于 Docker 使用了 Linux 的这些 Namespace 技术,才实现了 Docker 容器的隔离,可以说没有 Namespace,就没有 Docker 容器。

发表评论

欢迎
文章归档