1.Docker
Docker 是一组平台即服务产品,它使用操作系统级别的虚拟化技术在称为容器的包中交付软件。容器彼此隔离,并捆绑它们自己的软件、库和配置文件; 它们可以通过定义良好的通道彼此通信。因为所有容器都共享单个操作系统内核的服务,所以它们使用的资源比虚拟机少。
Docker 使用 Linux 内核的资源隔离特性(比如 cgroups 和内核 namespaces)和具有联合能力的文件系统(比如 OverlayFS)
容器是宿主机上的进程:
容器技术通过 Namespace 实现资源隔离
通过Cgroup实现资源控制
通过rootfs实现文件系统隔离
容器引擎用自身的特性来管理容器的生命周期
2.对比虚拟机
3.Cgroups
是内核提供的一种可以限制、记录、隔离进程组(process groups)所使用的物理资源的机制
1.限制进程组可以使用的资源数量(Resource limiting )
memory子系统可以为进程组设定一个memory使用上限,一旦进程组使用的内存达到限额再申请内存,就会触发OOM(out of memory)。
2.进程组的优先级控制(Prioritization )
可以使用cpu子系统为某个进程组分配特定cpu share。
3.记录进程组使用的资源数量(Accounting )
可以使用cpuacct子系统记录某个进程组使用的cpu时间
4.进程组隔离(Isolation)
使用ns子系统可以使不同的进程组使用不同的namespace,以达到隔离的目的,不同的进程组有各自的进程、网络、文件系统挂载空间。
5.进程组控制(Control)
使用freezer子系统可以将进程组挂起和恢复。
相关概念
Task(任务) 在 linux 系统中,内核本身的调度和管理并不对进程和线程进行区分,只是根据 clone 时传入的参数的不同来从概念上区分进程和线程。这里使用 task 来表示系统的一个进程或线程。
Cgroup(控制组) cgroups 中的资源控制以 cgroup 为单位实现。Cgroup 表示按某种资源控制标准划分而成的任务组,包含一个或多个子系统。一个任务可以加入某个 cgroup,也可以从某个 cgroup 迁移到另一个 cgroup。
Subsystem(子系统) cgroups 中的子系统就是一个资源调度控制器(又叫 controllers)。不同资源由不同的子系统控制,一个子系统就是一个资源控制器,子系统目前有下列几种:
devices 进程范围设备权限
cpuset 分配进程可使用的 CPU数和内存节点
cpu 控制CPU占有率
cpuacct 统计CPU使用情况,例如运行时间,throttled时间
memory 限制内存的使用上限
freezer 暂停 Cgroup 中的进程
net_cls 配合 tc(traffic controller)限制网络带宽
net_prio 设置进程的网络流量优先级
huge_tlb 限制 HugeTLB 的使用
perf_event 允许 Perf 工具基于 Cgroup 分组做性能检测
文件种类
Release_agent 删除分组时执行的命令,这个文件只存在于根分组
Notify_on_release 设置是否执行 release_agent。为 1 时执行
Tasks 属于分组的线程 TID 列表
Cgroup.procs 属于分组的进程 PID 列表。仅包括多线程进程的线程 leader 的 TID,这点与 tasks 不同
Cgroup.event_control 监视状态变化和分组删除事件的配置文件
4.Namespace
Linux 内核用来隔离内核资源的方式,不同namespace无法相互感知,是对全局系统资源的一种封装隔离
对Namespace的操作,主要是通过 clone、setns、unshare 这三个系统调用来完成。
clone 可以用来创建新的 Namespace
unshare 调用的进程会被放进新的 Namespace
setns 将进程放到已有的 Namespace
5.Docker run (物理级别)
1.系统调用clone创建新进程,namespace隔离内核资源,拥有自己的pid、mount、user、net、ipc、uts
2.将pid写入cgroup子系统,受 cgroup 子系统(cpu、memory、devices等)的控制
3.pivot_root 系统调用,使进程进入一个新的 rootfs,之后通过 exec系统调用在新的Namespace、Cgroup、rootfs 中执行 /bin/bash
6.总结
images加载启动时宿主机创建进程被Namespace资源隔离,进程fork为N个进程组,但从外界宏观上看是一个独立的“系统”,其实只是宿主机上的一组进程 ,这些进程被 Cgroups 限制、记录、隔离 ,通过rootfs实现文件系统隔离,容器内的进程也和宿主机进程息息相关,唇亡齿寒