对于 Docker 等大多数 Linux 容器来说,Cgroups 技术是用来制造约束的主要手段,而 Namespace 技术则是用来修改进程视图的主要方法。
[root@dock01 ~]# docker run -it centos /bin/bash
[root@269b70e78ad4 /]# ps
PID TTY TIME CMD
1 pts/0 00:00:00 bash
14 pts/0 00:00:00 ps
可以看到,我们在 Docker 里最开始执行的 /bin/sh,就是这个容器内部的第 1 号进程(PID=1),
而这个容器里一共只有两个进程在运行。这就意味着,前面执行的 /bin/sh,
以及我们刚刚执行的 ps,已经被 Docker 隔离在了一个跟宿主机完全不同的世界当中。
这究竟是怎么做到的呢?
而现在,我们要通过 Docker 把这个 /bin/sh 程序运行在一个容器当中。
这时候,Docker 就会在这个第 100 号员工入职时给他施一个“障眼法”,
让他永远看不到前面的其他 99 个员工,更看不到比尔 · 盖茨。这样,
他就会错误地以为自己就是公司里的第 1 号员工。
这种技术,就是 Linux 里面的 Namespace 机制。而 Namespace 的使用方式也非常有意思:它其实只是 Linux 创建新进程的一个可选参数。我们知道,在 Linux 系统中创建线程的系统调用是 clone(),比如: