一、Namespace简介
Namespace 是 Linux 内核的一项功能,该功能对内核资源进行分区,以使一组进程看到一组资源,而另一组进程看到另一组资源。
Namespace 的工作方式通过为一组资源和进程设置相同的 Namespace 而起作用,但是这些 Namespace 引用了不同的资源。资源可能存在于多个 Namespace 中。这些资源可以是进程 ID、主机名、用户 ID、文件名、与网络访问相关的名称和进程间通信。
简而言之,Namespace 是 Linux 内核的一个特性,该特性可以实现在同一主机系统中,对进程 ID、主机名、用户 ID、文件名、网络和进程间通信等资源的隔离。Docker 利用 Linux 内核的 Namespace 特性,实现了每个容器的资源相互隔离,从而保证容器内部只能访问到自己 Namespace 的资源。
正是由于 Docker 使用了 Linux 的这些 Namespace 技术,才实现了 Docker 容器的隔离,可以说没有 Namespace,就没有 Docker 容器。
最新的 Linux 5.6 内核中提供了 8 种类型的 Namespace,而最新版本的 Docker 只使用了其中的前6 种,分别为Mount Namespace、PID Namespace、Net Namespace、IPC Namespace、UTS Namespace、User Namespace。
二、各种Namespace介绍
1. Mount Namespace
Mount Namespace 是 Linux 内核实现的第一个 Namespace,从内核的 2.4.19 版本开始加入。它可以用来隔离不同的进程或进程组看到的挂载点。通俗地说,就是可以实现在不同的进程中看到不同的挂载目录。
使用 Mount Namespace 可以实现容器内只能看到自己的挂载信息,在容器内的挂载操作不会影响主机的挂载目录。
下面对Mount Namespace进行演示。演示之前先介绍一个命令行工具 unshare。unshare 是 util-linux 工具包中的一个工具,CentOS 7 系统默认已经集成了该工具,使用 unshare 命令可以实现创建并访问不同类型的 Namespace。
# 创建一个 bash 进程并且新建一个 Mount Namespace
$ sudo unshare --mount --fork /bin/bash
# 在 /tmp 目录下创建一个目录
[root@centos7 centos]# mkdir /tmp/tmpfs
# 使用 mount 命令挂载一个 tmpfs 类型的目录
[root@centos7 centos]# mount -t tmpfs -o size=20m tmpfs /tmp/tmpfs
# df 命令查看一下已经挂载的目录信息
# 可以看到 /tmp/tmpfs 目录已经被正确挂载
[root@centos7 centos]# df -h
Filesystem Size Used Avail Use% Mount