当前位置: 首页 > news >正文

docker的资源控制及docker数据管理

目录

一.docker的资源控制

1.CPU 资源控制

1.1 资源控制工具

1.2 cgroups有四大功能

1.3 设置CPU使用率上限

1.4 进行CPU压力测试

 1.5 设置50%的比例分配CPU使用时间上限

 1.6 设置CPU资源占用比(设置多个容器时才有效)

1.6.1 两个容器测试cpu

2.对内存使用的限制

3.对磁盘IO配额控制(blkio)的限制

3.1 创建容器,并限制写速度

二.docker数据管理 

1.为何需要docker数据管理

2.数据管理类型

3.数据卷

 4.数据卷容器

 5.容器的互联


一.docker的资源控制

1.CPU 资源控制

1.1 资源控制工具

cgroups,是一个非常强大的linux内核工具,他不仅可以限制被 namespace 隔离起来的资源, 还可以为资源设置权重、计算使用量、操控进程启停等等。 所以 cgroups(Control groups)实现了对资源的配额和度量。

1.2 cgroups有四大功能

●资源限制:可以对任务使用的资源总额进行限制

●优先级分配:通过分配的cpu时间片数量以及磁盘IO带宽大小,实际上相当于控制了任务运行优先级

●资源统计:可以统计系统的资源使用量,如cpu时长,内存用量等

●任务控制:cgroup可以对任务执行挂起、恢复等操作

1.3 设置CPU使用率上限

Linux通过CFS(Completely Fair Scheduler,完全公平调度器)来调度各个进程对CPU的使用。CFS默认的调度周期是100ms。

我们可以设置每个容器进程的调度周期,以及在这个周期内各个容器最多能使用多少 CPU 时间。

使用 --cpu-period 即可设置调度周期,使用 --cpu-quota 即可设置在每个周期内容器能使用的CPU时间。两者可以配合使用。

CFS 周期的有效范围是 1ms~1s,对应的 --cpu-period 的数值范围是 1000~1000000。 周期100毫秒
而容器的 CPU 配额必须不小于 1ms,即 --cpu-quota 的值必须 >= 1000。

docker run -itd --name test5 centos:7 /bin/bash
cd /sys/fs/cgroup/cpu/docker/
ls
aca125bbcdcb17d3e30a70e9c7c20b49ef28c9556f14502a070a7fdaf1f0381a  cpu.rt_period_us
[root@centos1 docker]# cd aca125bbcdcb17d3e30a70e9c7c20b49ef28c9556f14502a070a7fdaf1f0381a
[root@centos1 aca125bbcdcb17d3e30a70e9c7c20b49ef28c9556f14502a070a7fdaf1f0381a]# cat cpu.cfs_quota_us
-1[root@centos1 30e305daa1fe86c98426cb67059606f3cd50944df1af9d5910802d7fc73b42c9]# cat cpu.cfs_period_us
100000​
cat cpu.cfs_period_us ​

 注解:

cpu.cfs_period_us:cpu分配的周期(微秒,所以文件名中用 us 表示),默认为100000。
cpu.cfs_quota_us:表示该cgroups限制占用的时间(微秒),默认为-1,表示不限制。 如果设为50000,表示占用50000/100000=50%的CPU。

1.4 进行CPU压力测试

在容器 里 进行压力测试
[root@centos1 30e305daa1fe86c98426cb67059606f3cd50944df1af9d5910802d7fc73b42c9]# docker exec -it 30e305daa1fe /bin/bash
#容器里不能 用vim  只能 用vi
vi /cpu.sh
#!/bin/bash
i=0
while true
do
let i++
done

chmod +x /cpu.sh
./cpu.sh
#从新开个终端查看CPU使用情况 
#可以看到这个脚本占了很多的cpu资源
top

 1.5 设置50%的比例分配CPU使用时间上限

#可以重新创建一个容器并设置限额
docker run -itd --name test7 --cpu-quota 50000 centos:7 /bin/bash
#或者进入修改
cd /sys/fs/cgroup/cpu/docker/c6683c71f9d8b49fd5732f21b0969f1b4fe31d588567d6d32f12ced906e0dde7/
echo 50000 > cpu.cfs_quota_us
docker exec -it c6683c71f9d8 /bin/bash./cpu.sh
#可以看到cpu占用率接近50%,cgroups对cpu的控制起了效果
top

 1.6 设置CPU资源占用比(设置多个容器时才有效)

Docker 通过 --cpu-shares 指定 CPU 份额,默认值为1024,值为1024的倍数。

1.6.1 两个容器测试cpu

(1)创建两个容器为 c1 和 c2,若只有这两个容器,设置容器的权重,使得c1和c2的CPU资源占比为1/3和2/3。

docker run -itd --name c1 --cpu-shares 512 centos:7	
docker run -itd --name c2 --cpu-shares 1024 centos:7

 (2)分别进入容器,进行压力测试

c1;

docker exec -it eb2c65e90789 /bin/bash
vi /cpu.sh
#!/bin/bash
i=0
while true
do
let i++
done
chmod +x /cpu.sh
./cpu.sh

另开终端:

c2:

docker exec -it d32f1cdfafe2 /bin/bash
vi /cpu.sh
#!/bin/bash
i=0
while true
do
let i++
done
chmod +x /cpu.sh
./cpu.sh

 (3)另开终端,查看容器运行状态(动态更新)

docker stats

 1.6.2 设置容器绑定指定的CPU

(1)先分配虚拟机4个CPU核数

docker run -itd --name test7 --cpuset-cpus 1,3 centos:7 /bin/bash

(2)进入容器,进行压力测试

yum install -y epel-release
yum install stress -y
stress -c 4
docker exec -it 5c982ffed51c /bin/bash
vi /cpu.sh
#!/bin/bash
i=0
while true
do
let i++
done
chmod +x /cpu.sh
./cpu.sh

另开终端 

( 3)退出容器,执行 top 命令再按 1 查看CPU使用情况。

2.对内存使用的限制

(1)-m(–memory=) 选项用于限制容器可以使用的最大内存

 (2)限制可用的 swap 大小, --memory-swap
强调一下,–memory-swap 是必须要与 --memory 一起使用的。

正常情况下,–memory-swap 的值包含容器可用内存和可用 swap。

所以 -m 300m --memory-swap=1g 的含义为:容器可以使用 300M 的物理内存,并且可以使用 700M(1G - 300)的 swap。

如果 --memory-swap 设置为 0 或者 不设置,则容器可以使用的 swap 大小为 -m 值的两倍。

如果 --memory-swap 的值和 -m 值相同,则容器不能使用 swap。

如果 --memory-swap 值为 -1,它表示容器程序使用的内存受限,而可以使用的 swap 空间使用不受

限制(宿主机有多少 swap 容器就可以使用多少)。

3.对磁盘IO配额控制(blkio)的限制

–device-read-bps:限制某个设备上的读速度bps(数据量),单位可以是kb、mb(M)或者gb。
例:

docker run -itd --name test9 --device-read-bps /dev/sda:1M  centos:7 /bin/bash
dd if=/dev/zero of=test.out bs=1M count=10 oflag=direct	

–device-write-bps : 限制某个设备上的写速度bps(数据量),单位可以是kb、mb(M)或者gb。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-INieXTAv-1692257917973)(C:\Users\zhao\AppData\Roaming\Typora\typora-user-images\image-20230816152211711.png)]

 例:

docker run -itd --name test11 --device-write-bps /dev/sda:1mb centos:7 /bin/bash
dd if=/dev/zero of=test.out bs=1M count=10 oflag=direct	

–device-read-iops :限制读某个设备的iops(次数)

–device-write-iops :限制写入某个设备的iops(次数)

3.1 创建容器,并限制写速度

#通过dd来验证写速度
#添加oflag参数以规避掉文件系统cache
dd if=/dev/zero of=test.out bs=1M count=10 oflag=direct	10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 10.0025 s, 1.0 MB/s
#清理docker占用的磁盘空间
docker system prune -a			#可以用于清理磁盘,删除关闭的容器、无用的数据卷和网络

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wzRZ2zde-1692257917974)(C:\Users\zhao\AppData\Roaming\Typora\typora-user-images\image-20230816152426044.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wzRZ2zde-1692257917974)(C:\Users\zhao\AppData\Roaming\Typora\typora-user-images\image-20230816152426044.png)]

 停止的容器已被清理

二.docker数据管理 

1.为何需要docker数据管理

因为数据写入后如果停止了容器,再开启数据就会消失,使用数据管理的数据卷挂载,实现了数据的持久化,重启数据还会存在;还有一种方式,容器之间共享文件即相当于有个备份,也会解决停止容器后数据消失的问题。

2.数据管理类型

管理 Docker 容器中数据主要有两种方式:数据卷(Data Volumes)和数据卷容器(DataVolumes Containers)

3.数据卷

数据卷是一个供容器使用的特殊目录,位于容器中。可将宿主机的目录挂载到数据卷上,,对数据卷的修改操作立刻可见,并且更新数据不会影响镜像,从而实现数据在宿主机与容器之间的迁移。数据卷的使用类似于 Linux 下对目录进行的 mount 操作,可以互相同步内容

#拉取CentOS 7的Docker镜像
docker pull centos:7
#使用docker run命令来创建并运行一个基于CentOS 7镜像的容器
docker run -itd  centos:7 /bin/bash
mkdir /var/www
#宿主机创建目录
docker run -v /var/www:/data1 --name web1 -it centos:7 /bin/bash
#创建容器centos7并命名为web1.将宿主机的/var/www目录挂载到容器中的/data1卷中
# -v 选项表示容器中创建数据卷
echo "this is web1" > /data1/a.txt
exit
#数据卷中创建内容a.txt并退出
cd /var/www/
#进入宿主机的挂载目录
cat a.txt
#验证容器中数据卷内容
echo 123>abc.txt
#宿主机的挂载目录创建一个文件夹
docker start web1
docker exec -it web1   /bin/bash 
#开启web1容器并进入
ls /data1
#显示data1数据卷验证其中是否有abc.txt

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YpECIT5P-1692257917975)(C:\Users\zhao\AppData\Roaming\Typora\typora-user-images\image-20230817151138536.png)]

 4.数据卷容器

–volumes-from 要挂载那个容器名称/id号 #用于容器之间的挂载
如果需要在容器之间共享一些数据,最简单的方法就是使用数据卷容器。数据卷容器是一个普通的容器,专门提供数据卷给其他容器挂载使用。

docker run --name web3 -v /data1 -v /data2 -it centos:7 /bin/bash
#创建数据卷容器web3 并创建2个data目录
echo "this is web3" > /data1/abc.txt
echo "This is web3" > /data2/ABC.txt
#web3容器2个data下创建文件
docker run -it --volumes-from web3 --name web4 centos:7 /bin/bash
#使用 --volumes-from 来挂载 web3 容器中的数据卷到新的容器
cat /data1/abc.txt
cat /data2/ABC.txt

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fQJTAe4c-1692257917975)(C:\Users\zhao\AppData\Roaming\Typora\typora-user-images\image-20230817152548474.png)]

 5.容器的互联

容器互联是通过容器的名称在容器间建立一条专门的网络通信隧道。简单点说,就是会在源容器和接收容器之间建立一条隧道,接收容器可以看到源容器指定的信息。

docker run -itd -P --name web01 centos:7 /bin/bash
#创建并运行源容器取名web1
docker run -itd -P --name web03 --link web01:web01 centos:7 /bin/bash、
#创建并运行接收容器取名web2,使用--link选项指定连接容器以实现容器互联

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eCeoXeNR-1692257917975)(C:\Users\zhao\AppData\Roaming\Typora\typora-user-images\image-20230817152939441.png)]

 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-59oASmvw-1692257917976)(C:\Users\zhao\AppData\Roaming\Typora\typora-user-images\image-20230817153013572.png)]

#进入web03容器
docker exec -it web03 /bin/bash
ping 90fd4a7ad12f

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9r9wnaFy-1692257917976)(C:\Users\zhao\AppData\Roaming\Typora\typora-user-images\image-20230817153454773.png)]

#查看web01的地址
docker inspect web01

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hbjUrxwg-1692257917976)(C:\Users\zhao\AppData\Roaming\Typora\typora-user-images\image-20230817153550021.png)]

#进入web03pingweb01的IP地址
ping 172.17.0.5

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A7ry454S-1692257917976)(C:\Users\zhao\AppData\Roaming\Typora\typora-user-images\image-20230817153711763.png)]

相关文章:

docker的资源控制及docker数据管理

目录 一.docker的资源控制 1.CPU 资源控制 1.1 资源控制工具 1.2 cgroups有四大功能 1.3 设置CPU使用率上限 1.4 进行CPU压力测试 1.5 设置50%的比例分配CPU使用时间上限 1.6 设置CPU资源占用比(设置多个容器时才有效) 1.6.1 两个容器测试cpu 2&…...

通过请求头传数据向后端发请求

axios (get post请求、头部参数添加)傻瓜式入门axios_axiospost请求参数_web_blog的博客-CSDN博客...

产品流程图是什么?怎么做?

产品流程图是什么? 产品流程图是一种图形化的表达方式,用于描述产品开发、制造、销售、使用等各个阶段中涉及的流程、步骤和关系。它通过图形符号、箭头、文本等元素,展示了产品的各个环节之间的关联和顺序,通常被用于可视化产…...

面试之快速学习STL-map

关联式容器 包括 map、multimap、set 以及 multiset 这 4 种容器。和序列式容器区别: a . 关联式容器在存储元素时还会为每个元素在配备一个键,整体以键值对的方式存储到容器中。 b . 相比前者,关联式容器可以通过键值直接找到对应的元素&am…...

ES的索引结构与算法解析

提到ES,大多数爱好者想到的都是搜索引擎,但是明确一点,ES不等同于搜索引擎。不管是谷歌、百度、必应、搜狗为代表的自然语言处理(NLP)、爬虫、网页处理、大数据处理的全文搜索引擎,还是有明确搜索目的的搜索行为,如各大…...

32.Netty源码之服务端如何处理客户端新建连接

highlight: arduino-light 服务端如何处理客户端新建连接 Netty 服务端完全启动后,就可以对外工作了。接下来 Netty 服务端是如何处理客户端新建连接的呢? 主要分为四步: md Boss NioEventLoop 线程轮询客户端新连接 OP_ACCEPT 事件&#xff…...

代码随想录day11

20. 有效的括号 ● 力扣题目链接 ● 给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串,判断字符串是否有效。 ● 有效字符串需满足: ● 左括号必须用相同类型的右括号闭合。 ● 左…...

RabbitMQ实习面试题

RabbitMQ实习面试题 在 RabbitMQ 中,确保生产者消息正确发布以及确保消费者已经消费是非常重要的任务。以下是一些方法和策略,可以帮助您在 RabbitMQ 中实现这些目标: 确保生产者消息正确发布: 持久化消息:将消息设…...

Electron入门,项目运行,只需四步轻松搞定。

electron 简单介绍: 实现:HTML/CSS/JS桌面程序,搭建跨平台桌面应用。 electron 官方文档: [https://electronjs.org/docs] 本文是基于以下2篇文章且自行实践过的,可行性真实有效。 文章1: https://www.cnbl…...

【C++】visualstudio环境安装

记录了部分安装步骤,可能有点不全,参考下,需要的磁盘空间差不多20GB; 下载 https://visualstudio.microsoft.com/zh-hans/vs/ 下载完成: 双击进入安装状态: 根据自己的需求勾选安装项: 选择…...

使用MySQL:5.6和owncloud镜像搭建个人网盘

拉取镜像 [rootkvm ~]# docker pull mysql:5.6[rootkvm ~]# docker pull owncloud启动mysql容器 [rootkvm ~]# docker run -d --name db1 -e MYSQL_ROOT_PASSWORDroot mysql:5.6 db832e4e4333a0e9a7c152a67272721fdbe5381054090c5eb24f90455390a852 [rootkvm ~]# docker ps …...

php中创建对象时传递的参数是构造方法

PHP中创建对象时,可以通过构造方法的参数来传递参数值。构造方法是一个特殊的方法,在创建对象时会自动调用,用于进行对象的初始化操作。 以下是一个示例代码,展示了如何在PHP中使用构造方法传递参数: class MyClass …...

C++并发及互斥保护示例

最近要写一个多线程的并发数据库,主要是希望使用读写锁实现库的并发访问,同时考虑到其他平台(如Iar)没有C的读写锁,需要操作系统提供,就将读写锁封装起来。整个过程还是比较曲折的,碰到了不少问题,在此就简…...

新手常犯的错误,anzo capital昂首资本一招避免少走弯路

新手是不是经常交易中赚不到钱,今天anzo capital昂首资本就盘点一下新手常犯的错误,一招教你少走弯路。 一.随便选择交易账户 开立实时账户时选择正确的账户类型,anzo capital昂首资本教你比较所有提供的账户类型,选择最符合财务…...

Java Vue (el-date-picker组件) 前后端 关于时间格式数据的处理方法

前端使用 elment-ui 组件 el-date-picker 其中组件需要格式化时间,增加属性 value-format"yyyy-MM-dd" 后端 Java 接收参数类型 后端Dto 使用Date接收,并添加JsonFormat注解 JsonFormat(pattern"yyyy-MM-dd") private Date testTi…...

Python爬虫——scrapy_多条管道下载

定义管道类(在pipelines.py里定义) import urllib.requestclass DangDangDownloadPipelines:def process_item(self, item, spider):url http: item.get(src)filename ../books_img/ item.get(name) .jpgurllib.request.urlretrieve(url, filename…...

lombok启动不生效(什么方法都试了,可还是不生效怎么办 ?! 救救我)

使用IntelliJ IDEA 2021.1.3&#xff08;Ultimate Edition&#xff09;时提示Lombok不生效 java: You aren’t using a compiler supported by lombok, so lombok will not work and has been disabled. 方式一&#xff1a;我们手动更新一下版本到以下版本 <!--Lombok--&…...

element文本域禁止手动拉伸、两种方式、textarea

文章目录 style方式element自带的禁止拉伸方法建议 style方式 html <el-inputv-model"content":rows"3"class"r_n"type"textarea"maxlength"40"placeholder""style"height: 100%;" />css style…...

c#中lambda表达式缩写推演

Del<string> ml new Del<string>(Notify);//泛型委托的实例化&#xff0c;并关联Nofity方法 Del<string> ml new Del<string>(delegate (string str) { return str.Length; });//将Nofity变更为匿名函数 Del<string> ml delegate(string str)…...

无涯教程-PHP - 循环语句

PHP中的循环用于执行相同的代码块指定的次数。 PHP支持以下四种循环类型。 for - 在代码块中循环指定的次数。 while - 如果且只要指定条件为真&#xff0c;就会循环遍历代码块。 do ... while - 循环执行一次代码块&#xf…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...