1. namespace技術(shù)
namespace是為了對(duì)容器進(jìn)行網(wǎng)絡(luò)、通信、文件、權(quán)限等對(duì)象的隔離。
namespace包含了六項(xiàng)隔離:
- UTS ——主機(jī)名與域名
- IP ——通信(信號(hào)量、消息隊(duì)列和共享內(nèi)容)
- PID ——進(jìn)程編號(hào),通過(guò)PID技術(shù),同個(gè)主機(jī)上的不同容器可以有相同的PID進(jìn)程。
- Network ——網(wǎng)絡(luò)設(shè)備、網(wǎng)絡(luò)棧、端口
- Mount ——讓文件擁有自己的文件系統(tǒng)
- User ——用戶和用戶組,實(shí)現(xiàn)用戶權(quán)限的隔離
2.cgroups技術(shù)
通過(guò)cgroups可以為容器設(shè)定系統(tǒng)資源的配額,包括CPU、內(nèi)存、I/O等等。對(duì)于不同的系統(tǒng)資源,cgroups提供了統(tǒng)一的接口,對(duì)資源進(jìn)行控制和統(tǒng)計(jì)。
限制的具體方式不盡相同,實(shí)際的流程很復(fù)雜。
3.其它相關(guān)Linux Kernel技術(shù)
- selinux和apparmor:增強(qiáng)對(duì)容器的訪問(wèn)控制
- capabilities:將超級(jí)用戶root的權(quán)限分割成各種不同的capability權(quán)限,從而更嚴(yán)格地控制容器的權(quán)限。
-
netlink:完成Docker的網(wǎng)絡(luò)環(huán)境配置和創(chuàng)建
這些技術(shù)從安全、隔離、防火墻、訪問(wèn)等方面為容器的成熟落地打下了堅(jiān)實(shí)的基礎(chǔ)。
4.容器管理

4.1 lxc(第一節(jié)“容器的發(fā)展與演進(jìn)”里有?。?/h3>
是第一個(gè)完整意義上的容器管理技術(shù)。通過(guò)lxc可以方便的創(chuàng)建、啟動(dòng)和停止一個(gè)容器。還可以通過(guò)lxc來(lái)操縱容器中的應(yīng)用,也可以查看容器的運(yùn)行狀態(tài)。
Docker的出現(xiàn)把2008年的lxc的復(fù)雜的使用方式簡(jiǎn)化為自己的一套體系。
4.2 libcontainer
Docker后來(lái)開(kāi)發(fā)了原生的libcontainer代替了lxc。
libcontainer實(shí)際上反向定義了一組接口標(biāo)準(zhǔn)。
-
反向定義:libcontainer并不是為了調(diào)用底層的Linux Kernel技術(shù)而設(shè)計(jì)的,而是Linux Kernel技術(shù)符合了定義出來(lái)的libcontainer標(biāo)準(zhǔn),Docker引擎才能運(yùn)行起來(lái)。如果此后還有新技術(shù)符合這套標(biāo)準(zhǔn),Docker引擎還是可以正常運(yùn)行。
這樣的設(shè)計(jì)思路為Docker的跨平臺(tái)實(shí)現(xiàn)和全面化應(yīng)用帶來(lái)了可能。
5. Docker技術(shù)原理
- Docker構(gòu)造:Client-Server

裝好了Docker工具之后,也就同時(shí)裝好了Client端和Server端。
Client端可以是Docker命令行工具,也可以是GitHub上開(kāi)源的圖形化工具。通過(guò)Client工具可以發(fā)起創(chuàng)建、管理容器的指令到Server端。
- Docker Daemon

Docker Daemon通過(guò)libcontainer、lxc的技術(shù)來(lái)完成容器管理操作。
Docker Daemon的三個(gè)重要組件:
- execdriver:存儲(chǔ)了容器定義的配置信息,libcontainer拿到配置信息以后調(diào)用底層的namespace等技術(shù)來(lái)完成容器的創(chuàng)建和管理。
- networkdriver:完成容器網(wǎng)絡(luò)環(huán)境的配置,包括了容器的IP地址、端口、防火墻策略,以及與主機(jī)的端口映射等。
- graphdriver: 負(fù)責(zé)對(duì)容器鏡像的管理。