目前docker完成6項隔離web
namespace |
系統調用參數 |
隔離內容 |
UTS |
CLONE_NEWUTS |
主機名與域名 |
IPC |
CLONE_NEWIPC |
信號量,消息隊列,共享內存 |
PID |
CLONE_NEWPID |
進程編號 |
Network |
CLONE_NEWNET |
網絡設備,網絡棧,端口等 |
Mount |
CLONE_NEWNS |
掛載點(文件系統) |
User |
CLONE_NEWUSER |
用戶和用戶組 |
|
|
|
Linux 內核3.8及之後的版本docker
namespace 的API包括網絡
clone()spa
setns()隊列
unshare()進程
Mount namespace:
隔離文件系統掛載點,每一個進程能看到的文件系統都記錄在/proc/$$/mounts裏,
UTS namespace:
使每一個docker擁有獨立的主機名和域名,在網絡上能夠被視爲一個獨立的節點,而非宿主機的一個進程
IPC namespace:
涉及到的IPC資源有包括常見的信號量,消息隊列和共享內存,容器和宿主機,容器與容器之間,容器與宿主機之間隔離
PID namespace:
對進程PID從新標號,兩個不一樣的namespace下的進程能夠有相同的PID,內核中爲全部的PID維護了一個樹狀結構,最頂層的是系統初始時創建的即root namespace,它建立的新PID namespace被稱爲child namespace(樹的子節點),經過這種方式,不一樣的PID namespace會造成一個層級體系,全部的父節點能夠看到子節點中的進程,並經過信號的方式對子節點中的進程產生影響,可是子節點看不到父節點PID namespace中的任何內容
Nework namespace:
對網絡相關資源進行隔離,每一個network namespace都有本身的網絡設備,IP地址,路由表,/proc/net 目錄,端口號等, 有了網絡隔離,好比有兩個容器的web應用都是用了80端口,由於隔離就不會衝突
User namespace:
隔離用戶和組ID,也就是說一個進程在namespace裏和用戶和組ID能夠和它在host裏的ID能夠不同,