命名空間(namespace)
命名空間(namespace)是賦予容器私有、隔離系統視角的核心功能——它讓一群行程覺得自己獨佔一台機器,即使它們其實在共用主機。把它想成房間裡的單向鏡:房內的人只看得到自己房間裡的東西,完全不知道隔壁就有其他擠滿了人、用著同一棟大樓的房間。命名空間把一組系統資源包起來,使其內部的行程只看得到自己的那一份,對其他人一無所見。
命名空間不只一種,而是好幾種,各自隔離不同的資源,你把它們組合起來用。PID 命名空間給容器自己的行程編號,使它的第一個行程是 PID 1,且它連主機其他行程都看不到。掛載(mount)命名空間給它自己的檔案系統配置與根目錄。網路命名空間給它自己的網路介面與位址。使用者命名空間讓它有自己的使用者與群組 ID(所以容器內的 root 不必是主機上的 root)。還有更多(給主機名稱、行程間通訊等等)。每一種都只是核心為「帶有該命名空間標記的行程」另外保存一份「誰能看到什麼」的對照表。
命名空間之所以重要,是因為它是構成容器的「隔離」那一半:它回答的問題是「這個行程能看到什麼」。把它們和控制群組(回答「它能用多少」)配對,你就用純粹的核心機制——無須超管理器——建出了容器化的核心。誠實的告誡是:命名空間虛擬化的是「視角」,而非核心本身——每個帶命名空間的行程仍跑在那唯一共用的主機核心上,所以單靠命名空間是一道可見性邊界,而非如獨立機器那般堅固的安全牆。
在一個容器裡,你執行列出行程的指令,只看到三個:你的應用程式與它的助手,而你的應用程式自豪地顯示為 PID 1。在跑著同一個核心的主機上,同一支應用程式其實可能是數百個行程中的 PID 8472——PID 命名空間只是從內部把其餘的全藏了起來。
PID 命名空間讓容器的第一個行程成為 PID 1,並把主機的行程藏起來。
命名空間管的是可見性(你能看到什麼),而非消耗量(你能用多少)——後者那份工作屬於控制群組。又因為所有帶命名空間的行程仍共用那唯一的主機核心,命名空間是一種隔離機制,並不能取代真正的安全邊界。