Namespace是将内核的全局资源做封装,使得每个Namespace都有一份独立的资源,因此,不同的进程在各自的namespace内对同一资源的使用不会产生相互干扰。
目前,linux内核总共实现了6中namespace:
- IPC : 隔离System V IPC 和POSIX消息队列
IPC:Inter-Process Communication(进程间通信),IPC namespace针对的是SystemV IPC和Posix消息队列,这些IPC机制都会用到标识符。IPC Namespace 能做到的就是使相同的标识符在两个Namespace中代表不同的消息队列,这样就使得两个Namespace中的进程不能通过IPC进程通信了。 Network :隔离网络资源
每个Network Namespace都有自己的网络设备、IP地址、路由表、/proc/net目录,端口号等1
2
3
4ip nets add new_ns #创建network namespace
ip nets exec new_ns ip link list #使用 ip nets exec可以对特定的network namespace执行网络管理
ip nets exec new_ns ip link set dev lo up #启用lopopback接口
ip nets delete new_ns #删除namespaceMount : 隔离文件系统挂载点
用来隔离文件系统挂载点,每个进程能看到的文件系统都记录在/proc/$$/mounts里,在创建了一个新的Mount Namespace后,进程系统对文件系统挂载/卸载的动作不会影响到其他Namespace。- PID : 隔离进程ID
用于隔离进程PID号,这样一来,不同的Namespace中的进程PID号就可以是一样的了 - UTS : 隔离主机名和域名
因为主机名可以代替IP,因此可以使用主机名在网络上访问某台机器,如果不做隔离,这个机制在容器里就会出问题。 - User :隔离用户ID和组ID
一个进程在namespace里的用户和组ID与它在host里的ID可以不一样,最有用的地方在于可以在容器内部启用0号用户(root),但是它的特权被限定在容器内,离开容器就只是普通用户权限了