容器隔离机制
Linux通过namespace将不同的资源隔离,就像一个沙箱一样。被隔离到某个namespace中的内容,无法访问到其它namespace的内容。可以通过unshare
或clone
设置标志位来将进程放入新的命名空间。
- PID Namespace
标志位: CLONE_NEWPID
文档: man pid_namespaces
在linux上执行man pid_namespaces
可以查看对应的命令文档。部分截图如下:
进程命名空间,在一个隔离的空间中,PID从1开始,相同PID与主机PID不构成冲突。类似主机的init进程,PID为1的进程被终止时,该命名空间下的所有进程都会收到SIGKILL
信号从而被终止。正因如此,一个容器的初始化进程只能是一个,而且终止后容器也就被停止了。
在不同的PID命名空间,进程互相看不到对方,不能通过PID找到对方,/proc
目录下也只能看到自己命名空间中的进程。但是一个父进程fork
出的子进程可以通过set_ns
放入子命名空间,在父进程的命名空间,仍然可以看到这个子进程,只是PID不一样。进程可以被挪到子命名空间,但不能被反向挪回更高级的命名空间。
- User Namespace
标志位: CLONE_NEWUSER
文档: man user_namespaces
用户命名空间,主要隔离的是安全相关的id和属性,尤其是用户id和用户组id,root目录,密钥,以及各种进程的能力(capabilities)。
在linux上执行man user_namespaces
可以查看对应的命令文档。部分截图如下:
- Network Namespace
标志位: