濟(jì)南學(xué)生網(wǎng)站建設(shè)求職購(gòu)物網(wǎng)站頁(yè)面設(shè)計(jì)
Docker:namespace環(huán)境隔離 & CGroup資源控制
- Docker
- 虛擬機(jī)
- 容器
- namespace
- 相關(guān)命令
- dd
- mkfs
- df
- mount
- unshare
- 進(jìn)程隔離
- 文件隔離
- CGroup
- 相關(guān)命令
- pidstat
- stress
- cgroup控制
- 內(nèi)存控制
- CPU控制
Docker
在開發(fā)中,經(jīng)常會(huì)遇到環(huán)境問(wèn)題,比如程序依賴某個(gè)庫(kù),庫(kù)又要具體的版本,以及某些函數(shù)必須在指定平臺(tái)使用,這就會(huì)為開發(fā)帶來(lái)很大的麻煩。
為此,有人提出采用虛擬化技術(shù),為軟件虛擬出一個(gè)環(huán)境。就像是在一個(gè)冰天雪地的地方建了一個(gè)花房養(yǎng)花,花房?jī)?nèi)溫度濕度都剛剛好,將花房與外部的冰雪隔離開。
這種實(shí)現(xiàn)環(huán)境隔離的技術(shù),主要有虛擬機(jī)和容器兩種,Docker
屬于容器化的隔離技術(shù)。
虛擬機(jī)
所謂虛擬機(jī),其實(shí)就是把一臺(tái)物理主機(jī)虛擬為多臺(tái)邏輯上的計(jì)算機(jī)。多臺(tái)虛擬機(jī)共用物理上的同一臺(tái)計(jì)算機(jī),而每個(gè)邏輯上的計(jì)算機(jī)可以運(yùn)行不同的操作系統(tǒng),安裝不同的庫(kù),從而提供不同的環(huán)境。
如圖,上圖紅色部分與藍(lán)色部分是兩個(gè)不同的虛擬機(jī),虛擬機(jī)技術(shù)在硬件層之上,在操作系統(tǒng)層就開始進(jìn)行隔離。虛擬機(jī)通過(guò)偽造一個(gè)硬件的抽象接口,把操作系統(tǒng)嫁接到硬件上。
在硬件層與操作系統(tǒng)層之間,會(huì)存在一個(gè)虛擬化層,這其實(shí)就是一個(gè)軟件,該層會(huì)負(fù)責(zé)分配硬件資源。
可以看出,如果想要?jiǎng)?chuàng)建多個(gè)虛擬機(jī),就要在一臺(tái)物理主機(jī)上跑多個(gè)操作系統(tǒng),這其實(shí)要不小的開銷,而容器是一種更加輕量的隔離技術(shù)。
容器
容器也是一種虛擬化的實(shí)現(xiàn)技術(shù),它在操作系統(tǒng)之上進(jìn)行環(huán)境隔離,每個(gè)容器可以有自己的一套工具和庫(kù),但是它們共享操作系統(tǒng)的內(nèi)核!
如圖,紅色和藍(lán)色區(qū)域,是兩個(gè)不同的容器,它們的網(wǎng)絡(luò),文件系統(tǒng)等等都是隔離的,互不影響。
因?yàn)槭褂猛瑯拥牟僮飨到y(tǒng)內(nèi)核,所以它們的系統(tǒng)調(diào)用接口自然就相同,但是基于相同的系統(tǒng)調(diào)用接口,配置了不同的庫(kù),不同的文件系統(tǒng),那么最后兩個(gè)容器就不同。
比如說(shuō)上圖,可以通過(guò)容積隔離技術(shù)在一個(gè)centOS
操作系統(tǒng)上,運(yùn)行不同版本的Ubuntu
容器。這聽(tīng)起來(lái)很異想天開,但其實(shí)不然。
每個(gè)容器有自己獨(dú)立的用戶空間,這包括文件系統(tǒng)、庫(kù)和用戶級(jí)工具。用戶操作接口是用戶在容器內(nèi)操作系統(tǒng)時(shí)接觸到的命令行工具、庫(kù)和應(yīng)用。因此可以在上層的容器中,執(zhí)行Ubuntu
的命令,雖然內(nèi)核是CentOS
的。
相比于虛擬機(jī)技術(shù),容器化技術(shù)非常輕量,容器相當(dāng)于一個(gè)跑在操作系統(tǒng)上的進(jìn)程,啟動(dòng)一個(gè)進(jìn)程的速度是非??斓?#xff0c;通過(guò)容器技術(shù),只需幾秒鐘就在主機(jī)上打開一個(gè)新的操作系統(tǒng)。
而容器化技術(shù),目前最流行的實(shí)現(xiàn)方案就是Docker
。
那么容器化技術(shù)是如何實(shí)現(xiàn)各種資源的隔離的?對(duì)Linux
來(lái)說(shuō),它依賴于namespace
和CGroup
技術(shù),這兩個(gè)技術(shù)是由Linux
內(nèi)核提供的。
namespace
:實(shí)現(xiàn)進(jìn)程,文件系統(tǒng),用戶等資源隔離CGroup
:實(shí)現(xiàn)CPU,內(nèi)存,網(wǎng)絡(luò)等資源隔離
namespace
namespace
是 Linux
內(nèi)核用來(lái)隔離內(nèi)核資源的方式。通過(guò) namespace
可以讓進(jìn)程只能看到與自己相關(guān)的一部分資源,不同namespace
的進(jìn)程感覺(jué)不到對(duì)方的存在。
具體的實(shí)現(xiàn)方式是把一個(gè)或多個(gè)進(jìn)程的相關(guān)資源指定在同一個(gè) namespace
中。namespaces
是對(duì)全局系統(tǒng)資源的一種封裝隔離,使得處于不同 namespace
的進(jìn)程擁有獨(dú)立的全局系統(tǒng)資源,改變一個(gè)namespace
中的系統(tǒng)資源只會(huì)影響當(dāng)前namespace
里的進(jìn)程,對(duì)其他namespace
中的進(jìn)程沒(méi)有影響。
常見(jiàn)namespace
:
namespace | 隔離資源 |
---|---|
UTS | 主機(jī)名和域名 |
IPC | 進(jìn)程間通信:信號(hào)量、消息隊(duì)列、共享內(nèi)存 |
PID | 進(jìn)程 |
NetWork | 網(wǎng)絡(luò)設(shè)備,端口等 |
Mount | 文件系統(tǒng) |
User | 用戶 |
解釋:
UTS
:每個(gè)UTS namespace
都可以有自己獨(dú)立的主機(jī)和域名IPC
:每個(gè)IPC namespace
內(nèi)部的進(jìn)程可以進(jìn)行進(jìn)程間通信,但是不能跨越IPC namespace
進(jìn)行通信,在邏輯上這算跨主機(jī)通信PID
:每個(gè)PID namespace
都有自己獨(dú)立的進(jìn)程pid
系統(tǒng),不同的PID namespace
可以出現(xiàn)相同的pid
NetWork
:每個(gè)NetWork namespace
都有自己獨(dú)立的網(wǎng)絡(luò)設(shè)備,IP地址,路由表,端口號(hào)等Mount
:每個(gè)Mount namespace
有自己的文件系統(tǒng),互相不能看到對(duì)方的文件User
:每個(gè)User namespace
都有自己獨(dú)立的用戶和用戶組
相關(guān)命令
dd
dd
可以從指定輸入流讀取數(shù)據(jù),并輸出到指定輸出流。
參數(shù):
if=文件名
:從指定文件讀取數(shù)據(jù),如果不指定,則默認(rèn)從標(biāo)準(zhǔn)輸入讀取of=文件名
:輸出數(shù)據(jù)到指定文件,如果不指定,則默認(rèn)輸出到標(biāo)準(zhǔn)輸出bs=xxx
:設(shè)定一個(gè)塊block
的大小coun=blocks
:僅僅從輸入流拷貝blocks
個(gè)塊,結(jié)合上一個(gè)參數(shù),可以指定要讀取的數(shù)據(jù)個(gè)數(shù)
創(chuàng)建一個(gè)指定大小的空文件:
dd if=/dev/zero of=test.txt bs=1M count=80
以上指令,就是創(chuàng)建了一個(gè)80M
的空文件,輸入流是/dev/zero
,這是一個(gè)會(huì)不斷產(chǎn)生空白字符的文件,也就是ASCII
中字符編碼為0
的字符。使用這個(gè)文件作為輸入流,可以快速初始化一個(gè)空文件。
可以看到,最后創(chuàng)建了一個(gè)大小為83886080 byte
的文件,其實(shí)就是80 M
。
mkfs
mkfs
用于在設(shè)備上創(chuàng)建一個(gè)文件系統(tǒng),俗稱格式化。
mkfs [option] filesys [blocks]
選項(xiàng):
-t
:要?jiǎng)?chuàng)建的文件系統(tǒng)類型,比如ext3
、ext4
其中filesys
是被格式化的文件,而block
是文件系統(tǒng)的磁盤塊數(shù),可以省略。
把剛才創(chuàng)建的文件進(jìn)行格式化:
mkfs -t ext4 test.txt
這樣就把剛才的空文件進(jìn)行了格式化,變成了一個(gè)文件系統(tǒng)。
df
df
用于顯示Linux
中的文件系統(tǒng)磁盤使用情況。
選項(xiàng):
-h
:以更加可視化的形式輸出,默認(rèn)情況下數(shù)據(jù)以字節(jié)為單位,加上該選項(xiàng)后,會(huì)自動(dòng)轉(zhuǎn)化為GB
,MB
等單位-T
:顯示文件系統(tǒng)的類型
查看當(dāng)前的文件系統(tǒng),可以看到,其不包含剛才格式化的test.txt
,因?yàn)樗皇且粋€(gè)被格式化的文件,還沒(méi)有被掛載。
mount
mount
用于掛載文件系統(tǒng),相當(dāng)于給文件系統(tǒng)一個(gè)訪問(wèn)入口。
比如說(shuō)你在電腦上插入一個(gè)U盤,它往往會(huì)顯示為E盤
或者其它盤符。這個(gè)盤符就是一個(gè)訪問(wèn)入口,因?yàn)閁盤本身就是一個(gè)文件系統(tǒng),如果想要訪問(wèn)這個(gè)文件系統(tǒng)的內(nèi)容,Windows
自然要提供一個(gè)入口,因此它自動(dòng)分配一個(gè)E盤
,讓用戶可以通過(guò)E盤
訪問(wèn)U盤。
同樣的,剛才格式化test.txt
為一個(gè)文件系統(tǒng),現(xiàn)在要將其掛載起來(lái),才能訪問(wèn)這個(gè)文件系統(tǒng)。
mount [option] device dir
device
:被掛載的文件dir
:掛載到的位置
選項(xiàng):
-t
:掛載文件的類型,比如ext3
、ext4
,但是可以不填,mount
會(huì)自動(dòng)識(shí)別文件系統(tǒng)的類型
把剛才的test.txt
掛載到當(dāng)前/mymount
目錄下:
首先創(chuàng)建一個(gè)空目錄/mymount
,隨后把test.txt
掛載到這個(gè)目錄下,隨后可以看到,/mymount
出現(xiàn)了新的內(nèi)容。
隨后通過(guò)df -t ext4
查看系統(tǒng)的文件系統(tǒng),可以看到/dev/loop0
文件系統(tǒng),被掛載到了/mymount
下,說(shuō)明成功掛載了一個(gè)文件系統(tǒng)。
如果想要?jiǎng)h除這個(gè)文件系統(tǒng),可以執(zhí)行:
umount /mymount
以上所有命令,是在完成一個(gè)文件系統(tǒng)的創(chuàng)建,便于后續(xù)測(cè)試文件系統(tǒng)的隔離性。
接下來(lái)看看Linux
提供的創(chuàng)建namespace
的命令:
unshare
unshare
用于執(zhí)行一個(gè)進(jìn)程,并且為這個(gè)進(jìn)程提供一個(gè)獨(dú)立的namespace
。
unshare [option] program
program
:要執(zhí)行的程序
選項(xiàng):
-i --ipc
:不共享IPC
空間-m --mount
:不共享Mount
空間-n --net
:不共享Net
空間-p --pid
:不共享PID
空間-u --uts
:不共享UTS
空間-U --user
:不共享用戶空間--fork
:創(chuàng)建一個(gè)子進(jìn)程執(zhí)行program
--mount-proc
:掛載一個(gè)新的/proc
到命名空間內(nèi)
此處這個(gè)--fork
有一點(diǎn)點(diǎn)繞,因?yàn)?code>ushare這個(gè)命令,本身也是一個(gè)進(jìn)程,是在宿主機(jī)環(huán)境運(yùn)行的。
如果直接執(zhí)行unshare
,流程如下:
unshare
創(chuàng)建一個(gè)新的命名空間unshare
執(zhí)行program
,但是沒(méi)有創(chuàng)建新的進(jìn)程,而是直接用program
替換了unshare
本身
以上unshare
不帶有--fork
參數(shù),執(zhí)行了/bin/bash
進(jìn)程。進(jìn)入namespace
后,可以看到,/bin/bash
的父進(jìn)程是-bash
。這個(gè)-bash
就是宿主機(jī)的bash
進(jìn)程。因?yàn)?code>unshare是在bash
中執(zhí)行的,所以unshare
的父進(jìn)程是-bash
。最后將/bin/bash
替換unshare
,/bin/bash
的父進(jìn)程就是原先的父進(jìn)程-bash
。
這種情況下,看不到unshare
進(jìn)程,因?yàn)?code>/bin/bash就是原先的unshare
。
如果加上--fork
參數(shù),流程如下:
unshare
創(chuàng)建一個(gè)新的命名空間unshare
在新的命名空間中創(chuàng)建一個(gè)新的子進(jìn)程來(lái)執(zhí)行program
。unshare
本身不退出
加上--fork
參數(shù)后,/bin/bash
的父進(jìn)程就變成了unshare
,unshare
的父進(jìn)程是-bash
。也就是說(shuō)unshare
創(chuàng)建了一個(gè)子進(jìn)程來(lái)執(zhí)行program
,而不是親自執(zhí)行program
。
如果你跟著操作了,此時(shí)還處于namespace
中,要通過(guò)exit
來(lái)退出,不然會(huì)影響后續(xù)操作。
進(jìn)程隔離
現(xiàn)在嘗試進(jìn)行進(jìn)程隔離,也就是隔離,通過(guò)--pid
選項(xiàng)完成:
unshare --fork --pid --mount-proc /bin/bash
以上命令,用于創(chuàng)建一個(gè)新的PID
命名空間,并執(zhí)行bash
進(jìn)程,也就是執(zhí)行一個(gè)新的命令行。
此處要加上--fork
選項(xiàng),因?yàn)橐M(jìn)行進(jìn)程隔離,而unshare
本身是宿主機(jī)的進(jìn)程,如果直接讓unshare
本身去執(zhí)行program
,那么program
就不在新的namespace
中,導(dǎo)致錯(cuò)誤。
以上示例中,因?yàn)闆](méi)有加上--fork
,報(bào)錯(cuò)了。
如果只加上--fork
選項(xiàng),此時(shí)還是不能觀察到進(jìn)程隔離。因?yàn)?code>top、ps
等進(jìn)程監(jiān)控的命令,是依賴于/proc/PID
這個(gè)目錄的。但是命令沒(méi)有進(jìn)行文件系統(tǒng)隔離,所以還是會(huì)使用宿主機(jī)的/proc/PID
目錄,導(dǎo)致namespace
內(nèi)部可以看到外部的進(jìn)程。
為此,unshare
命令專門提供了一個(gè)參數(shù)--mount-proc
,在新的namespace
掛載一個(gè)獨(dú)立的/proc
目錄,方便進(jìn)行進(jìn)程的監(jiān)控。
進(jìn)程隔離結(jié)果:
可以看到,創(chuàng)建了新的namespace
后,ps -aux
只能查到兩個(gè)進(jìn)程,一個(gè)是bash
,一個(gè)是grep
。這就將namespace
內(nèi)部的進(jìn)程與宿主機(jī)的進(jìn)程隔離開了。
文件隔離
想要進(jìn)行文件隔離,創(chuàng)建一個(gè)新的namespace
,然后在里面創(chuàng)建一個(gè)文件系統(tǒng)并掛載。再在外部的宿主機(jī)查看是否可以看到這個(gè)文件系統(tǒng)。
- 創(chuàng)建一個(gè)新的文件隔離命名空間
unshare --mount --fork /bin/bash
- 創(chuàng)建一個(gè)指定大小的空文件
dd if=/dev/zero of=data.img bs=1M count=80
- 格式化文件為文件系統(tǒng)
mkfs -t ext4 data.img
- 掛載文件系統(tǒng)
mkdir /mymount
mount -t ext4 data.img /mymount
最后通過(guò)df -t ext4
,可以看到文件系統(tǒng)已經(jīng)掛載成功了。
打開一個(gè)新的終端,執(zhí)行df -t ext4
:
此時(shí)左右終端看到的文件系統(tǒng)不同,左側(cè)的namespace
內(nèi)掛載的新文件系統(tǒng),右側(cè)終端看不到了,這就是文件隔離。
此時(shí)在namespace
中執(zhí)行exit
,就會(huì)退出這個(gè)bash
,進(jìn)而退出namespace
,在其內(nèi)部創(chuàng)建的文件,掛載的文件系統(tǒng)都會(huì)自動(dòng)銷毀。
當(dāng)exit
退出后,再次查看文件系統(tǒng),也找不到剛才掛載的文件系統(tǒng)了。這和剛才兩個(gè)終端的情況不同,之前是不同namespace
之間的文件隔離,而此處是退出namespace
后,文件系統(tǒng)已經(jīng)被銷毀了。
CGroup
cgroup
的可以把一系列任務(wù),也就是進(jìn)程劃分到一個(gè)任務(wù)組,并且限制一個(gè)任務(wù)組的資源占用。比如可以限制一系列任務(wù)最多占用多少CPU
,占用多少內(nèi)存等等。
也就是說(shuō),namespace
完成了不同容器之間環(huán)境的隔離,而cgroup
完成了每個(gè)容器資源的訪問(wèn)限制。
相關(guān)命令
為了方便測(cè)試CPU與內(nèi)存壓力,此處使用兩個(gè)工具分別完成產(chǎn)生壓力以及壓力檢測(cè)。
pidstat
pidstat
用于檢測(cè)一個(gè)進(jìn)程的CPU、內(nèi)存、IO、線程等等資源的占用情況。
需要下載:
apt install sysstat
語(yǔ)法:
pidstat [option] [時(shí)間間隔] [次數(shù)]
選項(xiàng):
-u
:檢測(cè)CPU使用情況,默認(rèn)就是該選項(xiàng)-r
:檢測(cè)內(nèi)存使用情況-d
:檢測(cè)IO使用情況-p
:指定進(jìn)程pid
,如果指定ALL
則監(jiān)視所有進(jìn)程-C
:檢測(cè)通過(guò)指定命令啟動(dòng)的進(jìn)程
直接執(zhí)行pidstat
:
此時(shí)會(huì)輸出所有進(jìn)程,默認(rèn)輸出CPU占用情況,也就是%CPU
這一欄。
通過(guò)-p
指定進(jìn)程:
通過(guò)-C
指定進(jìn)程:
此處指定bash
進(jìn)程。
通過(guò)-r
檢測(cè)內(nèi)存:
此處%MEM
欄就是內(nèi)存占用情況。
指定檢測(cè)次數(shù)與頻率:
此處的1 3
表示:每隔一秒檢測(cè)一次,一共檢測(cè)三次。
stress
stress
是一個(gè)壓力測(cè)試工具,可以對(duì)CPU、內(nèi)存IO等進(jìn)行壓力測(cè)試。
這個(gè)工具也要下載:
apt install stress
語(yǔ)法:
stress [option]
參數(shù):
-c --cpu N
:產(chǎn)生N個(gè)進(jìn)程,每個(gè)進(jìn)程都循環(huán)調(diào)用sqrt
函數(shù)產(chǎn)生CPU壓力-m --vm N
:產(chǎn)生N個(gè)進(jìn)程,每個(gè)進(jìn)程都循環(huán)調(diào)用malloc free
函數(shù),產(chǎn)生內(nèi)存壓力
示例:
左側(cè)使用stress
創(chuàng)建了一個(gè)進(jìn)程進(jìn)行CPU壓力輸出,右側(cè)檢測(cè)stress
產(chǎn)生的壓力,結(jié)果一個(gè)進(jìn)程占滿了100%
的CPU資源。
cgroup控制
接下來(lái)看看如何操作cgroup
,它并沒(méi)有現(xiàn)成的指令來(lái)控制,而是需要操控配置文件來(lái)完成。
/proc/cgroups
查看cgroup
支持的資源控制:
在/proc/cgroups
文件中,包含了cgroup
所支持的資源控制的類型,比如CPU、內(nèi)存等。
查看cgroup
掛載信息:
mount | grep cgroup
這里就是每一個(gè)資源的控制目錄,比如在/sys/fs/cgroup/cpu
目錄下,就是控制CPU資源的配置文件。
內(nèi)存控制
創(chuàng)建一個(gè)內(nèi)存的控制組很簡(jiǎn)單,跳轉(zhuǎn)到目錄/sys/fs/cgroup/memory
,然后創(chuàng)建一個(gè)目錄:
此處創(chuàng)建了一個(gè)test_memory
目錄,這就算創(chuàng)建了一個(gè)test_memory
內(nèi)存控制組。進(jìn)入目錄后,可以看到這個(gè)目錄被初始化了很多文件,其中memory.limit_in_bytes
這個(gè)文件,就是這個(gè)cgroup
可以使用的最大內(nèi)存數(shù)目,以字節(jié)為單位。
想要限制這個(gè)cgroup
的最大內(nèi)存數(shù)量,直接往文件寫入數(shù)據(jù)即可:
echo "20971520" > memory.limit_in_bytes
此處20971520
其實(shí)就是20 mb
,此后這個(gè)cgroup
的最大內(nèi)存占用就不會(huì)超過(guò)20 mb
。
那么要如何把一個(gè)進(jìn)程加入控制組?這里有一個(gè)task
文件,只需要把進(jìn)程的PID
寫入到這個(gè)文件中,那么一個(gè)進(jìn)程就算加入了這個(gè)cgroup
。
如圖,創(chuàng)建一個(gè)進(jìn)程,占用50m
的內(nèi)存:
stress -m 1 --vm-bytes 50m
隨后在另一個(gè)端口通過(guò)pidstat
查看stress
的PID
,為15070
和15069
,其中15069
是控制進(jìn)程,15070
是真正在產(chǎn)生內(nèi)存壓力的進(jìn)程。將15070
寫入tasks
文件中,讓其加入cgroup
。
結(jié)果左側(cè)的stress
退出了,無(wú)法產(chǎn)生50m
的壓力。這是因?yàn)橐婚_始就限制了cgroup
只能占用最多20 m
的內(nèi)存。一旦進(jìn)程加入后,就會(huì)受到限制,從而崩潰。
CPU控制
創(chuàng)建一個(gè)CPU的控制組也一樣,跳轉(zhuǎn)到目錄/sys/fs/cgroup/cpu
,然后創(chuàng)建一個(gè)目錄:
此處創(chuàng)建了一個(gè)test_cpu
目錄,也就死和創(chuàng)建了一個(gè)test_cpu
CPU控制組。這個(gè)目錄同樣被初始化了很多文件。
其中控制CPU占用的是cpu.cfs_period_us
和cpu.cfs_quota_us
,這兩個(gè)文件共同完成CPU資源限制。其中cpu.cfs_period_us
作為分母,cpu.cfs_quota_us
作為分子,以百分比的形式限制CPU。
比如cpu.cfs_period_us
內(nèi)填入5000
,cpu.cfs_quota_us
內(nèi)填入2000
。那么該cgroup
最多可以占用2000/5000
也就是40%
的CPU資源。要注意的是,這兩個(gè)文件的最小值都是1000
,不允許使用比1000
更小的數(shù)字進(jìn)行配置。另外的cpu.cfs_quota_us
的默認(rèn)值為-1
,表示可以占用100%
的CPU。
另一個(gè)就是tasks
文件,同樣的只要把PID寫入這個(gè)文件,就算加入了這個(gè)CPU控制組。
啟動(dòng)一個(gè)stress
進(jìn)程:
由于stress
本身就會(huì)盡可能占滿CPU,右側(cè)輸出窗口每隔一秒輸出stress
的狀態(tài),其一直保持100%
的CPU資源占用。
左下角窗口先限制了test_cpu
這個(gè)控制組的CPU
最大占用率是2000/10000
,也就是20%
。
隨后把stress
的PID20849
寫入tasks
:
寫入后,從右邊的窗口可以看出,stress
的CPU占用率立馬下降,100%
到37%
最后穩(wěn)定在20%
。
可以cgroup
成功對(duì)進(jìn)程的CPU進(jìn)行了限制。
容器化技術(shù)在Linux
中基于namespace
和cgroup
實(shí)現(xiàn),namespace
完成不同容器之間的環(huán)境隔離,而cgroup
完成多個(gè)容器對(duì)資源的占用限制,合理分配資源。這就是容器化技術(shù),以及docker
的最基本原理,也是底層依賴。