Docker的空間隔離使用的是namespace(空間),它是內核提供的一種空間隔離,在一個空間下,每個進程看到的視圖是一致的,相應的如果不在一個空間下看到資源視圖是不一致的,舉個例子,如果兩個進程在同一個網絡命令空間下,那么他們看到的網絡信息(網卡、IP、路由等)是一樣的,可以通過localhost的方式互相訪問。常用的有6種namespace,在Linux 內核4.6之后又添加了Cgroup這namespace,5.6 之后又添加了時鐘namespace。
Namespace系統調用參數隔離內容
UTSCLONE_NEWUTS主機名與域名
IPCCLONE_NEWIPC信號量、消息隊列和共享內存
NetworkCLONE_NEWNET網絡設備、網絡棧、端口等等
MountCLONE_NEWNS掛載點(文件系統)
UserCLONE_NEWUSER用戶和用戶組
CgroupCLONE_NEWCGROUPCgroup的根目錄
TimeCLONE_NEWTIME時鐘
這里有個小細節,上面表格創建Mount Namespace的系統調用參數是CLONE_NEWNS,而不是CLONE_NEWMOUNT。從字面理解是創建一個命名空間的意思,這是由于歷史原因導致的,因為Mount Namespace是第一個namespace,內核的開發者可能也沒有預料到后續還有其它的namespace的加入,所以就先把CLONE_NEWNS給占用了。
可見,namespace的隔離其實并不充分,除了上面的隔離能力,其他的都一樣。譬如,時鐘在內核5.6版本之前,所有容器和操作系統都共享同一個時鐘,如果修改了操作系統的時間,所有容器都時間都會變化。
namespace實現原理也非常簡單,每個進程(task_struct)都有一個關于namespace的屬性nsproxy,表示自己所屬的namespace。
struct task_struct { 。。.
/* namespaces */
struct nsproxy *nsproxy;
。。.
}
其中的nsproxy就是指向各種namespace的一個代理。
當新進程被創建后會繼承其父進程的namespace,這就是為啥一個容器里面的所有進程都共享namespace。在Linux集群上面,通過讀取“/proc/進程ID/ns/”下的文件可以獲取到每個進程對應的namespace。
文章轉載:https://os.51cto.com/art/202107/671347.htm
(版權歸原作者所有,侵刪)
編輯:jq
-
Docker
+關注
關注
0文章
507瀏覽量
12667
原文標題:Docker內核技術原理之Namespace
文章出處:【微信號:aming_linux,微信公眾號:阿銘linux】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
如何使用Docker部署大模型
Docker Compose的常用命令
Docker常用命令大全
【技術案例】Android in Docker

基于Docker鏡像逆向生成Dockerfile

云服務器 Flexus X 實例,Docker 集成搭建 NGINX

docker通過中間鏡像加速部署
在 Huawei Cloud EulerOS 系統中安裝 Docker 的詳細步驟與常見問題解決

三分鐘學會Docker基本操作,快速入門容器技術!

Docker運行環境安裝
ARM平臺實現Docker容器技術
ARM平臺實現Docker容器技術
Jtti:Docker會替代調虛機嗎

評論