namespace是linux kernel提供的进行资源隔离的手段
- 系统可以为进程分配不同的namespace
- 不同进程互不干扰
linux对namespace的操作方法
clone
创建新进程时调用,可以通过flag指定新进程的namespace类型
setns
让进程进入一个已经存在的namespace中
unshare
改系统调用将进程移到新的namespace下
隔离性
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
lsns -t <type>
查看进程的namespce
ls -al /proc/<pid>/ns
进入namespace运行命令
nsenter -t <pid> -n ip addr
-n == --net
在新的network space中执行sleep
unshare -f -n sleep 60
-f == --fork