[Docker#2] 发展历史 | Namespace环境隔离 | Cgroup资源控制

目录

1.发展历史

Jail 时代

云时代

云原生时代

技术标准的确立

虚拟机 vs Docker

2. 容器化技术

2.1 Namespace

命令详解

1. dd 命令

2. mkfs 命令

3. df 命令

4. mount 命令

5. unshare 命令

实战

进程隔离

文件隔离

2.2 CGroup

相关命令

2.1 pidstat

2.2 stress

3. CGroup 控制

3.1 查看 CGroup 支持的资源控制

3.2 内存控制

3.3 CPU 控制

4. 总结

总结


1.发展历史

容器技术是现今计算技术的重要组成部分,其发展历程可以追溯到很早的计算机系统提供的进程隔离工具。以下是容器技术的发展历程,其中涵盖了从早期的进程隔离技术到现代云计算和云原生的演变:

Jail 时代

  • 1979 年 - chroot 的发明: 在贝尔实验室开发的第 7 版 Unix 中引入了 chroot 系统调用。它通过将进程的根目录更改为文件系统中的新位置,实现文件系统的隔离,这一技术被称为 Chroot Jail。可以说,这奠定了容器技术的基础。
  • 2000 年 - FreeBSD Jail: 为了实现安全性和易于管理,FreeBSD Jail 在原有的 chroot 功能上增加了独立的进程和网络空间,从而为托管环境中的客户服务提供了更好的资源隔离。
  • 2001 年 - Linux VServer: 类似于 FreeBSD Jail,Linux VServer 将文件系统、网络地址、内存等资源进行分区,实现了更为复杂的资源隔离。
  • 2004 年 - Solaris Containers: 这一技术结合了系统资源控制和区域隔离,并增加了快照和克隆功能,为后来的云计算技术发展铺平了道路。

云时代

  • 2006 年 - 云计算概念的提出: Google 提出了当数据量达到现在的1000倍甚至10000倍时,该如何处理的问题。云计算的概念引领了新的资源管理和分配需求。
  • 2006 年 - Process Containers 和 cgroups: 由 Google 推出,用于限制、统计和隔离一组进程的资源使用。一年后,它被更名为"Control Groups (cgroups)",并最终并入 Linux 内核。
  • 2008 年 - LXC 和 GAE 的推出: LXC 是第一个完整的 Linux 容器管理器实现。同时,Google 推出了 Google App Engine,将开发平台作为一种服务提供。

云原生时代

  • 2011 年 - Warden 和 Kubernetes 的出现: CloudFoundry 推出 Warden,解决多主机环境下的容器管理问题。
  • 2013 年 - Docker 的问世与风靡: Docker 作为一个工具和生态系统,将应用程序及其依赖打包到可以跨平台运行的容器中。Docker 迅速成为业界标准,带动了容器生态的繁荣。
  • 2014 年 - Kubernetes 的崛起: Google 发布了 Kubernetes,支持对容器的编排和管理。随着各大公司加入,Kubernetes 成为了云原生架构的重要部分。
  • 2015-2016 年 - OCI 和 CNCF 的成立: 为了解决行业标准问题,Docker 和其他公司成立 OCI,以制定容器和镜像的标准。与此同时,CNCF 的成立,推动了云原生计算的发展。

技术标准的确立

  • 2016 年 - CRI 标准的发布: 为了将 Kubernetes 和特定的容器运行时解耦,Google 和红帽主导发布 CRI 接口标准。
  • 2017 年 - containerd 的发展: 随着 containerd 成为标准的 CRI,实现了容器运行时的标准化,各大厂商纷纷采用 containerd 和 Kubernetes 作为云原生解决方案的基础。

容器技术自其诞生以来,通过文件系统和进程隔离逐步发展到今天的云原生生态系统。在这一过程中,技术创新带来了资源的高效利用和管理的便捷性。尤其是随着 Kubernetes 的普及和标准化,容器已成为现代应用开发和部署的核心技术之一,并对云计算产业的发展产生了深远影响。

虚拟机 vs Docker

虚拟机

虚拟机技术在硬件层之上,在操作系统层就开始进行隔离。虚拟机通过伪造一个硬件的抽象接口,把操作系统嫁接到硬件上。

容器

容器也是一种虚拟化的实现技术,它在操作系统之上进行环境隔离,每个容器可以有自己的一套工具和库,但是它们共享操作系统的内核!


docker 不需要虚拟内核,所以启动可以更快,相当于 windows 的开机时间省去了

2. 容器化技术

容器化技术,目前最流行的实现方案就是Docker。容器化技术的核心在于实现各种资源的隔离

对于Linux而言,主要依赖于namespace和CGroup技术。

2.1 Namespace

  • 作用:实现进程、文件系统、用户等资源的隔离。
  • 具体实现:通过将一个或多个进程指定在同一个namespace中,使得这些进程只能看到与自己相关的资源。

命令详解

1. dd 命令

dd 命令用于读取、转换并输出数据,可以从标准输入或文件中读取数据,根据指定的格式转换数据,再输出到文件、设备或标准输出。

语法

dd OPTION

参数

参数

描述

if=文件名

输入文件名,默认为标准输入。即指定源文件。

of=文件名

输出文件名,默认为标准输出。即指定目的文件。

bs=bytes

同时设置读入/输出的块大小为 bytes 个字节。

count=blocks

仅拷贝 blocks 个块,块大小等于 ibs 指定的字节数。

2. mkfs 命令

mkfs 命令用于在设备上创建 Linux 文件系统,俗称格式化。

语法

mkfs [-V] [-t fstype] [fs-options] filesys [blocks]

参数

参数

描述

-t fstype

指定要建立何种文件系统;如 ext3,ext4。

filesys

指定要创建的文件系统对应的设备文件名。

blocks

指定文件系统的磁盘块数。

-V

详细显示模式。

fs-options

传递给具体文件系统的参数。

示例

3. df 命令

df 命令用于显示目前在 Linux 系统上的文件系统磁盘使用情况统计。

语法

df [OPTION]... [FILE]...

常见参数

参数

描述

-a, --all

包含所有的具有 0 Blocks 的文件系统。

-h, --human-readable

使用人类可读的格式。

-H, --si

很像 -h,但是用 1000 为单位而不是用 1024。

-t, --type=TYPE

限制列出文件系统的类型。

-T, --print-type

显示文件系统的形式。

4. mount 命令

mount 命令用于加载文件系统到指定的加载点。

语法

mount [-l] 
mount [-t vfstype] [-o options] device dir

常见参数

参数

描述

-l

显示已加载的文件系统列表。

-t vfstype

指定加载文件系统类型,支持常见的 ext3, ext4, iso9660, tmpfs, xfs 等。

-o options

主要用来描述设备或档案的挂接方式。

loop

用来把一个文件当成硬盘分区挂接上系统。

ro

采用只读方式挂接设备。

rw

采用读写方式挂接设备。

device

要挂接(mount)的设备。

dir

挂载点的目录。

5. unshare 命令

unshare 命令主要用于使用与父程序不共享的名称空间运行程序。

语法

unshare [options] program [arguments]

常用参数

参数

描述

-i, --ipc

不共享 IPC 空间。

-m, --mount

不共享 Mount 空间。

-n, --net

不共享 Net 空间。

-p, --pid

不共享 PID 空间。

-u, --uts

不共享 UTS 空间。

-U, --user

不共享用户。

-V, --version

版本查看。

--fork

执行 unshare 的进程 fork 一个新的子进程,在子进程中执行 unshare 传入的参数。

--mount-proc

执行子进程前,将 proc 优先挂载过去。

ushare这个命令,本身也是一个进程,是在宿主机环境运行的

⭕使用

为了不影响后续实验,要记得 exit 哦~

实战

进程隔离

unshare命令专门提供了一个参数--mount-proc,在新的namespace挂载一个独立的/proc目录,方便进行进程的监控。

可以看到,创建了新的namespace后,ps -aux只能查到两个进程,一个是bash,一个是grep。这就将namespace内部的进程与宿主机的进程隔离开了。

文件隔离

挂载文件系统

懒卸载挂载点

总结

  • 这些命令在 Linux 系统管理和维护中非常常用,可以帮助管理和操作文件系统、磁盘和进程。
  • ddunshare 命令,在数据备份和容器化技术中有着重要的应用。

2.2 CGroup

  • 作用:实现CPU、内存、网络等资源的隔离。
  • 具体实现:通过创建cgroup控制组,限制进程对资源的使用。
相关命令
2.1 pidstat

pidstat 用于检测一个进程的 CPU、内存、IO、线程等资源的占用情况。

  • 安装
apt install sysstat
  • 语法
pidstat [option] [时间间隔] [次数]

选项

  • -u:检测 CPU 使用情况(默认)
  • -r:检测内存使用情况
  • -d:检测 IO 使用情况
  • -p:指定进程 PID,如果指定 ALL 则监视所有进程
  • -C:检测通过指定命令启动的进程

示例

  • 默认输出pidstat 会输出所有进程的 CPU 占用情况。
  • 指定进程pidstat -p 1234 检测 PID 为 1234 的进程。
  • 指定命令pidstat -C bash 检测通过 bash 命令启动的进程。
  • 检测内存pidstat -r 检测内存占用情况。
  • 指定检测次数与频率pidstat 1 3 每隔一秒检测一次,共检测三次。

简单测试:

2.2 stress

stress 是一个压力测试工具,可以对 CPU、内存、IO 等进行压力测试。

  • 安装
apt install stress
  • 语法
stress [option]

参数

  • -c --cpu N:产生 N 个进程,每个进程都循环调用 sqrt 函数产生 CPU 压力。
  • -m --vm N:产生 N 个进程,每个进程都循环调用 mallocfree 函数,产生内存压力。

示例

  • CPU 压力stress -c 1 创建一个进程进行 CPU 压力测试。

  • 左侧使用stress创建了一个进程进行CPU压力输出
  • 右侧检测stress产生的压力
  • 结果一个进程占满了100%的CPU资源
3. CGroup 控制
3.1 查看 CGroup 支持的资源控制
  • 查看支持的资源控制
cat /proc/cgroups
  • 查看 CGroup 挂载信息
mount | grep cgroup

这里就是每一个资源的控制目录,比如在/sys/fs/cgroup/cpu目录下,就是控制CPU资源的配置文件。

3.2 内存控制
  • 创建内存控制组
cd /sys/fs/cgroup/memory
mkdir test_memory
  • 设置最大内存
echo "20971520" > test_memory/memory.limit_in_bytes
  • 将进程加入控制组
stress -m 1 --vm-bytes 50m
pidstat -r
echo "15070" > test_memory/tasks
3.3 CPU 控制
  • 创建 CPU 控制组
cd /sys/fs/cgroup/cpu
mkdir test_cpu
  • 设置 CPU 占用率
echo "5000" > test_cpu/cpu.cfs_period_us
echo "2000" > test_cpu/cpu.cfs_quota_us
  • 将进程加入控制组
stress -c 1
pidstat -u
echo "60769" > test_cpu/tasks

ps:配好了环境的这台服务器,没有权限测试 ,哎之后有机会,回来填坑

后面应该是实现 echo 后,stress的CPU占用率立马下降了的结果,来实现了cgroup成功对进程的CPU进行了限制

4. 总结

结合 pidstatstress 工具,可以方便地进行资源监控和压力测试,进一步验证 CGroup 的效果。

总结

容器化技术在Linux中基于namespace和cgroup实现

  • namespace完成不同容器之间的环境隔离
  • cgroup完成多个容器对资源的占用限制,合理分配资源。

这是Docker等容器化技术的基本原理和底层依赖。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Ubuntu学习】Ubuntu无法使用vim命令编辑

问题 在VMware首次安装Ubuntu,使用vi指令对文件进行编辑,按i键后无法更改文件内容。 原因 由于Ubuntu中预装的是vim-tiny,平时开发中需要使用vim-full。 解决方案 卸载预装vim sudo apt-get remove vim-common安装vim-full sudo apt-get …

同轴全息图和离轴全息图

一、同轴全息图 1.1 记录 设透明的物体(相位物)的振幅透过率为: t0是一个很高的平均透射率,表示围绕平均值的变化。 透射光场可以看成由两项组成: 一项是由t0表示的强而均匀的平面波, 它相当于波前记录时的参考波, 另一 项是Δt 所代表的弱散射波, 它相当于波前记录时的物光波…

Redhat切换其他源

1. 效果图 2. 安装 RPM 包的命令 rpm -ivh --nodeps --force epel-release-latest-8.noarch.rpm rpm -ivh --nodeps --force yum-4.7.0-4.el8.noarch.rpm rpm -ivh --nodeps --force yum-utils-4.0.21-3.el8.noarch.rpm 3. 修改默认源 vi /etc/yum.repos.d/redhat.repo[BaseO…

SpringMVC学习记录(三)之响应数据

SpringMVC学习记录(三)之响应数据 一、页面跳转控制1、快速返回模板视图2、转发和重定向 二、返回JSON数据1、前置准备2、ResponseBody 三、返回静态资源1、静态资源概念2、访问静态资源 /*** TODO: 一个controller的方法是控制层的一个处理器,我们称为h…

MethodChannel的用法

文章目录 1 知识回顾2 示例代码3 经验总结我们在上一章回中介绍了MethodChannel的使用方法,本章回中将介绍EventChannel的使用方法.闲话休提,让我们一起Talk Flutter吧。 1 知识回顾 我们在前面章回中介绍了通道的概念和作用,并且提到了通道有不同的类型,本章回将其中一种…

[每周一更]-(第122期):模拟面试|数据库面试思路解析

10|数据库索引:为什么 MySQL 用 B+ 树而不用 B 树? 为什么 MySQL 用 B+ 树而不用 B 树? 什么是覆盖索引? 什么是聚簇索引/非聚簇索引? 什么是哈希索引?MySQL InnoDB 引擎怎么创建一个哈希索引? 什么回表?如何避免回表? 树的高度和查询性能是什么关系? 什么是索引最左…

React的概念以及发展前景如何?

React是一个由Facebook开发的用于构建用户界面的的开源JavaScript库,它主要用于构建大型、动态的Web应用程序。React的主要特点是使用VirtualDOM(虚拟DOM)来优化性能,并使用声明式的编程方式来编写UI。 React的主要概念包括&#…

【Spring编程常见错误50例】03.依赖注入常见错误-上

1.多个实现类 如何匹配 在实际的开发中,我们会使用Autowired 注解进行依赖注入对应的bean,但是如果我们依赖的是一个接口,有对应多个实现的话,就会出现异常。 RestController public class DbController {Autowiredprivate DbSe…

智能母线插接箱监测装置的工作原理与实际应用分析

徐悦 安科瑞电气股份有限公司 随着电力系统的智能化发展,如何有效地监控电力系统的运行状态并保证系统安全性,成为电力运维中不可忽视的问题。AMB100智能母线直流监控装置应运而生。本文将详细介绍AMB100的工作原理及技术特点,结合实际应用…

USB包的结构

本文章主要来自《圈圈教你玩USB》的学习笔记 USB包的结构 USB是串行总线,所以数据是一位位的在数据总线上传输,采用LSB在前的方式。 USB数据需要经过位填充和NRZI编码。在这里讨论时,所用的数据都是原始数据,即没有经过位填充和…

让redis一直开启服务/自动启动

文章目录 你的redis是怎么打开的黑窗不能关?必须要自动启动吗?再说说mysql 本文的所有指令都建议在管理员权限下打开cmd控制台 推荐的以管理员身份打开控制台的方式 Win R 打开运行 输入cmdShift Ctrl Enter 你的redis是怎么打开的 安装过redis的朋友都知道, redis的安…

吴恩达深度学习笔记:卷积神经网络(Foundations of Convolutional Neural Networks)4.11

目录 第四门课 卷积神经网络(Convolutional Neural Networks)第四周 特殊应用:人脸识别和神经风格转换(Special applications: Face recognition &Neural style transfer)4.11 一维到三维推广(1D and 3…

基于图的去中心化社会推荐过滤器

🏡作者主页:点击! 🤖编程探索专栏:点击! ⏰️创作时间:2024年11月11日19点20分 点击开启你的论文编程之旅https://www.aspiringcode.com/content?id17176636216843&uideba758a1550b46bb…

云计算在教育领域的应用

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 云计算在教育领域的应用 云计算在教育领域的应用 云计算在教育领域的应用 引言 云计算概述 定义与原理 发展历程 云计算的关键技…

开始使用 Elastic AI Assistant 进行可观察性和 Microsoft Azure OpenAI

作者:Jonathan Simon 按照此分步过程开始使用 Elastic AI Assistant for Observability 和 Microsoft Azure OpenAI。 最近,Elastic 宣布,AI Assistant for Observability 现已面向所有 Elastic 用户开放。AI Assistant 为 Elastic Observabi…

uniapp—android原生插件开发(1环境准备)

本篇文章从实战角度出发,将UniApp集成新大陆PDA设备RFID的全过程分为四部曲,涵盖环境搭建、插件开发、AAR打包、项目引入和功能调试。通过这份教程,轻松应对安卓原生插件开发与打包需求! 项目背景: UniApp集成新大陆P…

git新手使用教程

git新手使用教程 一、安装和初始化配置2、新建仓库3.工作区域和文件状态4.添加和提交文件5 git reset回退版本6 使用git diff查看差异7 使用git rm删除文件8 .gitignore忽略文件9 注册GitHub账号10 SSH配置和克隆仓库11 关联本地仓库和远程仓库12 Gitee的使用 由B站视频教程整理…

java程序优化二

接触渲染也有一段时间了,发现还有很多优化的空间,今天时间比较有限就提一点 一:从参数接口方面,例如提交渲染接口参数有大量的浮点数据,小数位过多,其实四舍五入保留4位也没什么影响,这样大小接…

分布式----Ceph部署(上)

目录 一、存储基础 1.1 单机存储设备 1.2 单机存储的问题 1.3 商业存储解决方案 1.4 分布式存储(软件定义的存储 SDS) 1.5 分布式存储的类型 二、Ceph 简介 三、Ceph 优势 四、Ceph 架构 五、Ceph 核心组件 #Pool中数据保存方式支持两种类型&…

在SpringBoot3中启用HTTP2

为什么要在SpringBoot中启用HTTP2 启用HTTP2可以带来更高效的数据传输、更优的性能表现以及更好的用户体验。 二进制格式传输数据:HTTP2采用二进制格式传输数据,而非HTTP1.x的文本格式,这使得协议解析更高效,且便于扩展。 头部压…