Namespace简介

  Namespace是将内核的全局资源做封装,使得每个Namespace都有一份独立的资源,因此,不同的进程在各自的namespace内对同一资源的使用不会产生相互干扰。
  目前,linux内核总共实现了6中namespace:

  1. IPC : 隔离System V IPC 和POSIX消息队列
      IPC:Inter-Process Communication(进程间通信),IPC namespace针对的是SystemV IPC和Posix消息队列,这些IPC机制都会用到标识符。IPC Namespace 能做到的就是使相同的标识符在两个Namespace中代表不同的消息队列,这样就使得两个Namespace中的进程不能通过IPC进程通信了。
  2. Network :隔离网络资源
      每个Network Namespace都有自己的网络设备、IP地址、路由表、/proc/net目录,端口号等

    1
    2
    3
    4
    ip 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 #删除namespace
  3. Mount : 隔离文件系统挂载点
      用来隔离文件系统挂载点,每个进程能看到的文件系统都记录在/proc/$$/mounts里,在创建了一个新的Mount Namespace后,进程系统对文件系统挂载/卸载的动作不会影响到其他Namespace。

  4. PID : 隔离进程ID
      用于隔离进程PID号,这样一来,不同的Namespace中的进程PID号就可以是一样的了
  5. UTS : 隔离主机名和域名
      因为主机名可以代替IP,因此可以使用主机名在网络上访问某台机器,如果不做隔离,这个机制在容器里就会出问题。
  6. User :隔离用户ID和组ID
      一个进程在namespace里的用户和组ID与它在host里的ID可以不一样,最有用的地方在于可以在容器内部启用0号用户(root),但是它的特权被限定在容器内,离开容器就只是普通用户权限了