Docker安全与资源

news2024/11/13 13:34:17

一、cgroup资源配置方法

1.cgroup概念

cgroup(control group控制族群)

(1)什么是cgroup

        和namespace类似,也是将进程进程分组,但是目的与namespace不一样,namespace是为了隔离进程组之前的资源,而cgroup是为了对一组进程进行统一的资源监控和限制。

(2)为什么要使用cgroup

        在Linux里,对进程进程分组,比如Session group、process group等,后来需要追踪一组进程的内存和IO使用情况,出现了cgroup,用来统一对进程进行分组,并在分组的基础上对进程进程监控和资源控制管理等。

(3)cgroup的作用

        cgroup(control group控制族群)是一个内核特性,用于限制、统计、隔离一组进程的资源(CPU、内存、磁盘、网络等),首字母不要大写。Docker通过cgroup来控制容器使用的资源配额,包括CPU、内存、磁盘三大方面,基本覆盖了常见的资源配额和使用量控制。

cgroup 主要功能包括:
  • 资源限制:限制一组进程的可用资源阈值。
  • 资源监控:监控 cgroup 级别的资源使用状态。
  • 进程控制:控制(挂起 or 恢复)cgroup 中的所有进程。
  • 优先级控制:控制不同 cgroup 的优先级,当资源不足时,优先满足优先级高的 cgroup。

        控制族群就是按照一组某种标准划分的进程。Cgroup中的资源控制都是以控制族群为单位实现。一个进程可以加入到某个控制族群,也可以从一个进程组迁移到另一个控制族群。一个进程组的进程可以使用cgroups以控制族群为单位分配资源,同时受到cgroups以控制族群为单位设定限制。

注意:

  • 单数形式(cgroup)指所有特性,也可以作为“cgroup controllers”的修饰。
  • 复数形式(cgroups)指多个 cgroup。
(4)docker利用cgroup隔离其命名空间

cgroup是一种资源控制手段,也是容器隔离的6个名称空间的一种实现手段

Docker 是一款常用的容器化管理工具,其中的命名空间是其重要特性之一。Docker 命名空间可以分为六种类型,每种类型都有其独特的作用和用途。下面一一介绍这六种命名空间:

1. Mount (mnt)

这种命名空间隔离的是挂载点。通过这个空间,我们可以在容器中挂载文件系统,而不会影响到主机系统的挂载点,实现了文件系统的隔离。

2. Process ID (pid)

这种命名空间隔离了进程 ID。使用这种空间可以将容器内部的进程 ID 隔离开来,从而避免与宿主机的进程 ID 冲突。

3. Network (net)

这种命名空间隔离的是网络配置。通过这个空间,我们可以自定义容器的网络配置,而不会影响到宿主机或其他容器的网络配置,实现了网络的隔离。

4. Interprocess Communication (ipc)

这种命名空间隔离的是进程间通信。使用这个空间,可以将容器内部的进程间通信隔离,避免与宿主机或其他容器的进程间通信冲突。

5. User ID (user)

这种命名空间隔离的是用户 ID。使用这种命名空间可以让容器内部的用户 ID 和宿主机上的用户 ID 隔离开来,从而避免权限问题。

6. UTS Namespace (uts)

这种命名空间隔离的是主机的主机名和域名。使用这种空间可以让容器内部有独立的主机名和域名,而不会影响到宿主机的主机名和域名。

当我们需要在 Docker 中进行资源隔离和管理时,这些命名空间 是非常有用的。通过这些命名空间,可以更好地隔离各个容器之间的资源,从而使容器的资源利用更加高效,保持容器的互相独立性。

每个容器相当于一个进程

进程相当于资源

(5)docker中的cgroup驱动器

对于cgroup的操作驱动,大多数linux发行版上,操作系统默认的驱动都为systemd。

docker支持的cgroup驱动器有两个:cgroupfs和systemcd

  • cgroupfs是文件驱动修改,内核功能没有提供任何的系统调用接口,而是对 linux vfs 的一个实现,因此可以用类似文件系统的方式进行操作。
  • systemd封装了 cgroups 的软件也能让你通过它们定义的接口控制 cgroups 的内容,因此是通过接口调用驱动修改。

docker默认的cgroup的驱动为cgroupfs,可通过启动参数native.cgroupdriver=systemd进行修改
Kubernetes的默认驱动和docker的驱动是一致的。
因为多数linux发行版的cgroup的驱动为systemd,所以当再选择cgroupfs作为驱动时,会致使操作系统中存在两个cgroup驱动,会带来不稳定的影响。所以在系统已经使用systemd的基础上,配置不推荐使用cgroupfs,直接使用systemd即可。

二、使用 Stress 工具测试 CPU 和内存

1.用 Stress 工具测试 CPU 和内存

[root@localhost ~]# docker pull centos:7 
[root@localhost ~]# cd /root/stress/

[root@localhost ~]# vim /root/stress/Dockerfile
FROM centos:7 
MAINTAINER 5CC 
RUN yum -y install wget 
RUN wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 
RUN wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo 
RUN yum -y install stress 


[root@localhost ~]# cd /root/stress 
[root@localhost stress]# docker build -t centos:stress .


[root@localhost stress]# docker run -tid --name cpu100 --cpu-shares 100 centos:stress stress -c 10
[root@localhost ~]# docker exec -it cpu100 bash

备注:

stress是一个压力测试工具,用于测试cpu和内存的负载

cpu.shares。这个值是 CPU  cgroup 对于控制组之间的 CPU 分配比例,它的缺省值是 1024。

-c:运行10个stress进程

使用cpu share命令设置容器使用cpu的优先级

[root@localhost ~]# docker run -tid --name cpu512 --cpu-shares 512 centos:stress stress -c 10 

[root@localhost ~]# docker exec -it cpu512 bash
进入容器用top命令查看资源利用情况

设置cpu资源翻倍

[root@localhost~]#docker run -tid --name cpu1024 --cpu-shares 1024 centos:stress stress -c 10 
[root@localhost ~]# docker exec -it cpu1024 bash

进入容器用top命令查看资源利用情况

三个容器的对比(查看其中stress的进程数量)

备注:

测试完后删掉这三个容器

docker rm cpu100 -f

docker rm cpu512 -f

docker rm cpu1024 -f

2.CPU周期限制

[root@localhost ~]# docker run -tid --name mem --cpu-period 100000 --cpu-quota 200000 centos:stress 
[root@localhost ~]# docker exec -it mem bash
[root@738f9fc62048 /]# cat /sys/fs/cgroup/cpu/cpu.cfs_period_us 
[root@738f9fc62048 /]# cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us

备注:

  • --cpu-period 是用来指定容器对 CPU 的使用要在多长时间内做一次重新分配。
  • --cpu-quota 是用来指定在这个周期内,最多可以有多少时间用来跑这个容器。
  • cpu-period cpu-quota 的单位为微秒(μs

3.CPU Core 控制

[root@localhost ~]# docker run -tid --name cpu1 --cpuset-cpus 0-2 centos:stress

注意:docker主机需要更多的cpu内核,否则包含3个内核的容器无法创建,增加内核后重启一下docker主机

0-2表示0、1、2三个内核

[root@localhost ~]# docker exec -it cpu1 bash 
[root@5204fe18208e /]# cat /sys/fs/cgroup/cpuset/cpuset.cpus

4.CPU 配额控制参数的混合使用

[root@localhost ~]# docker run -tid --name cpu3 --cpuset-cpus 3 --cpu-shares 512 centos:stress stress -c 1 
[root@localhost ~]# docker exec -it cpu3 bash

进入容器用top命令查看资源利用情况

注意:

docker主机的cpu内核数量要大于等于满足配额数量

[root@localhost ~]# docker run -tid --name cpu4 --cpuset-cpus 3 --cpu-shares 1024 centos:stress stress -c 1
[root@localhost ~]# docker exec -it cpu4 bash

进入容器用top命令查看资源利用情况

对比两次的显示结果,重点查看%CPU这一列的值,应该为2:1的比例

stress -c 1 命令,将会给系统一个随机负载,产生 1 个进程

5.内存限额

允许该容器最多使用 200M 的内存和 300M swap

[root@localhost ~]# docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 280M

备注:

--vm 1:启动 1 个内存工作线程

--vm-bytes 280M:每个线程分配 280M 内存

  •  分配 280M 内存。
  •  释放 280M 内存。
  •  再分配 280M 内存。
  •  再释放 280M 内存。
  •  一直循环......

让工作线程分配的内存超过 300M,分配的内存超过限额,stress 线程报错,容器退出:

[root@localhost ~]# docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 310M

6.Block IO 的限制

默认情况下,所有容器能平等地读写磁盘,可以通过设置--blkio-weight 参数来改变容器block IO 的优先级。

--blkio-weight --cpu-shares 类似,设置的是相对权重值,默认为 500。取值范围10--1000

在下面的例子中,容器 A 读写磁盘的带宽是容器 B 的两倍。

[root@localhost ~]# docker run -it --name container_A --blkio-weight 600 centos:stress 
[root@5e7093d94869 /]# cat /sys/fs/cgroup/blkio/blkio.weight 

[root@localhost ~]# docker run -it --name container_B --blkio-weight 300 centos:stress 
[root@39947b6517d4 /]# cat /sys/fs/cgroup/blkio/blkio.weight 
cat /sys/fs/cgroup/blkio/blkio.bfq.weight

注意:

kernel 5.10 或更高的版本不在适用

要使 –blkio-weight 生效,需要保证 IO 的调度算法为 CFQ。可以使用下面的方式查看:

root@localhost:~# cat /sys/block/sda/queue/scheduler

noop [deadline] cfq

7.bps iops 的限制

限制容器写 /dev/sda 的速率为 5 MB/s

[root@localhost ~]# docker run -it --device-write-bps /dev/sda:5MB centos:stress 
[root@e3eb0e9ad6fc /]# dd if=/dev/zero of=test bs=1M count=1024 oflag=direct

不限速

[root@localhost ~]# docker run -it centos:stress 
[root@cb6691338f52 /]# dd if=/dev/zero of=test bs=1M count=1024 oflag=direct

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

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

相关文章

制作网站的流程有哪些

制作一个网站需要经历一系列的流程,下面将详细介绍制作网站的主要流程。 1. 确立目标和需求分析:在开始设计网站之前,首先要明确网站的目标和需求。这包括确定网站的用途,目标受众,所需功能等。这个阶段的目的是为了确…

八股之数据库

一、Mysql 基础知识 1.为什么不推荐使用外键与级联? 增加了复杂性: a. 每次做 DELETE 或者 UPDATE 都必须考虑外键约束,会导致开发的时候很痛苦, 测试数据极为不方便; b. 外键的主从关系是定的,假如那天需求有变化,数…

深度解析:AI大模型高效推理技术全览,掌握顶尖性能优化策略!

1 介绍 大型语言模型在人工智能领域中具有巨大的潜力 ,但推理过程中的禁止记忆和计算预算阻碍了其部署。 为了应对这些挑战,提出了许多针对LLMs的专业压缩方法,包括剪枝、知识传递、量化、紧凑的架构设计以及动态网络等。这些方法有助于减少…

219页PDF || 大模型技术引领行业变革:2024大模型典型示范应用案例集(附案例集下载)

大家好,今天给大家分享一本《2024大模型典型示范应用案例集》我已将这本案例集打包好了,包括市面上AI大模型各大白皮书、AGI大模型系统学习路线、AI大模型视频教程、实战学习,等录播视频免费分享出来,需要的小伙伴可以扫取。 引…

Nacos配置内容加密实现

一,背景 因为项目中安全检查的要求,需要将nacos配置的内容进行加密,所以需要实现将配置内容加密处理,这里引入nacos-aes-encryption-plugin插件来完成这一需求。 二,实现步骤 1, 重新编译nacos服务端 1.1 从githu…

海量数据处理商用短链接生成器平台 - 17

第五十八章 数据可视化ADS层-应用数据服务开发实战 第1集 数据可视化ADS层介绍和微服务整合ClickHouse项目 简介: 数据可视化ADS层介绍和微服务整合ClickHouse项目 数据分层 数据分层分层描述数据生成计算工具存储ODS原生数据,短链访问基本信息Sprin…

计算机的启动过程

通常搜索到的往往是 BIOS 按照“启动顺序”,把控制权转交给排在第一位的存储设备:硬盘。然后在硬盘里寻找主引导记录的分区,这个分区告诉电脑操作系统在哪里,并把操作系统被加载到内存中,然后你就能看到经典的启动界面…

HarmonyOS NEXT - 三方库axios的使用和封装

demo 地址: https://github.com/iotjin/JhHarmonyDemo 代码不定时更新,请前往github查看最新代码 在demo中这些组件和工具类都通过module实现了,具体可以参考HarmonyOS NEXT - 通过 module 模块化引用公共组件和utils HarmonyOS NEXT - 三方库axios的使用…

Matplotlib入门与进阶:数据可视化的强大工具

Matplotlib入门与进阶:数据可视化的强大工具 在当今数据驱动的世界中,数据可视化成为了数据分析的重要一环。数据可视化不仅能够帮助开发者理解和分析数据,还能使数据展示更具说服力。本文将详细介绍Python中的2D绘图库——Matplotlib。通过…

通过共享目录上传后门

本文来自无问社区,更多实战内容可前往查看http://www.wwlib.cn/index.php/artread/artid/13337.html 操作步骤 枚举目标主机开启的共享服务信息:10.0.0.6 smbclient -L //10.0.0.6 -U spotWARNING: The "syslog" option is deprecated Ente…

flink车联网项目前篇:数据开发(第66天)

系列文章目录 03_数据仓库开发 开发规范 1.1 数据库划分规范 1.2 表命名规范 1.3 表字段类型规范开发前准备 3.1 业务系统表 3.2 数据导入 04_维度主题相关表结构 1.1 dim_area - 城市字典表 1.2 dim_car_info - 车辆信息表 1.3 dim_car_vendor - 车队信息表 1.4 dim_date_wo…

虹科技术|优化始于数据:Baby-LIN设备如何高效存储总线数据?

记录汽车总线数据对于监控汽车电子控制单元(ECU)间的通信和诊断网络故障具有重要意义。通过记录测试时的总线数据,不仅可以监控产品是否按照预期运行,还能追踪特定错误或故障背后的原因,这对确保汽车产品质量和性能至关…

MySQL查询居然不区分大小写

MySQL查询居然不区分大小写 事故现场真实原因BINARY 关键字总结MySQL 为什么要这样设计呢?解决方案修改排序规则binary !!!!!懵逼了, MySQL 查询居然不区分大小写,第一次听到这么陌…

实验9 根据材料编程《汇编语言》- 王爽

1. 需求 编程:在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串 welcome to masm! 2. 分析 (1)材料中提到,一个在屏幕上显示的字符,具有前景(字符色)和背景(底色)…

[000-01-030].第7节:Zookeeper工作原理

1.Zookeeper工作原理: 1.1.Zookeeper的工作机制 1.Zookeeper从设计模式角度来理解:是一个基于观察者模式设计的分布式服务管理框架;2.Zookeeper负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的…

来了,秋天的第一个POC

立秋就这么水灵灵地过了 又到了“秋天的第一杯奶茶”刷屏的时刻 而我们要追求的是“秋天的第一个POC” 做好变强的准备了吗 Yak POC编写,这一篇就够了 文章中指代的POC仅指使用 Yaklang 编程语言编写的POC 在此篇文章中就详细描述 Yaklang 语法的学习了&#x…

【昱合昇天窗】消防排烟天窗设计使用需注意问题

消防排烟天窗在设计和使用过程中,需要避免出现以下三个问题,以免影响其排烟效果和安全性。1、只关注价格 很多人在选择消防排烟天窗时,只关心天窗的价格,不重视天窗型号、配置选择是否满足厂房需求。这样做的坏处在于安装的天窗可…

还在画恐怖片?局部重绘,艺术再创造 —— Stable diffusion inPainting功能详解与实战指南

前言 在AI绘画的世界里,我们常常面临这样的困境:一幅作品,除了手部姿势、面部表情其他都很完美;这时候,如果要重新生成整幅画,不仅效率低下,而且可能会破坏原本满意的部分。幸好,St…

JAVA毕业设计|(免费)ssm视康眼镜网店销售系统的包含文档代码讲解

收藏点赞不迷路 关注作者有好处 编号:ssm538 ssm视康眼镜网店销售系统的 开发语言:Java 数据库:MySQL 技术:SpringSpringMVCMyBatisVue 工具:IDEA/Ecilpse、Navicat、Maven 文末获取源码 1.系统展示 2.万字文档展示 …

为什么MySql使用B+树

mysql索引为什么选择B树? 在回答这个问题之前,得先了解一个概念,页的概念。页是InnoDB中数据管理的最小单位。当我们查询数据时,其是以页为单位,将磁盘中的数据加载到缓冲池中的。同理,更新数据也是以页为…