????Docker 是利用 Linux 的 Namespace 慕匠、Cgroups 和聯(lián)合文件系統(tǒng)三大機(jī)制來保證實(shí)現(xiàn)的窗声, 所以它的原理是使用 Namespace 做主機(jī)名、網(wǎng)絡(luò)憾赁、PID 等資源的隔離盛霎,使用 Cgroups 對進(jìn)程或者進(jìn)程組做資源(例如:CPU赠橙、內(nèi)存等)的限制,聯(lián)合文件系統(tǒng)用于鏡像構(gòu)建和容器運(yùn)行環(huán)境愤炸。
????Namespace 是 Linux 內(nèi)核的一項功能期揪,該功能對內(nèi)核資源進(jìn)行隔離,使得容器中的進(jìn)程都可以在單獨(dú)的命名空間中運(yùn)行摇幻,并且只可以訪問當(dāng)前容器命名空間的資源横侦。Namespace 可以隔離進(jìn)程 ID、主機(jī)名绰姻、用戶 ID枉侧、文件名、網(wǎng)絡(luò)訪問和進(jìn)程間通信等相關(guān)資源狂芋。
????Docker 主要用到以下五種命名空間榨馁。
????pid namespace:用于隔離進(jìn)程 ID。
????net namespace:隔離網(wǎng)絡(luò)接口帜矾,在虛擬的 net namespace 內(nèi)用戶可以擁有自己獨(dú)立的 IP翼虫、路由、端口等屡萤。
????mnt namespace:文件系統(tǒng)掛載點(diǎn)隔離珍剑。
????ipc namespace:信號量,消息隊列和共享內(nèi)存的隔離。
????uts namespace:主機(jī)名和域名的隔離死陆。
????Cgroups
????Cgroups 是一種 Linux 內(nèi)核功能招拙,可以限制和隔離進(jìn)程的資源使用情況(CPU、內(nèi)存措译、磁盤 I/O别凤、網(wǎng)絡(luò)等)。在容器的實(shí)現(xiàn)中领虹,Cgroups 通常用來限制容器的 CPU 和內(nèi)存等資源的使用规哪。
????聯(lián)合文件系統(tǒng)
????聯(lián)合文件系統(tǒng),又叫 UnionFS塌衰,是一種通過創(chuàng)建文件層進(jìn)程操作的文件系統(tǒng)诉稍,因此,聯(lián)合文件系統(tǒng)非常輕快猾蒂。Docker 使用聯(lián)合文件系統(tǒng)為容器提供構(gòu)建層均唉,使得容器可以實(shí)現(xiàn)寫時復(fù)制以及鏡像的分層構(gòu)建和存儲。常用的聯(lián)合文件系統(tǒng)有 AUFS肚菠、Overlay 和 Devicemapper 等舔箭。