Docker实战07|Docker增加容器资源限制

news2024/11/19 7:45:20

上一篇文章中,讲解了Docker run的具体流程以及Docker是如何改变PID为1的底层原理。

具体文章可见《Docker就应该这么学-06》

有需要的小伙伴可以回顾一下。

接下来本文会详细介绍一下Docker 是如何增加容器的资源限制

增加容器的资源限制

获取代码

git clone https://gitee.com/mjreams/docker.git

上一节中,已经可以通过命令行 docker run -ti的方式创建并启动容器。这一节,将通过cgroup对容器的资源进行控制。

# 这一节中,将实现通过以下命令的方式控制容器的内存和CPU配置。
docker run -ti -m I00m -cpuset 1 -cpushare 512 /bin/sh

定义Cgroups数据结构

前几篇中,对Cgroups包含的3个概念进行了介绍,这里做如下简单回顾。

  • • cgroup hierarchy中的节点,用于管理进程和subsystem的控制关系。

  • • subsystem作用于hierarchy上的cgroup节点,并控制节点中进程的资源占用。

  • • hierarchy将cgroup通过树状结构串起来,并通过虚拟文件系统的方式暴露给用户。

根据上面3个概念的关系,先创建出如下的数据结构。

cgroups/subsystems/subsystem.go

图片

上面定义了subsystem的模型,下面以memory的subsystem为例介绍 一 下要怎么实现 subsystem 的操作。

cgroups/subsystems/memory.go

图片

图片

上面以memory的subsystem为例,介绍了如何实现subsystem的cgroup资源限制。其中,GetCgroupPath函数是找到对应subsystem挂载的hierarchy相对路径对应的cgroup在虚拟文件系统中的路径,然后通过这个目录的读写去操作cgroup。那么,是如何找到挂载了subsystem的hierarchy的挂载目录的呢?先来熟悉下/proc/{pid}/mountinfo文件,如下。

图片

通过/proc/self/mountinfo,可以找出与当前进程相关的mount信息。在前文中,我们讲过Cgroups的hierarchy的虚拟文件系统是通过cgroup类型文件系统的mount挂载上去的,option中加上subsystem,代表挂载的subsystem类型,这样就可以在mountinfo中找到对应的subsystem的挂载目录了,比如memory。

30 27 0:24 I /sys/fs/cgroup/rnernory rw , nosuid, nodev , noexec , relatirne shared : l3 - cgroup cgroup rw , rnernory

通过最后的option是rw,memory,可以看出这一条挂载的subsystem是memory,那么在/sys/fs/cgroup/memory中创建文件夹对应创建的cgroup,就可以用来做内存的限制,实现如下。

cgroups/subsystems/utils.go

图片

图片

最后,需要把这些不同subsystem中的cgroup管理起来,并与容器建立关系。

cgroups/cgroup_manager.go

图片

通过 CgroupManager,将资源限制的配置,以及将进程移动到 cgroup 中的操作交给各个 subsystem 去处理。

如下,用一张流程图来展示下上各个组件之间的调用关系。

图片

CgroupManager 在配置容器资源限制时,首先会初始化 Subsystem 的实例, 然后遍历调用 Subsystem 实例的 Set 方法,创建和配置不同 Subsystem 挂载的 hierarchy 中的 cgroup,最后再通过调用 Subsystem 实例将容器的进程分别加入到那些 cgroup 中,实现容器的 资源限制 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1384656.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python之循环判断语句

一、if判断语句 1. if...else if 条件: 满足条件时要做的事情1 满足条件时要做的事情2 ...... else: 不满足条件时要做的事情1 不满足条件时要做的事情2 ...... # -*- coding:utf-8 -*- age input("请输入年龄:") age int(age) if age > 18:print("已经成…

C# 导出EXCEL 和 导入

使用winfrom简单做个界面 选择导出路径 XLSX起名字 打开导出是XLSX文件 // 创建Excel应用程序对象Excel.Application excelApp new Excel.Application();excelApp.Visible false;// 创建工作簿Excel.Workbook workbook excelApp.Workbooks.Add(Type.Missing);Excel.Works…

【PlantUML】- 时序图

写在前面 本篇文章,我们来介绍一下PlantUML的时序图。这个相对类图来讲,比较简单,也不需要布局。读完文章,相信你就能实际操作了。 目录 写在前面一、基本概念二、具体步骤1.环境说明2.元素3.语法4.示例 三、参考资料写在后面系列…

DNS分离解析

一、介绍 分离解析的域名服务器实际也是主域名服务器,这里主要是指根据不同的客户端提供不同的域名解析记录。比如来自内网和外网的不同网段地址区域的客户机请求解析同一域名时,为其提供不同的解析结果,得到不同的IP地址。 DNS的分离…

基于Java SSM框架实现企业车辆管理系统项目【项目源码】

基于java的SSM框架实现企业车辆管理系统演示 JSP技术 JSP技术本身是一种脚本语言,但它的功能是十分强大的,因为它可以使用所有的JAVA类。当它与JavaBeans 类进行结合时,它可以使显示逻辑和内容分开,这就极大的方便了运动员的需求…

Transformer如何工作

Transformer如何工作 Transformer工作可以分为两个阶段:Inference(推理)和Training(训练) ​ ​​​ ‍ ‍

尼科彻斯定理----C语言

大家好我是Beilef许久未见了,小弟学校考试刚结束。这个过程懂的都懂。痛------ 文章目录 目录 文章目录 前言(一不好懂可以直接跳到二) 一、尼科彻斯定理是什么? 二、尼科彻斯定理解析 这是ai的回答 尼科彻斯定理(Nikomačs theor…

JS 作用域和预解析

作用域 通常来说,一段程序代码中所用到的名字并不总是有效和可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域。作用域的使用提高了程序逻辑的局部性,增强了程序的可靠性,减少了名字冲突。 作用域分为全局作用域和局…

PHP反序列化总结4--原生类总结

原生类的简要介绍以及原生类和反序列化的关系 PHP 原生类指的是 PHP 内置的类,它们可以直接在 PHP 代码中使用且无需安装或导入任何库,相当于代码中的内置方法例如echo ,print等等可以直接调用,但是原生类就是可以就直接php中直接…

主键(设置/删除方法,复合主键),唯一键,主键和唯一键的应用差异,自增长字段(如何实现,查看上次的值),外键(引入,外键约束)

目录 主键(primary key) 介绍 作用 设置主键 建表前 建表后 复合主键 介绍 示例 删除主键 唯一键(unique) 介绍 意义 示例 建表 主键 唯一键 插入数据示例 主键和唯一键的应用差异 主键 唯一键 索引 auto_increment 介绍 示例 自动插入 手动插入 …

达梦数据实时同步软件DMHS介绍和原理

1、产品介绍 达梦数据实时同步软件(以下简称 DMHS)是支持异构环境的高性能、高可靠、高可扩展数据库实时同步复制系统。该产品采用基于日志的结构化数据复制技术,不依赖主机上源数据库的触发器或者规则,对主机源数据库系统几乎无影…

系列六、Spring Security中的认证 授权 角色继承

一、Spring Security中的认证 & 授权 & 角色继承 1.1、概述 关于Spring Security中的授权,请参考【系列一、认证 & 授权】,这里不再赘述。 1.2、资源类 /*** Author : 一叶浮萍归大海* Date: 2024/1/11 20:58* Description: 测试资源*/ Re…

案例120:基于微信小程序的校友林设计与实现

文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序…

蓝桥杯省赛无忧 STL 课件18 总结

3226 宝藏排序 II 1624 小蓝吃糖果 2490 小蓝的括号串1 1531快递分拣

ubuntu 2022.04 安装vcs2018和verdi2018

主要参考网站朋友们的作业。 安装时参考: ubuntu18.04安装vcs、verdi2018_ubuntu安装vcs-CSDN博客https://blog.csdn.net/qq_24287711/article/details/130017583 编译时参考: 【ASIC】VCS报Error-[VCS_COM_UNE] Cannot find VCS compiler解决方法_e…

远程登陆利器 ssh

文章目录 远程登陆利器 ssh登陆远程服务器指定用户名多数情况的登陆方式查看服务器的时间指定端口更多信息 远程登陆利器 ssh ssh命令是openssh套件中的客户端连接工具,使用加密协议实现安全的远程登录服务器,实现对服务器的远程管理。 官方定义为&…

响应式编程初探-自定义实现Reactive Streams规范

最近在学响应式编程,这里先记录下,响应式编程的一些基础内容 1.名词解释 Reactive Streams、Reactor、WebFlux以及响应式编程之间存在密切的关系,它们共同构成了在Java生态系统中处理异步和响应式编程的一系列工具和框架。 Reactive Streams…

原生js实现拖拽效果

<!DOCTYPE html> <html> <head> <style> #mydiv { width: 200px; height: 200px; background-color: red; position: absolute; cursor: move; } </style> | </head> <body> <div id"mydiv">拖拽我…

苏州倍丰智能新型雾化粉末技术量产成功!金属3D打印全产业链更进一步

苏州倍丰智能深耕金属3D打印技术领域&#xff0c;以金属3D打印全产业链为目标&#xff0c;围绕金属3D打印设备&#xff0c;涵盖包括金属粉末前后处理设备、金属粉末原材料制备、先进工艺研发等多个领域&#xff0c;完成了一整条自上而下的金属3D打印全产业链。 近日&#xff0c…

java大数据hadoop2.9.2 Java编写Hadoop分析平均成绩

1、准备文件&#xff0c;例如score.txt&#xff0c;内容如下&#xff1a; zs k1 88 ls k1 98 ww k1 78 zs k2 88 ls k2 98 ww k2 78 zs k3 88 ls k3 98 ww k3 78 2、创建maven项目 <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common --><d…