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)]](https://img-blog.csdnimg.cn/0863d065851b466fa78b5093af461a9d.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)]](https://img-blog.csdnimg.cn/bb837ad24e88429fb492410e197a38ce.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)]](https://img-blog.csdnimg.cn/edaf47f851154f4baf0b073955176b81.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)]](https://img-blog.csdnimg.cn/bc26e21a6a504580b3c9c8e9aa276378.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)]](https://img-blog.csdnimg.cn/15fc65f65d384a0a946108602f965fd9.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-59oASmvw-1692257917976)(C:\Users\zhao\AppData\Roaming\Typora\typora-user-images\image-20230817153013572.png)]](https://img-blog.csdnimg.cn/e07da39af8e7414888f40c8ae99225f3.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)]](https://img-blog.csdnimg.cn/e5afad734015433c85f78ee3e4073150.png)
#查看web01的地址
docker inspect web01
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hbjUrxwg-1692257917976)(C:\Users\zhao\AppData\Roaming\Typora\typora-user-images\image-20230817153550021.png)]](https://img-blog.csdnimg.cn/8da73d12bfc944bc9712aa36b26ffbf4.png)
#进入web03pingweb01的IP地址
ping 172.17.0.5
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A7ry454S-1692257917976)(C:\Users\zhao\AppData\Roaming\Typora\typora-user-images\image-20230817153711763.png)]](https://img-blog.csdnimg.cn/8828721a1c7c4f0fad0ab32c5e379b32.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 事件ÿ…...
代码随想录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(Ultimate Edition)时提示Lombok不生效 java: You aren’t using a compiler supported by lombok, so lombok will not work and has been disabled. 方式一:我们手动更新一下版本到以下版本 <!--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);//泛型委托的实例化,并关联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 - 如果且只要指定条件为真,就会循环遍历代码块。 do ... while - 循环执行一次代码块…...
19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...
