namespace是linux kernel提供的进行资源隔离的手段

  • 系统可以为进程分配不同的namespace
  • 不同进程互不干扰

    linux对namespace的操作方法

    clone
    创建新进程时调用,可以通过flag指定新进程的namespace类型
    setns
    让进程进入一个已经存在的namespace中
    unshare
    改系统调用将进程移到新的namespace下

隔离性

image.png
PID

  • 不同用户的进程通过pid namespace隔离,且不同namespace可以有相同的pid
  • namespace中的pid和宿主机的不同

Network

  • 每个net namespace有独立的network device,ip,ip routing,/proc/net
  • docker默认采用veth方式将容器中的虚拟网卡同宿主机的docker bridge:docker0连在一起

IPC

  • 容器中进程交互的常见方法,包括信号量、消息队列、共享内存
  • 容器间进程交互实际上还是宿主机上有相同pid namespace的进程间的交互

mnt

  • 允许进程看到不同的文件结构,这样每个进程看到的文件目录就被隔离开了。

uts

  • Unix Time-sharing System使每个容器拥有独立的hostname和域名,使其在网络上可视为一个独立的节点而非进程

user

  • 容器可以拥有独立的user 和group id,这样可以用容器内部的用户执行程序,而非宿主机用户

namespace常用操作

查看当前系统上的namespace

  1. lsns -t <type>

查看进程的namespce

  1. ls -al /proc/<pid>/ns

进入namespace运行命令

  1. nsenter -t <pid> -n ip addr
  2. -n == --net

在新的network space中执行sleep

  1. unshare -f -n sleep 60
  2. -f == --fork