17 4026532160 pid 3 4727 root nginx: master process nginx -g daemon off;
18 4026532162 net 3 4727 root nginx: master process nginx -g daemon off;
我们可以看到用于隔离以上容器的命名空间是以下这些:
- uts(Unix 时间共享):容器拥有自己的 hostname 和 domain。
- ipc(进程间通信):容器内的进程可以通过系统级 IPC 和同一容器内的其他进程进行通信。
- pid(进程 ID):容器内的进程只能看到在同一容器内或拥有相同的 PID 命名空间的其他进程。
注意,用户(user)命名空间没有被使用,OCI 运行时规范提及了对用户命名空间的支持。不过,虽然 Docker 可以将此命名空间用于其容器,但由于固有的限制,它默认情况下没有使用。因此,容器中的 root 用户很可能是主机系统中的 root 用户。谨防!另一个没有出现在这里的命名空间是 cgroup。我花了一段时间才理解 cgroup 命名空间与 cgroups 机制(mechanism)的不同。Cgroup 命名空间仅提供一个容器的 cgroup 层次结构的孤立视图。同样,Docker 也支持将容器放入私有 cgroup 命名空间,但默认情况下没有这么做。
探索容器的 cgroups
Linux 命名空间可以让容器中的进程认为自己是在一个专用的机器上运行。但是,看不到别的进程并不意味着不会受到其他进程的影响。一些耗资源的进程可能会意外的过多消耗宿主机上面共享的资源。