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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络:网络层 —— 软件定义网络 SDN

文章目录 软件定义网络 SDN远程控制器OpenFlow协议SDN 广义转发流表简单转发负载均衡防火墙 SDN 控制器 软件定义网络 SDN 软件定义网络(Software Defined Networking,SDN)是一种新兴的网络架构,旨在通过网络控制与数据转发的分离…

高通Quick板上安装编译Ros1 noetic,LeGO_LOAM,FAR_Planner和rslidar_sdk

环境要求: 这里quick板上安装的是Ubuntu20.04版本 Ros Noeti安装: 1.设置软件源: 官方提供的软件源: sudo sh -c echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.…

「QT」几何数据类 之 QPointF 浮点型点类

✨博客主页何曾参静谧的博客📌文章专栏「QT」QT5程序设计📚全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasolid…

如何处理模型的过拟合和欠拟合问题

好久没有写人工智能这块的东西了,今天正好在家休息,给大家分享一下最近在训练时遇到的过拟合和欠拟合的问题,经过仔细的思考,总结如下: 在处理模型的过拟合和欠拟合问题时,我们需要根据具体情况采取不同的…

GoLang协程Goroutiney原理与GMP模型详解

本文原文地址:GoLang协程Goroutiney原理与GMP模型详解 什么是goroutine Goroutine是Go语言中的一种轻量级线程,也成为协程,由Go运行时管理。它是Go语言并发编程的核心概念之一。Goroutine的设计使得在Go中实现并发编程变得非常简单和高效。 以下是一些…

“穿梭于容器之间:C++ STL迭代器的艺术之旅”

引言: 迭代器(Iterator)是C STL(标准模板库)中非常重要的一部分,它提供了一种统一的方式来遍历容器中的元素。无论容器是数组、链表、树还是其他数据结构,迭代器都能够以一致的方式访问这些数据…

opencv实时弯道检测

项目源码获取方式见文章末尾! 600多个深度学习项目资料,快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【基于CNN-RNN的影像报告生成】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模型实现…

智谱AI视频生成模型CogVideoX v1.5开源 支持5/10秒视频生成

今日,智谱技术团队发布了其最新的视频生成模型 CogVideoX v1.5,并将其开源。这一版本是自8月以来,智谱技术团队推出的 CogVideoX 系列中的又一重要进展。 据了解,此次更新大幅提升了视频生成能力,包括支持5秒和10秒的视…

Python注意力机制Attention下CNN-LSTM-ARIMA混合模型预测中国银行股票价格|附数据代码...

全文链接:https://tecdat.cn/?p38195 股票市场在经济发展中占据重要地位。由于股票的高回报特性,股票市场吸引了越来越多机构和投资者的关注。然而,由于股票市场的复杂波动性,有时会给机构或投资者带来巨大损失。考虑到股票市场的…

【Pikachu】File Inclusion文件包含实战

永远也不要忘记能够笑的坚强,就算受伤,我也从不彷徨。 1.File Inclusion(文件包含漏洞)概述 File Inclusion(文件包含漏洞)概述 文件包含,是一个功能。在各种开发语言中都提供了内置的文件包含函数,其可以使开发人员在一个代码…

数据结构:跳表实现(C++)

个人主页 : 个人主页 个人专栏 : 《数据结构》 《C语言》《C》《Linux》《网络》 《redis学习笔记》 文章目录 前言跳表跳表的优化思路skiplist,平衡搜索树,哈希表的对比 实现思路SkiplistNodesearch 搜索add 增加earse 删除 整体…

材质(二)——材质参数化,从源材质继承生成不同的材质实例

继承原材质,对外提供参数。 更改调制不同的参数,生成不同的材质实例。 类似于,类的继承。有一个基类Base.继承生成为子类 A_Base,B_Base,C_Base

Kotlin 协程使用及其详解

Kotlin协程,好用,但是上限挺高的,我一直感觉自己就处于会用,知其然不知其所以然的地步。 做点小总结,比较浅显。后面自己再继续补充吧。 一、什么是协程? Kotlin 协程是一种轻量级的并发编程方式&#x…

HDFS和HBase跨集群数据迁移 源码

HDFS集群间数据迁移(hadoop distcp) hadoop distcp \ -pb \ hdfs://XX.14.36.205:8020/user/hive/warehouse/dp_fk_tmp.db/ph_cash_order \ hdfs://XX.18.32.21:8020/user/hive/warehouse/dp_fksx_mart.db/HBase集群间数据(hbase ExportSnap…

多态(c++)

一、概念 多态分为编译时多态(静态多态)和运行时多态(动态多态),函数重载和函数模板就是编译时多态,它们传不同的类型的参数就可以调用不同的函数,通过参数不同达到多种形态,因为它们…

MySQL之索引(1)(索引概念与作用、红黑树、b树、b+树)(面试高频)

目录 一、索引的概念、作用。 (1)介绍。 (2)为啥索引能优化sql查询? 1、某张表(emp)结构以及数据如下。 2、假如执行的SQL语句为:select * from emp where empno7844; 3、对比与总结。 (3&#…

element-plus的Tree 树形控件添加图标

该文章为本菜鸡学习记录&#xff0c;如有错误还请大佬指教 本人刚开始接触vue框架&#xff0c;在使用element-plus组件想实现树形控件&#xff0c;发现官网的组件示例没有图标区分显示 实现效果 代码 <temple 部分 <el-tree :data"data" node-click"hand…

libgdiplus在MacOS M1上问题:Unable to load shared library ‘libgdiplus‘

libgdiplus在MacOS M1上问题&#xff1a;Unable to load shared library libgdiplus 问题解决步骤1步骤2 问题 在mac上的pycharm中执行下面的代码时出现下面的错误 slide.get_thumbnail( RuntimeError: Proxy error(TypeInitializationException): The type initializer for…

在 WPF 中,绑定机制是如何工作的?WPF数据绑定机制解析

在WPF&#xff08;Windows Presentation Foundation&#xff09;中&#xff0c;数据绑定机制是其核心功能之一&#xff0c;广泛用于连接应用程序的UI&#xff08;用户界面&#xff09;和应用程序的业务逻辑层。数据绑定允许你将UI元素与数据源&#xff08;如对象、集合或其他数…

BEAGLE: Forensics of Deep Learning Backdoor Attack for Better Defense(论文阅读)

将论文中内容精简了一下&#xff0c;并做了下总结。 目录 摘要 背景介绍 Contribution&#xff1a; 提出的方法&#xff1a;BEAGLE的核心目标 简化的具体步骤&#xff1a; ThreatModel&#xff1a; 方法限制&#xff1a; 案例分析&#xff1a; EAGLE 自动生成的扫描…