Namespace 类型 | 隔离资源 | Kernel 版本 |
IPC | System V IPC 和 POSIX 消息队列 | 2.6.19 |
Network | 网络设备、网络协议栈、网络端口等 | 2.6.29 |
PID | 进程 | 2.6.14 |
Mount | 挂载点 | 2.4.19 |
UTS | 主机名和域名 | 2.6.19 |
USR | 用户和用户组 | 3.8 |
Pid namespace
- 不同用户的进程就是通过 Pid namespace 隔离开的,且不同 namespace 中可以有相同 Pid。
- 有了 Pid namespace, 每个 namespace 中的 Pid 能够相互隔离。
net namespace
- 网络隔离是通过 net namespace 实现的, 每个 net namespace 有独立的 network devices, IP addresses, IP routing tables, /proc/net 目录。
- Docker 默认采用 veth 的方式将 container 中的虚拟网卡同 host 上的一个 docker bridge: docker0 连接 在一起。
ipc namespace
- Container 中进程交互还是采用 linux 常见的进程间交互方法 (interprocess communication – IPC), 包 括常见的信号量、消息队列和共享内存。
- container 的进程间交互实际上还是 host上 具有相同 Pid namespace 中的进程间交互,因此需要在 IPC 资源申请时加入 namespace 信息 - 每个 IPC 资源有一个唯一的 32 位 ID。
mnt namespace
mnt namespace 允许不同 namespace 的进程看到的文件结构不同,这样每个 namespace 中的进程所看 到的文件目录就被隔离开了。
uts namespace
UTS(“UNIX Time-sharing System”) namespace允许每个 container 拥有独立的 hostname 和 domain name, 使其在网络上可以被视作一个独立的节点而非 Host 上的一个进程。
user namespace
每个 container 可以有不同的 user 和 group id, 也就是说可以在 container 内部用 container 内部的用户 执行程序而非 Host 上的用户。
相关命令
-
查看当前系统的 namespace: lsns –t <type>
-
查看某进程的 namespace: ls -la /proc/<pid>/ns/
-
进入某 namespace 运行命令: nsenter -t <pid> -n ip addr
-
生产一个新的namespace运行一个程序
unshare -f -n sleep 360
练习
# 运行一个sleep使用新的net的namespace
[root@ip-172-16-21-45 ~]# unshare -fn sleep 360
# 找出sleep的进程
[root@ip-172-16-21-45 ~]# ps -ef | grep sleep
root 10574 7278 0 15:04 pts/0 00:00:00 unshare -fn sleep 360
root 10577 10574 0 15:04 pts/0 00:00:00 sleep 360
root 10635 10485 0 15:05 pts/1 00:00:00 grep --color=auto sleep
# 查看sleep的网路情况
[root@ip-172-16-21-45 ~]# nsenter -t 10577 -n ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
发现只有环回口地址,因为并没有网络插件给他分配地址