容器技術精髓剖析

namespace

namespace技術是爲了對容器進行網絡、通信、文件、權限等對象的隔離,namespace包含了6項隔離。

UTS:可以使主機擁有獨立的主機名,隔離內容:主機名與域名

IPC:可以隔離容器之間的通信,在容器中的應用也需要擁有PID,隔離內容:信號量、消息隊列和共享內容

PID:可以使同一個主機上的不同容器可以有相同的PID進程,隔離內容:進程編號

Network:可以使容器擁有自己的IP、端口、路由,隔離內容:網絡設備、網絡棧、端口

Mount:可以使容器擁有自己的文件系統,隔離內容:文件系統

User:可以實現用戶權限的隔離,隔離內容:用戶和用戶組

Cgroups

Cgroups實現了對系統資源的限額和度量

利用namespace可以通過構建一個相對隔離的容器,而通過Cgroups可以爲容器設置系統資源的配額包括了CPU、內存、I/O等,對於不同的系統資源,Cgroups也提供了統一的接口,對資源進行控制統計,但限制的具體方式不盡相同。如內存,當容器需要申請更多的內存時,就會觸發Cgroups用戶檢測,如果用了超過Cgroups規定的限額,將會拒絕用戶內存申請,否則會給予相應的內存並在Cgroups的統計信息中進行記錄。實際操作中不僅要考慮內存的分配和回收,還要考慮不同類型的內存。

其他相關Linux Kernel技術

除了Namespace和Cgroups以外,Linux Kernel還提供了其他的技術來支撐容器的應用,如selinux、apparmor可以增強對容器的訪問控制,capabilities的主要實現在於將超級用戶root的權限分割成了不同的capabities權限,從而更嚴格地控制了容器權限,netlink技術可以完成Docker容器的網絡環境配置和創建。這些Linux內核技術從安全、隔離、防火牆、訪問等多個方面對容器的成熟落地打下來堅實的基礎。

容器管理

Linux內核提供了各項隔離技術,容器就可以順理成章地建立起來。兩個重要技術:Lxc和libcontainer

Lxc是第一個完整意義上的容器管理技術,通過Lxc可以方便地創建、啓動、停止容器,還可以通過它來操作容器中的應用,也可以查看容器中的運行狀態等。

libcontainer是docker開發的用來代替Lxc的,它實際上是反向定義了一套接口標準,也就是libcontainer不是爲了調用底層的namespace、cgroups等技術而設計的,而是定義了一套標準。namespace、cgroups符合這套標準,Docker引擎就可以運行起來,從而實現對容器的管理。此後如果有新的底層隔離技術也符合這套標準,docker也可以繼續運行。這樣的設計思想爲docker的實現全面化的跨平臺應用帶來了可能。

Docker

Docker是傳統的Client-Server架構,裝好了docker以後,也就同時裝好了Client端和Server端。Client端是Docker命令行工具,通過Client端可以發起創建、管理容器的指令至Server端進行處理。

Docker技術原理

Docker Daemon是通過libcontainer和lxc來完成容器管理操作的,Docker的三個重要組件execdriver、networkdriver、graphdriver。

execdriver:存儲了容器定義的配置信息,libcontainer拿到這些配置信息以後,將會調用底層的namespace和cgroups等技術來完成容器的創建和管理。

networkdriver:完成Docker容器網絡環境的配置,包括容器的IP地址、端口、防火牆策略、與主機的端口映射。

graphdriver:對容器鏡像的管理。