1. 容器底層實(shí)現(xiàn)
上圖說(shuō)明:
Hypervisor:運(yùn)行在物理服務(wù)器和操作系統(tǒng)之間的中間層軟件保檐,可以允許多個(gè)操作系統(tǒng)和應(yīng)用共享一套基礎(chǔ)物理硬件耕蝉,是所有虛擬化技術(shù)的核心。
1.1 虛擬機(jī)隔離的方法
是利用一個(gè)獨(dú)立的Guest OS夜只,并利用Hypervisor虛擬化CPU赔硫、內(nèi)存、IO設(shè)備等實(shí)現(xiàn)的盐肃。
1.2 docker隔離方法:
1.2.1 使用Namespaces實(shí)現(xiàn)了系統(tǒng)環(huán)境的隔離
在《namespace的6項(xiàng)隔離》中詳細(xì)講解
Namespaces允許一個(gè)進(jìn)程以及它的子進(jìn)程從共享的宿主機(jī)內(nèi)核資源(網(wǎng)絡(luò)棧爪膊、進(jìn)程列表权悟、掛載點(diǎn)等)里獲得一個(gè)僅自己可見(jiàn)的隔離區(qū)域,讓同一個(gè)Namespace下的所有進(jìn)程感知彼此變化推盛,對(duì)外界進(jìn)程一無(wú)所知峦阁,仿佛運(yùn)行在一個(gè)獨(dú)占的操作系統(tǒng)中
1.2.2 使用CGroups限制這個(gè)環(huán)境的資源使用情況
將在《cgroups 資源限制》中詳細(xì)講解
比如一臺(tái)16核32GB的機(jī)器上只讓容器使用2核4GB。使用CGroups還可以為資源設(shè)置權(quán)重耘成,計(jì)算使用量榔昔,操控任務(wù)(進(jìn)程或線程)啟停等;
2. docker存在的問(wèn)題
2.1 存在的問(wèn)題
Docker是利用CGroups實(shí)現(xiàn)資源限制的瘪菌,只能限制資源消耗的最大值撒会,而不能隔絕其他程序占用自己的資源;
Namespace的6項(xiàng)隔離看似完整,實(shí)際上依舊沒(méi)有完全隔離Linux資源师妙。
如/proc 诵肛、/sys 、/dev/sd*等目錄未完全隔離默穴,SELinux怔檩、time、syslog等信息都未隔離蓄诽。
2.2 示例
在Docker容器中執(zhí)行top薛训、free等命令,顯示的是宿主機(jī)的情況仑氛。
在容器里修改/etc/sysctl.conf乙埃,提示只讀。
對(duì)于多進(jìn)程程序锯岖,一般都可以將worker數(shù)量設(shè)置成auto介袜,自適應(yīng)系統(tǒng)CPU核數(shù),但在容器里面這么設(shè)置嚎莉,取到的CPU核數(shù)是不正確的,例如Nginx沛豌,其他應(yīng)用取到的可能也不正確趋箩,需要進(jìn)行測(cè)試