容器
容器=cgroup+namespace+rootfs+容器引擎(用戶態工具)
- Cgroup:資源控制。
- Namespace:訪問隔離。
- rootfs:文件系統隔離。
- 容器引擎:生命週期控制。
容器兩個核心技術
NameSpace
Namespace又稱爲命名空間(也可翻譯爲名字空間),它是將內核的全局資源做封裝,使得每個Namespace都有一份獨立的資源,因此不同的進程在各自的Namespace內對同一種資源的使用不會互相干擾。
- IPC:隔離System V IPC和POSIX消息隊列。
- Network:隔離網絡資源。
- Mount:隔離文件系統掛載點。
- PID:隔離進程ID。
- UTS:隔離主機名和域名。
- User:隔離用戶ID和組ID。
Cgroup
Cgroup是control group的簡寫,屬於Linux內核提供的一個特性,用於限制和隔離一組進程對系統資源的使用,也就是做資源QoS,這些資源主要包括CPU、內存、block I/O和網絡帶寬。
- devices:設備權限控制。
- cpuset:分配指定的CPU和內存節點。
- cpu:控制CPU佔用率。
- cpuacct:統計CPU使用情況。
- memory:限制內存的使用上限。
- freezer:凍結(暫停)Cgroup中的進程。
- net_cls:配合tc(traffic controller)限制網絡帶寬。
- net_prio:設置進程的網絡流量優先級。
- huge_tlb:限制HugeTLB的使用。
- perf_event:允許Perf工具基於Cgroup分組做性能監測。
Docker五種網絡模式
None
不爲容器配置任何網絡功能。
Container
與另一個運行中的容器共享NetworkNamespace,共享相同的網絡視圖。
Host
與主機共享Root Network Namespace,容器有完整的權限可以操縱主機的協議棧、路由表和防火牆等,所以被認爲是不安全的。
Bridge
Docker設計的NAT網絡模型。
Docker網絡的初始化動作包括:創建docker0網橋、爲docker0網橋新建子網及路由、創建相應的iptables規則等。
在橋接模式下,Docker容器與Internet的通信,以及不同容器之間的通信,都是通過iptables規則控制的。
Overlay
Docker原生的跨主機多子網模型。
overlay網絡模型比較複雜,底層需要類似consul或etcd的KV存儲系統進行消息同步,核心是通過Linux網橋與vxlan隧道實現跨主機劃分子網。