Docker 核心原理 cgroup

Docker 核心原理 cgroup

1. Cgroup

​ Docker 通过 cgroup 来控制容器使用的 资源配额,包括 CPU、内存、 磁盘等三个大的方面,基本覆盖了常见的资源配额和使用量的控制。

​ Cgroup( controller group),是Linux内核中提供的一种可以限制、记录、隔离进程组所使用的物理资源,例如CPU、Memory、磁盘IO等等)的机制,被LXC、Docker 等多种项目用于实现进程资源控制。

​ Cgroup 简单的来理解,就是可以将cpu、内存、磁盘I/O进行资源分配,限制使用的 大小、以及频率


2. Cgroup 功能实现

​ 1) 资源限制: 对进程组使用的资源总额进行限制

  • Memory 子系统可以为进程组设定一个 Memory 使用上限,一旦进程组使用的内存达到限定的额度再次申请内存。

​ 2) 优先级分配: 通过使用权重值分配CPU 的时间和硬盘的I/O大小

  • 可以使用CPU子系统为某个进程组分配特定 CPU share(优先级)

​ 3) 资源统计: 记录容器对硬件的使用,时间用量等等

  • 可以使用cpuacct 子系统记录某个进程组使用的 cpu 时间等等

​ 4) 进程控制: 对进程挂起、恢复等操作

  • 使用freezer 子系统可以将进程组挂起和恢复

​ 5) 进程组隔离: 使不同的进程组使用不同的Namespace ,打到隔离的目的

  • 不同的进程组有各自的进程、网络、文件系统挂载空间。

  • 查看cgroup 挂载的子系统

[root@localhost ~]# ll /sys/fs/cgroup/
total 0
drwxr-xr-x. 5 root root  0 Mar 25 04:59 blkio
lrwxrwxrwx. 1 root root 11 Mar 25 04:59 cpu -> cpu,cpuacct
lrwxrwxrwx. 1 root root 11 Mar 25 04:59 cpuacct -> cpu,cpuacct
drwxr-xr-x. 5 root root  0 Mar 25 04:59 cpu,cpuacct
drwxr-xr-x. 3 root root  0 Mar 25 04:59 cpuset
drwxr-xr-x. 5 root root  0 Mar 25 04:59 devices
drwxr-xr-x. 3 root root  0 Mar 25 04:59 freezer
drwxr-xr-x. 3 root root  0 Mar 25 04:59 hugetlb
drwxr-xr-x. 5 root root  0 Mar 25 04:59 memory
lrwxrwxrwx. 1 root root 16 Mar 25 04:59 net_cls -> net_cls,net_prio
drwxr-xr-x. 3 root root  0 Mar 25 04:59 net_cls,net_prio
lrwxrwxrwx. 1 root root 16 Mar 25 04:59 net_prio -> net_cls,net_prio
drwxr-xr-x. 3 root root  0 Mar 25 04:59 perf_event
drwxr-xr-x. 5 root root  0 Mar 25 04:59 pids
drwxr-xr-x. 5 root root  0 Mar 25 04:59 systemd


3. Cgroup 子系统

​ Cgroup 将任意进程进行分组化管理的linux内核功能,cgroup 本身就是提供将进程进行分组化管理的功能和接口的基础结构,I/O或内存的分配控制等具体的资源管理功能是通过这个功能来实现的,这些具体的资源管理功能被称为一个Cgroup子系统。

​ blkio – 设置限制每个块设备(磁盘、U盘)的输入输出的控制。

​ CPU – 使用调度程序为Cgroup任务提供CPU 的访问

​ Cpuacct – 产生Cgroup 任务的CPU资源报告

​ cpuset – 如果,是多核心的CPU,这个子系统会为cgroup 任务分配单独的CPU和内存

​ devices – 允许 或拒绝 cgroup 任务对设备的访问

​ freezer – 暂停和恢复cgroup 的内存限制以及产生内存资源报告

​ memory – 设置每个Cgroup的内存限制以及生产内存资源的报告

​ net_cls – 标记了每个网络包,供cgroup 方便使用

​ ns – 命名空间子系统

​ perf_event – 增加了对每个 group 的检测跟踪能力,可以检测属于某个特定的group的所有线程以及运行在特定CPU上的 线程


4. 相关概念

  • task(任务):在Cgroup是一个要控制的系统进程
  • cgroup(控制族群): 控制组群就是按照某一种标准划分的进程。Cgroups 中的资源控制都是以控制族群为单位实现,可以有多个 cgroup 组,可以限制不同的 内容,组名不能相同
  • subsystem(子系统): 子系统限制具体的内容,cgroup 组中的具体事项, 子系统就是资源控制器
  • hierarchy(层级): 层级树,由一堆cgroup 构成,包含了多个 cgroup的叫层级树, 用于控制cgroup

查看cgroup 支持的所有的子系统

lssubsys -a cgroup
cpuset					// 给task 分配独立的CPU
cpu,cpuacct				// cpu(控制程序对CPU使用), cpuacct(生成CPU使用情况报告)
memory					// 内存使用量进行限制,并且生成报告
devices					// 开启关闭设备的访问,不仅仅是块设备
freezer					//
### Docker 的基本工作原理及实现机制 Docker 是一种基于容器技术的开源平台,其核心目标是提供一种轻量级的方式,在不同的环境中部署应用程序并保持一致性[^1]。以下是关于 Docker 工作原理及其内部实现机制的具体说明: #### 1. **Docker 架构** Docker 使用 Client-Server 结构来构建整个系统。其中,Docker 守护进程(`dockerd`)运行在主机上,而客户端工具(如 `docker` CLI)则通过 Socket 连接与守护进程通信[^3]。 #### 2. **主要组件的功能划分** - **Docker 镜像 (Image)** Docker 镜像是只读模板,包含了启动容器所需的文件系统以及配置信息。这些镜像可以被分层存储,从而提高资源利用率和传输效率。 - **Docker 容器 (Container)** 容器是由镜像实例化的运行环境。每个容器拥有独立的操作空间,并与其他容器相互隔离。这种隔离性由 Linux 内核中的命名空间(Namespaces)和控制组(Cgroups)技术支持[^2]。 - **Docker 引擎 (Engine)** Docker 引擎作为系统的中枢部分,承担着管理镜像、创建/销毁容器、分配网络资源等功能。它还提供了 RESTful API 接口以便外部程序调用操作容器生命周期的方法。 #### 3. **关键技术支持** 为了实现上述功能,Docker 利用了多种底层操作系统特性: - **Linux 命名空间 (Namespace)** 提供了必要的隔离能力,使得不同容器之间互不影响。具体来说,PID namespace 实现进程分离;Network namespace 负责网络栈隔绝等[^5]。 - **控制组 (Control Groups, Cgroup)** 主要用于限制、记录和隔离一组进程所使用的物理资源(CPU、内存、磁盘 I/O 等)。这有助于保障单个容器不会占用过多宿主机资源而导致其他服务受影响。 - **联合挂载 (Union File System)** 支撑多层文件系统的高效管理和共享。每一层都可以单独修改而不影响下一层的内容,最终形成完整的根文件系统视图给到容器使用。 #### 4. **典型流程解析——从镜像到运行容器** 当用户执行命令如 `docker run ubuntu bash` 后会发生如下过程: 1. 如果本地不存在指定名称的镜像,则会尝试从默认公共仓库拉取最新版本; 2. 加载该镜像至内存中准备初始化一个新的容器实例; 3. 设置好相应的参数之后正式开启新进程进入交互模式或者后台静默执行状态; 4. 整个工作期间始终依赖于前面提到的各种基础设施完成实际任务调度和服务供给[^4]。 ```bash # 创建并启动一个基于Ubuntu的基础容器 docker run -it --name my_container ubuntu /bin/bash ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值