- Docker容器技術(shù)與運維
- 李樹峰 鐘小平編著
- 1868字
- 2025-04-02 16:08:28
1.4.1 名稱空間
Linux的名稱空間機制提供了一種資源隔離的解決方案。Docker通過名稱空間機制為容器提供隔離的工作空間。運行容器時,Docker會為該容器創(chuàng)建一系列的名稱空間。
1.什么是名稱空間
名稱空間又稱命名空間,是對全局系統(tǒng)資源的一種封裝隔離技術(shù),使得處于不同名稱空間的進程擁有彼此獨立的全局系統(tǒng)資源,改變一個名稱空間中的系統(tǒng)資源只會影響當前名稱空間中的進程,而不會影響其他名稱空間中的進程。采用名稱空間機制,PID(進程ID)、IPC(進程間通信)、網(wǎng)絡等系統(tǒng)資源不再是全局性的,而是屬于特定的名稱空間。
2.名稱空間類型
Linux操作系統(tǒng)中的每個進程都有一個名為/proc/[pid]/ns的目錄(pid為進程ID),其中包含該進程所屬名稱空間的信息。例如,執(zhí)行以下操作可查看當前shell進程所屬的名稱空間($$代表當前shell的進程ID,ns代表名稱空間):
[root@host-a ~]# ls -l /proc/$$/ns total 0 lrwxrwxrwx. 1 root root 0 Mar 11 04:35 cgroup -> cgroup:[4026531835] lrwxrwxrwx. 1 root root 0 Mar 11 04:35 ipc -> ipc:[4026531839] lrwxrwxrwx. 1 root root 0 Mar 11 04:35 mnt -> mnt:[4026531840] lrwxrwxrwx. 1 root root 0 Mar 11 04:35 net -> net:[4026531992] lrwxrwxrwx. 1 root root 0 Mar 11 04:35 pid -> pid:[4026531836] lrwxrwxrwx. 1 root root 0 Mar 11 04:35 pid_for_children -> pid:[4026531836] lrwxrwxrwx. 1 root root 0 Mar 11 04:35 user -> user:[4026531837] lrwxrwxrwx. 1 root root 0 Mar 11 04:35 uts -> uts:[4026531838]
從以上輸出可知,Linux內(nèi)核到目前為止實現(xiàn)了7種不同類型的名稱空間(不同內(nèi)核版本的Linux所支持的名稱空間類型有所不同)。每種類型的每個名稱空間都有一個ID(唯一編號),如“ipc:[4026531839]”中“ipc”表示名稱空間類型,“4026531839”表示名稱空間ID。如果兩個進程的名稱空間ID相同,則說明它們屬于同一名稱空間。
● Cgroup(控制組):用于隔離控制組根目錄,從Linux 4.6版本開始,內(nèi)核才提供此功能。
● IPC(進程間通信):用于隔離進程間通信所需的資源。PID名稱空間和IPC名稱空間可以組合起來使用,同一個IPC名稱空間內(nèi)的進程可以彼此看見,允許進行交互,不同名稱空間的進程無法交互。
● Network(網(wǎng)絡):為進程提供網(wǎng)絡資源隔離能力。一個網(wǎng)絡名稱空間提供了一個獨立的網(wǎng)絡環(huán)境(包括網(wǎng)絡設備接口、IPv4和IPv6協(xié)議棧、IP路由表、防火墻規(guī)則和套接字等),就跟一個獨立的計算機系統(tǒng)一樣。
● Mount(掛載):為進程提供磁盤掛載點和文件系統(tǒng)的隔離能力。每個進程都存在于一個掛載名稱空間中。如果不使用掛載名稱空間,子進程和父進程將共享一個掛載名稱空間,子進程調(diào)用mount或umount命令將會影響到所有該名稱空間內(nèi)的進程。
● PID(進程ID):Linux通過名稱空間管理進程ID,同一個進程在不同的名稱空間中進程ID不同。進程名稱空間是父子結(jié)構(gòu),子空間對于父空間是可見的。例中的pid和pid_for_children就屬于同一名稱空間。
● User(用戶):用于隔離用戶。
● UTS:用于隔離主機名和域名。UTS是UNIX Time-sharing System的縮寫。
3.Docker使用名稱空間
Linux名稱空間具有更加精細的資源分配管理機制,為實現(xiàn)基于容器的虛擬化技術(shù)提供了很好的基礎,Docker利用這一特性實現(xiàn)了資源的隔離。容器本質(zhì)上就是進程,不同容器內(nèi)的進程屬于不同的名稱空間,彼此透明,互不干擾。這些名稱空間提供了一個隔離層。容器的每個方面都運行在獨立的名稱空間中,并且其訪問權(quán)限也僅限于該名稱空間。
Docker引擎使用下列幾個類型的Linux名稱空間來實現(xiàn)特定的資源隔離管理功能。
● PID名稱空間:用于進程隔離。對于同一進程,在不同的名稱空間中看到的進程ID不相同,每個進程命名空間有一套自己的進程ID管理方法。
● 網(wǎng)絡名稱空間:用于管理網(wǎng)絡接口。有了PID名稱空間,每個名稱空間中的進程就可以相互隔離,但是網(wǎng)絡端口還是共享本地系統(tǒng)的端口,這就需要通過網(wǎng)絡名稱空間實現(xiàn)網(wǎng)絡隔離。網(wǎng)絡名稱空間為進程提供了一個完全獨立的網(wǎng)絡協(xié)議棧的視圖。Docker采用虛擬網(wǎng)絡設備的方式,將不同名稱空間的網(wǎng)絡設備連接到一起。默認情況下,容器中的虛擬網(wǎng)卡將同本地主機上的docker0網(wǎng)橋連接在一起。
● IPC名稱空間:用于管理IPC資源的訪問。容器中進程交互采用了Linux常見的進程間交互方法,包括信號量、消息隊列和共享內(nèi)存等。
● 掛載名稱空間:用于管理文件系統(tǒng)掛載點。掛載名稱空間類似于chroot功能,將一個進程放到一個特定的目錄執(zhí)行。掛載名稱空間允許不同名稱空間的進程看到不同的文件結(jié)構(gòu),這樣每個名稱空間中的進程所看到的文件目錄會被彼此隔離。
● UTS名稱空間:用于隔離內(nèi)核和版本標識符。允許每個容器擁有獨立的主機名和域名,從而可以虛擬出一個有獨立主機名和網(wǎng)絡空間的環(huán)境,就與網(wǎng)絡上一臺獨立的主機一樣。默認情況下,Docker容器的主機名就是返回的容器ID。
● 用戶名稱空間:每個容器可以有不同的用戶和組ID,也就是說可以在容器內(nèi)使用特定的內(nèi)部用戶執(zhí)行程序,而不是使用本地系統(tǒng)上存在的用戶來執(zhí)行程序。每個容器內(nèi)部都可以有自己的root賬戶,但與主機上的用戶不在一個名稱空間。通過使用隔離的用戶名稱空間可以提高安全性,避免容器內(nèi)進程獲取額外的權(quán)限。
目前Docker引擎除了用戶名稱空間不完全支持以外,其他5個名稱空間都是默認開啟的,并且可以通過clone系統(tǒng)調(diào)用進行創(chuàng)建。
- Mastering ElasticSearch
- Linux Mint Essentials
- Windows Vista融會貫通
- INSTANT Galleria Howto
- Linux基礎使用與案例
- Hadoop Real-World Solutions Cookbook
- iOS 10快速開發(fā):18天零基礎開發(fā)一個商業(yè)應用
- Mastering Sass
- Getting Started with UDK
- 鴻蒙HarmonyOS應用開發(fā)從入門到精通
- Mastering AWS CloudFormation
- SAP后勤模塊實施攻略:SAP在生產(chǎn)、采購、銷售、物流中的應用
- Getting Started with Citrix XenApp 6.5
- Azure Serverless Computing Cookbook
- UNIX傳奇:歷史與回憶