Docker 系列(三十八):命名空间(Namespaces)

命名空间是 Linux 内核一个强大的特性。每个容器都有自己单独的命名空间,运行在其中的应用都像是在独立的操作系统中运行一样。命名空间保证了容器之间彼此互不影响。

PID 命名空间

不同用户的进程就是通过 pid 命名空间隔离开的,且不同命名空间中可以有相同 pid。所有的 LXC 进程在 Docker 中的父进程为 Docker 进程,每个 LXC 进程具有不同的命名空间。同时由于允许嵌套,因此可以很方便地实现嵌套的 Docker 容器。想从操作系统层面理解进程与命名空间的来龙去脉,可以配合本站《Linux 系列导读》的「进程与内存」阶段一起阅读。

网络命名空间

有了 pid 命名空间,每个命名空间中的 pid 能够相互隔离,但是网络端口还是共享 host 的端口。网络隔离是通过 net 命名空间实现的,每个 net 命名空间有独立的网络设备、IP 地址、路由表、/proc/net 目录,这样每个容器的网络就能隔离开来。Docker 默认采用 veth 的方式,将容器中的虚拟网卡同 host 上的一个 Docker 网桥 docker0 连接在一起。

IPC 命名空间

容器中进程交互还是采用了 Linux 常见的进程间交互方法(interprocess communication,IPC),包括信号量、消息队列和共享内存等。然而同 VM 不同的是,容器的进程间交互实际上还是 host 上具有相同 pid 命名空间中的进程间交互,因此需要在 IPC 资源申请时加入命名空间信息,每个 IPC 资源有一个唯一的 32 位 id。

挂载(mnt)命名空间

类似 chroot,将一个进程放到一个特定的目录执行。mnt 命名空间允许不同命名空间的进程看到的文件结构不同,这样每个命名空间中的进程所看到的文件目录就被隔离开了。同 chroot 不同,每个命名空间中的容器在 /proc/mounts 的信息只包含所在命名空间的 mount point。

UTS 命名空间

UTS(”UNIX Time-sharing System”)命名空间允许每个容器拥有独立的 hostname 和 domain name,使其在网络上可以被视作一个独立的节点而非主机上的一个进程。

用户命名空间

每个容器可以有不同的用户和组 id,也就是说可以在容器内用容器内部的用户执行程序,而非主机上的用户。

系列导航


   转载规则


《Docker 系列(三十八):命名空间(Namespaces)》 由 吴杭沉 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
Docker 系列(三十九):控制组(Cgroups) Docker 系列(三十九):控制组(Cgroups)
控制组(cgroups)是 Linux 内核的一个特性,主要用来对共享资源进行隔离、限制、审计等。只有能控制分配到容器的资源,才能避免当多个容器同时运行时对系统资源的竞争。 控制组技术最早是由 Google 的程序员在 2006 年提出,L
2023-05-09
下一篇 
Docker 系列(三十七):Docker 的底层实现 Docker 系列(三十七):Docker 的底层实现
Docker 底层的核心技术包括 Linux 上的命名空间(Namespaces)、控制组(Control groups)、Union 文件系统(Union file systems)和容器格式(Container format)。 传统的
2023-04-25
  目录