很久之前就了解使用過docker窍帝,但是之后就慢慢淡忘了扬卷,并且一直沒有真正了解下docker底層的基本原理。
然后今天想好好學(xué)習(xí)一下艘儒,這只是我的一個總結(jié)帝雇,大家可以直接去看陳皓大大的幾篇博客涮俄。
DOCKER基礎(chǔ)技術(shù):LINUX NAMESPACE(上)
DOCKER基礎(chǔ)技術(shù):LINUX NAMESPACE(下)
DOCKER基礎(chǔ)技術(shù):LINUX CGROUP
DOCKER基礎(chǔ)技術(shù):AUFS
DOCKER基礎(chǔ)技術(shù):DEVICEMAPPER
以下內(nèi)容大部分來自陳皓大大的博客,只是作為個人學(xué)習(xí)資料進(jìn)行總結(jié)尸闸。
Namespace解決的問題主要是環(huán)境隔離的問題
Linux CGroup解決對計算機(jī)資源使用上的隔離
一彻亲、Namespace
首先了解下Linux Namespace,是Linux提供的一種內(nèi)核級別環(huán)境隔離的方法吮廉,提供了對UTS苞尝、IPC、mount宦芦、PID宙址、network、User等的隔離機(jī)制调卑。
UTS命名空間使得不同的UTS命名空間有不同的主機(jī)名和域名抡砂。
IPC全稱 Inter-Process Communication,是Unix/Linux下進(jìn)程間通信的一種方式恬涧,IPC有共享內(nèi)存注益、信號量、消息隊列等方法溯捆。所以丑搔,為了隔離,我們也需要把IPC給隔離開來,這樣低匙,只有在同一個Namespace下的進(jìn)程才能相互通信。
新建進(jìn)程的時候加上CLONE_NEWIPC
參數(shù)就沒法共享信息碳锈。
int container_pid = clone(container_main, container_stack+STACK_SIZE,
CLONE_NEWUTS | CLONE_NEWIPC | SIGCHLD, NULL);
- 加上
CLONE_NEWPID
之后新建進(jìn)程pid變?yōu)?顽冶,我們知道,在傳統(tǒng)的UNIX系統(tǒng)中售碳,PID為1的進(jìn)程是init强重,地位非常特殊。他作為所有進(jìn)程的父進(jìn)程贸人,有很多特權(quán)(比如:屏蔽信號等)间景,另外,其還會為檢查所有進(jìn)程的狀態(tài)艺智,我們知道倘要,如果某個子進(jìn)程脫離了父進(jìn)程(父進(jìn)程沒有wait它),那么init就會負(fù)責(zé)回收資源并結(jié)束這個子進(jìn)程十拣。所以封拧,要做到進(jìn)程空間的隔離,首先要創(chuàng)建出PID為1的進(jìn)程夭问,最好就像chroot那樣泽西,把子進(jìn)程的PID在容器內(nèi)變成1。
但是缰趋,我們會發(fā)現(xiàn)捧杉,在子進(jìn)程的shell里輸入ps,top等命令,我們還是可以看得到所有進(jìn)程秘血。說明并沒有完全隔離味抖。這是因為,像ps, top這些命令會去讀/proc文件系統(tǒng)灰粮,所以非竿,因為/proc文件系統(tǒng)在父進(jìn)程和子進(jìn)程都是一樣的,所以這些命令顯示的東西都是一樣的谋竖。
所以红柱,我們還需要對文件系統(tǒng)進(jìn)行隔離。
int container_pid = clone(container_main, container_stack+STACK_SIZE,
CLONE_NEWUTS | CLONE_NEWIPC | SIGCHLD, NULL);
我們在啟用了mount namespace并在子進(jìn)程中重新mount了/proc文件系統(tǒng)蓖乘。這里锤悄,多說一下。在通過CLONE_NEWNS創(chuàng)建mount namespace后嘉抒,父進(jìn)程會把自己的文件結(jié)構(gòu)復(fù)制給子進(jìn)程中零聚。而子進(jìn)程中新的namespace中的所有mount操作都只影響自身的文件系統(tǒng),而不對外界產(chǎn)生任何影響。這樣可以做到比較嚴(yán)格地隔離隶症。
我們還有別的一些文件系統(tǒng)也需要這樣mount政模。User Namespace
Network Namespace
二、Linux CGroup
Linux CGroup全稱Linux Control Group蚂会, 是Linux內(nèi)核的一個功能淋样,用來限制,控制與分離一個進(jìn)程組群的資源(如CPU胁住、內(nèi)存趁猴、磁盤輸入輸出等)。
三彪见、AUFS
四儡司、DEVICEMAPPER