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

news2024/11/14 1:08:46

目录

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等容器化技术的基本原理和底层依赖。

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

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

相关文章

AI生活之我用AI处理Excel表格

AI生活之我用AI处理Excel表格 场景再现AI提问词AI代码运行调试结果心得感受 场景再现 因学习需要,整理了某个题库,方便自己刷题使用。 已将每套题打上了制定标签,得到一个Excel表格。截图如下: 需求是:一共35套题&…

Stable Diffusion Web UI - ControlNet 姿势控制 openpose

openpose 是 ControlNet 中常用的控制模式之一。 通过 openpose 可以锁定人物姿势,把姿势信息传递给 Stable Diffusion 扩散模型,让其在扩散生成图片的时候遵照特定的任务姿势。 通过 openpose 能够得到类似如下效果: 同样的姿势&#xff0…

第三百一十九节 Java线程教程 - Java线程中断

Java线程教程 - Java线程中断 我们可以通过使用interrupt()方法中断一个活动的线程。 这个方法调用在线程只是一个指示。它是由线程如何响应中断。 例子 下面的代码显示了中断主线程并打印线程中断状态的代码。 public class Main {public static void main(String[] args)…

人工智能(AI)和机器学习(ML)技术学习流程

目录 人工智能(AI)和机器学习(ML)技术 自然语言处理(NLP): Word2Vec: Seq2Seq(Sequence-to-Sequence): Transformer: 范式、架构和自注意力: 多头注意力: 预训练、微调、提示工程和模型压缩: 上下文学习、思维链、全量微调、量化、剪枝: 思维树、思维…

Cynet:全方位一体化安全防护工具

前言 1999年,布鲁斯施奈尔曾说过:“复杂性是安全最大的敌人。”彼时还是19年前,而现在,网络安全已然变得更加繁杂。 近日我在网上冲浪过程中发现了这么一个平台性质的软件,看似具有相当强的防护能力。 根据Cynet的描…

可变类型参数

将形参设为可变类型参数,首先自己的函数要先有一个确定的形参,然后剩余的参数为 ... 用到三个宏,va_list, va_start, va_arg . va_list: 当作一个类型,底层是一个char* 被 typedef va_strat: 先定义一个va_list 类型的变量&#x…

AlphaFold3 开源啦!喜大普奔!

2024年5月8日,AlphaFold3 正式发布!时隔半年,今天,AlphaFold3 终于开源啦!🎉 不过别太激动哈哈哈哈哈,权重还是要额外申请的! 半年前,AlphaFold3 的发布激起了学术界的广…

什么是多因素身份验证(MFA)的安全性?

多因素身份验证(MFA)简介 什么是MFA 多因素身份验证(MFA)是一种安全过程,要求用户在授予对系统、应用程序或账户的访问权限之前提供两种或多种形式的验证。仅使用单个因素(通常是用户名和密码)保护资源会使它们容易受到泄露,添加…

Autosar CP Can State Mangement规范导读

CanSM的主要功能 CAN网络通信模式控制 管理CAN网络的启动、停止和不同通信模式(如全通信、静默通信、无通信)之间的切换。通过状态机实现对CAN网络状态的精确控制,确保网络在不同条件下稳定运行。错误处理与状态报告 根据AUTOSAR基础软件的错误分类方案处理错误,包括开发错…

【Python爬虫实战】全面解析 DrissionPage:简化 Python 浏览器自动化的三种模式

🌈个人主页:易辰君-CSDN博客 🔥 系列专栏:https://blog.csdn.net/2401_86688088/category_12797772.html ​ 目录 前言 一、DrissionPage简介 (一)ChromiumPage (二)WebPage &a…

测试驱动:编写完善测试用例的艺术

测试驱动:编写完善测试用例的艺术 如何编写测试用例 如何撰写高效的测试用例,为产品的稳定性和质量保驾护航。无论你是新手还是经验丰富的测试工程师,让我们一起深入探讨,掌握测试用例编写的精髓! 1. 明确测试目标 …

Linux系统编译boot后发现编译时间与Windows系统不一致的解决方案

现象 如下图,从filezilla软件看虚拟机Linux中编译的uboot.img修改时间与Windows系统时间不同 解决过程 在Linux中查看编译的uboot详细信息,从而得到编译时间。终端输入ls -l后,如下图: 结论 说明在Linux是按照Windows系统时…

24.11.10

星期一: 补 23ICPC 合肥 G cf传送门 思路:由使第 k个最大这种条件易联想到二分,但是如何check是个问题 check使用dp,先想到个比较朴素的状态设定,dp【i】【j】…

JavaSE:初识Java(学习笔记)

java是高级语言的面向对象语言 .[最贴近生活.最快速分析和设计程序] 一,计算机语言发展历史 二,Java体系结构 1,JavaSE(Java Standard Edition) 标准版,定位在个人计算机上的应用 这个版本是Jav…

SQL 专项练习题(合集)

1,第一题 1)表名:t_patent_detail (专利明细表) 2)表字段:专利号(patent_id)、专利名称(patent_name)、专利类型(patent_type)、申请时间 (aplly_date)、授权时间(authorize_date)、申请人(a…

使用ffmpeg播放rtsp视频流

获取IPC摄像机视频流一般使用GB28181或者RTSP协议,这两款协议是比较常见的;两者都有开源的库,下面介绍如何使用RTSP获取进行IPC视频流; 准备库 ffmepg是个开源的库,该库集成了rtsp协议,可以直接使用;首先…

【Linux探索学习】第十二弹——初识进程:进程的定义、描述和一些简单的相关操作

Linux学习笔记: https://blog.csdn.net/2301_80220607/category_12805278.html?spm1001.2014.3001.5482 前言: 在前面经过那么多篇的铺垫后,今天我们正式进入Linux学习的第一个重难点——进程,理解进程对于我们学习操作系统的其…

AI教育革命:个性化学习的新篇章

内容概要 在 教育 领域,人工智能 的崭露头角带来了前所未有的变化。如今,个性化学习 已不再是一个遥不可及的梦想,而是通过 AI 技术真正实现的可能。借助先进的数据分析能力,教师可以实时跟踪和评估每位学生的学习进度&#xff0…

ASMR助眠声音视频素材去哪找 吃播助眠素材网站分享

在快节奏的现代生活中,越来越多的人感到压力山大,许多人开始寻求助眠和放松的方式。而ASMR(自发性知觉经络反应)助眠声音视频,凭借其独特的声音刺激和放松效果,成为了睡前的“神器”。如果你是一位内容创作…

项目管理中不可或缺的能力

在现代企业中,项目管理是一项至关重要的能力。项目管理需要具备的能力包括:有效的沟通能力、团队协作能力、时间管理能力、风险管理能力、以及问题解决能力。 其中,有效的沟通能力尤为重要,它不仅涉及到信息的传递,还包…