官术网_书友最值得收藏!

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)建。

主站蜘蛛池模板: 会泽县| 靖边县| 松原市| 石泉县| 罗田县| 宁乡县| 洞头县| 和田市| 阿克陶县| 连江县| 曲麻莱县| 色达县| 武威市| 潜山县| 华宁县| 伽师县| 沈阳市| 义马市| 甘肃省| 沁源县| 通化县| 华安县| 开封市| 留坝县| 奇台县| 乌恰县| 莎车县| 嘉善县| 安达市| 丹东市| 溧阳市| 六安市| 仙游县| 本溪市| 皋兰县| 台州市| 梅河口市| 海宁市| 柞水县| 新干县| 东乌珠穆沁旗|