Linux 内核提供了 namespaces 机制,用于在不同进程(组)间做资源的隔离。容器技术依赖于 namespaces 机制。
常用的可以隔离的类别,即 namespace 的类型有:
Namespace | Isolates |
---|---|
Mount (mnt) | Mount points |
Process ID (pid) | Process IDs |
Network (net) | Network devices, stacks, ports, etc. |
Inter-process communication (ipc) | System V IPC, POSIX message queues |
UTS | Hostname and NIS domain name |
User ID (user) | User and group IDs |
比如你为某个进程设置了新的 User ID namespace,那么这个进程运行时不能看到系统默认的用户(user)和组(group),而只能看到在它这个进程其中配置的用户和组。如果有另外一个进程也设置了这个 namespace,这两个进程能看到同一套用户。
/proc/<pid>/ns
下能看到该进程所使用的 namespace。
注意每个命名空间都只有一种类型。并没有一种命名空间包含了多种类型。因此:
- 对于 Docker 容器,不同的容器间隔离了 mount、pid、ipc 等,是因为每个容器都有自己单独的若干个命名空间
- 对于 k8s pod 里面的多个容器,它们绑定了同样的一套命名空间,使得彼此间的侦听的端口可以互相访问、进程互相可见等