Docker內核技術原理(一)之namespace概述
趣談健康 · 程式 ·

Docker內核技術原理(一)之namespace概述

Docker的空間隔離使用的是namespace(空間),它是內核提供的一種空間隔離,在一個空間下,每個進程看到的視圖是一致的,相應的如果不在一個空間下看到資源視圖是不一致的,舉個例子,如果兩個進程在同一個網絡命令空間下,那麼他們看到的網絡信息(網卡、IP、路由等)是一樣的,可以通過localhost的方式互相訪問。常用的有6種namespace,在Linux 內核4.6之後又添加了Cgroup這namespace,5.6 之後又添加了時鐘namespace。

Namespace

系統調用參數

隔離內容

UTS

CLONE_NEWUTS

主機名與域名

IPC

CLONE_NEWIPC

信號量、消息隊列和共享內存

PID

CLONE_NEWPID

進程編號

Network

CLONE_NEWNET

網絡設備、網絡棧、埠等等

Mount

CLONE_NEWNS

掛載點(文件系統)

User

CLONE_NEWUSER

用戶和用戶組

Cgroup

CLONE_NEWCgroup

Cgroup的根目錄

Time

CLONE_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。

Docker的空間隔離使用的是namespace(空間),它
聲明:文章觀點僅代表作者本人,PTTZH僅提供信息發布平台存儲空間服務。
喔!快樂的時光竟然這麼快就過⋯
繼續其他精彩內容吧!
more