實(shí)現(xiàn)容器的底層技術(shù)
cgroup 和 namespace 是最重要的兩種技術(shù)。cgroup 實(shí)現(xiàn)資源限額, namespace 實(shí)現(xiàn)資源隔離。
cgroup
cgroup 全稱 Control Group。Linux 操作系統(tǒng)通過 cgroup 可以設(shè)置進(jìn)程使用 CPU、內(nèi)存 和 IO 資源的限額。前面我們看到的--cpu-shares、-m、--device-write-bps 實(shí)際上就是在配置 cgroup。我們可以在 /sys/fs/cgroup 中找到它。
namespace
namespace 管理著 host 中全局唯一的資源,并可以讓每個(gè)容器都覺得只有自己在使用它。換句話說,namespace 實(shí)現(xiàn)了容器間資源的隔離。
Linux 使用了六種 namespace,分別對(duì)應(yīng)六種資源:Mount、UTS、IPC、PID、Network 和 User。
- Mount namespace
Mount namespace 讓容器看上去擁有整個(gè)文件系統(tǒng)。
容器有自己的 / 目錄,可以執(zhí)行 mount 和 umount 命令。當(dāng)然我們知道這些操作只在當(dāng)前容器中生效,不會(huì)影響到 host 和其他容器。
- UTS namespace
簡單的說,UTS namespace 讓容器有自己的 hostname。 默認(rèn)情況下,容器的 hostname 是它的短ID,可以通過 -h 或 --hostname 參數(shù)設(shè)置。
- IPC namespace
IPC namespace 讓容器擁有自己的共享內(nèi)存和信號(hào)量(semaphore)來實(shí)現(xiàn)進(jìn)程間通信,而不會(huì)與 host 和其他容器的 IPC 混在一起。
- PID namespace
容器擁有自己獨(dú)立的一套 PID,這就是 PID namespace 提供的功能。
- Network namespace
Network namespace 讓容器擁有自己獨(dú)立的網(wǎng)卡、IP、路由等資源。
- User namespace
User namespace 讓容器能夠管理自己的用戶,host 不能看到容器中創(chuàng)建的用戶。