Namespace、Cgroups和Docker

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实现文件系统隔离,容器内的进程也和宿主机进程息息相关,唇亡齿寒

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值