【笔记】容器基础-隔离与限制

news2024/12/23 23:58:06

Docker 项目的核心原理:为待创建的用户进程

        1.启用 Linux Namespace 配置:修改进程视图

        2.设置指定的 Cgroups 参数:为进程设置资源限制

        3.切换进程的根目录(Change Root):

容器的隔离与限制

1.启用 Linux Namespace 配置

namespace 技术是用来修改进程视图的主要方法

1) linux 创建namespace的代码逻辑

以创建PID namespace 为例

namespace 是linux创建进程的一个可选参数,在 Linux 系统中创建进程的系统调用是 clone(),比如:

int pid = clone(main_function, stack_size, SIGCHLD, NULL); 

这个系统调用就会为我们创建一个新的进程,并且返回它的进程号 pid。

而当我们用 clone() 系统调用创建一个新进程时,就可以在参数中指定 CLONE_NEWPID 参数

int pid = clone(main_function, stack_size, CLONE_NEWPID | SIGCHLD, NULL); 

这时,新创建的这个进程将会“看到”一个全新的进程空间,在这个进程空间里,它的 PID 是 1,在宿主机真实的进程空间里,这个进程的 PID 还是真实的数值,比如 100。

2) linux namespace 介绍

  1. UTS Namespace:隔离主机名
  2. IPC Namespace:隔离进程间通信
  3. PID Namespace:隔离进程ID
  4. Mount Namespace:隔离进程看到的文件层级
  5. User Namespace:隔离用户组ID(举个例子:在宿主机上以一个非root用户运行创建一个User Namespace ,在UserNamespace里面映射成root用户)
  6. Network Namespace:用来隔离网络设备,IP地址端口等网络栈

Mount Namespace 跟其他 Namespace 的使用略有不同的地方:它对容器进程视图的改变,一定是伴随着挂载操作(mount)才能生效。 

3) namespace技术缺陷

  • 容器只是运行在宿主机上的一种特殊的进程,那么多个容器之间使用的就还是同一个宿主机的操作系统内核。这意味着,如果要在 Windows 宿主机上运行 Linux 容器,或者在低版本的 Linux 宿主机上运行高版本的 Linux 容器,都是行不通的。
  • 在 Linux 内核中,有很多资源和对象是不能被 Namespace 化的,最典型的例子就是:时间。

2.设置指定的 Cgroups 参数

cgroup全称是control groups。control groups:控制组,被整合在了linux内核当中,把进程(tasks)放到组里面,对组设置权限,对进程进行控制(它最主要的作用,就是限制一个进程组能够使用的资源上限,包括 CPU、内存、磁盘、网络带宽等等)。可以理解为用户和组的概念,用户会继承它所在组的权限。

cgroup 提供了将进程组织成控制组的能力,然后通过使用 资源控制子系统(cgroup_subsys) 来对控制组进行资源使用的控制,cgroup 支持的 资源控制子系统 有以下几种:

cpu子系统:限制 CPU 的使用。

memory子系统:限制内存使用。

cpuset子系统:可以为进程组分配单独的 CPU 或者内存节点。

cpuacct子系统:统计CPU group的使用情况。

blkio子系统:限制I/O,一般用于磁盘。

devices子系统:限制进程使用的设备。

freezer子系统:可以挂起和恢复进程组。

net_cls子系统:可以标记进程组的网络数据包,使用 tc 模块(traffic control)对数据包进行控制。

cgroup 通过把进程组织成 控制组,然后通过 资源控制子系统 来对 控制组 进行资源使用的限制,所以 cgroup 的分析可以分成两部分:cgroup框架 和 资源控制子系统。 

cgroup 控制组

控制组 说白了就是一组进程(进程组),cgroup 就是用来限制 控制组 的资源使用。为了能够方便地向一个 控制组 添加或者移除进程(在命令行也能操作),内核使用了 虚拟文件系统 来进行管理 控制组。

我们可以把一个 控制组 当成是一个目录,由于目录有层级关系,所以 控制组 也有层级关系,如下图所示:

cgroup CPU限制

在cgroup里面,跟CPU相关的子系统有cpusets、cpuacct和cpu。

cpuset主要用于设置CPU的亲和性,可以限制cgroup中的进程只能在指定的CPU上运行,或者不能在指定的CPU上运行

cpuacct包含当前cgroup所使用的CPU的统计信息

cgroup Memory 限制

在上图中,我们创建了 2 个 cgroup(每个 cgroup 有 4 个进程),并且限制它们各自最多只能使用 2GB 的内存。如果使用超过 2GB 的内存,那么将会触发 OOM(Out Of Memory) 错误。

Cgroups缺陷

Cgroups 对资源的限制能力有很多不完善的地方,比如 /proc 文件系统的问题。

Linux 下的 /proc 目录存储的是记录当前内核运行状态的一系列特殊文件,用户可以通过访问这些文件,查看系统以及当前正在运行的进程的信息,比如 CPU 使用情况、内存占用率等,这些文件也是 top 指令查看系统信息的主要数据来源。

但是,你如果在容器里执行 top 指令,就会发现,它显示的信息居然是宿主机的 CPU 和内存数据,而不是当前容器的数据。

造成这个问题的原因就是,/proc 文件系统并不知道用户通过 Cgroups 给这个容器做了什么样的资源限制,即:/proc 文件系统不了解 Cgroups 限制的存在。

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

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

相关文章

MySQL性能优化四 MySQL索引优化实战一

一 查询案例 示例表 CREATE TABLE employees (id int(11) NOT NULL AUTO_INCREMENT,name varchar(24) NOT NULL DEFAULT COMMENT 姓名,age int(11) NOT NULL DEFAULT 0 COMMENT 年龄,position varchar(20) NOT NULL DEFAULT COMMENT 职位,hire_time timestamp NOT NULL DEF…

王凤英,能治好何小鹏的技术“自恋”吗?

1月30日,小鹏官宣一手打造长城汽车(601633)SUV战略转型的前二号人物——王凤英,加盟小鹏出任CEO一职。 虽然这则消息已风传多日,但正式公布的一刻还是在汽车圈内炸开了锅,主要原因有两点:一是王凤英刚刚加入小鹏就被委…

2-1JVM内存分析

一、java类的生命周期 1.加载(把class文件的数据加载到jvm内存的元空间) 2.连接验证 验证语法是否正确准备 给静态变量做内存分配和默认值分配识别 解析常量池 3.初始化静态变量赋初始值静态代码块执行 4.使用(被jvm使用) 5.卸载(如果在程序中没有再使用到这个类,这个类会被从…

跳槽前恶补面试题,成功上岸华为,拿到33k的测开offer

不知不觉间,时间过得真快啊。作为一名程序员,应该都清楚每年的3、4月份和9、10月份都是跳槽的黄金季,各大企业在这段时间会大量招聘人才。在这段时间里,有人欢喜有人悲。想必各位在跳槽前都会做好充足的准备,同样做足了…

还是你厉害啊,用 Python 下载高清视频真速度

今天我们来进行 Python 爬虫实战,学以致用嘛,这也是咱们不断学习的动力! 我们要爬取的网站是YY直播,不知道有多少朋友知道,反正小编以前是不知道的,真的不知道~ 那么为什么我们选择这个网站呢&#xff0…

【5.1】Nacos注册中心--认识和安装Nacos/快速入门

【5.1】Nacos注册中心--认识和安装Nacos/快速入门1 认识Nacos2 安装Nacos3 服务注册到Nacos4 总结1 认识Nacos Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件。相比Eureka功能更加丰富,在国内受欢迎程度较高。 2 安装Nacos 建议大家下载Typora之…

Grafana 系列文章(五):Grafana Explore 查询管理

👉️URL: https://grafana.com/docs/grafana/latest/explore/query-management/ 📝Description: Explore 中的查询管理 为了帮助调试查询,Explore 允许你调查查询请求和响应,以及查询统计数据,... Explore 中的查询管理…

CTFshow_萌新--密码篇

一、萌新认证进群大喊萌新码,即可获得。。。。。二、萌新密码1密文:53316C6B5A6A42684D3256695A44566A4E47526A4D5459774C5556375A6D49324D32566C4D4449354F4749345A6A526B4F48303D并给上了一下工具包。①密文首先Hex解码得到串:S1lkZjBhM2Vi…

项目管理工具——Maven

目录儿一、Maven简介二、下载与安装环境配置三、Maven基础概念3.1 仓库3.2 坐标在中央仓库网获取依赖坐标3.3 本地仓库配置3.4 远程仓库配置一、Maven简介 Maven是用java语言编写的。Maven的本质是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(PO…

商城项目的表设计

零、前言 1、优惠卷设计 电商项目中的优惠券系统这样设计,同事直呼 666 ! 2、SPU和SKU的定义及他们之间的关系 SPU全称Standard Product Unit,即标准化产品单元。 简单理解就是某一种产品。 SKU全称Stock Keeping Unit,即库存量…

PHP多进程(三) 理解多进程

本篇是一个过渡篇 ( 重在理解多进程 以及进程执行过程和进程执行后的数据 ) 废话不多说直接上代码 运行下面代码前 可以先想想有几个进程以及$count 是多少? <?php// 开始多进程 $count 10; for ($i0;$i<2;$i){epd(我是循环记数值.$i);$pid pcntl_fork(); // fork…

使用DBeaver 编辑链接达梦数据库

1、点击 “数据库”&#xff0c;选择“驱动管理器” 2、选择“新建” 3、 设置驱动 驱动名称&#xff1a;自定义 这里命名为“DM” 类名&#xff1a; dm.jdbc.driver.DmDriver URL模板&#xff1a;jdbc:dm://{host}:{port} 或jdbc:dm://{host}[:{port}]/[{database}] 默认端…

根据java反射-手写springIoC

我们都知道&#xff0c;Spring框架的IOC是基于Java反射机制实现的&#xff0c;下面我们先回顾一下java反射。 回顾Java反射 Java反射机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能…

ResNet简单介绍+Pytroch代码实现

文章目录一、背景介绍二、ResNet网络结构1.ResNet34结构示意图2.不同层数的ResNet采用的Block结构。3.不同层数的ResNet网络结构示意图4.实验结果三、Pytroch代码1.代码简单介绍2. 常见ResNet网络代码汇总四、参考文献一、背景介绍 问题&#xff1a; 当网络层数越来越深时&…

Vulkan 编程指南记录

1 创建Vulkan instance 利用CreateInfo结构体指定硬件驱动需要使用的程序信息&#xff0c;这些信息可能会被作为驱动程序的优化依据指定程序需要使用的全局扩展。比如和窗口系统交互的扩展&#xff08;通过glfw库的接口获取&#xff09;。可以通过vkEnumerateInstanceExtensio…

一篇文章全知全能SpringBoot Bean的生命周期

系列文章&#xff1a;https://gamwatcher.blog.csdn.net/article/details/124603278这篇文章也是计划了蛮久的了&#xff0c;一直没写&#xff0c;正所谓大道行思&#xff0c;取则行远&#xff0c;总结也是学习的一种方式。&#x1f648;记得看目录哦1、关于spring1.1 什么是sp…

Spring Security在前端后端分离项目中的使用

Spring Security 是 Spring 家族中的一个安全管理框架&#xff0c;可以和Spring Boot项目很方便的集成。Spring Security框架的两大核心功能&#xff1a;认证和授权 认证&#xff1a; 验证当前访问系统的是不是本系统的用户&#xff0c;并且要确认具体是哪个用户。简单的理解就…

全网最详细的mybatis plus 条件构造器queryWrapper学习,比如and(),eq(),or(),like(),between(),orderByAsc()等方法以及分页操作

文章目录1. 引言2. 结构关系3. 环境配置3.1 引入jar包3.2 创建数据源3.2 创建User实体类3.4 创建UserMapper类3.5 创建UserService类4. 操作演示5. 注意事项1. 引言 mybatis大家都有使用过&#xff0c;既面向对象又灵活可配。不友好的地方是&#xff0c;会随着使用出现大量xml…

C++之缺省参数以及C++的输入输出

文章目录前言一、缺省参数的定义二、缺省参数的分类1.全缺省参数2.半缺省参数三、缺省参数的注意事项1. 半缺省参数必须从右往左依次来给出&#xff0c;不能间接给缺省值2. 缺省参数不能在函数声明和定义中同时出现3. 缺省值必须是常量或者全局变量4. C语言不支持四、C的输入&a…