Docker容器与虚拟化技术:Docker资源控制、数据管理

目录

一、理论

1.资源控制

2.Docker数据管理

二、实验

1.Docker资源控制

2.Docker数据管理 

三、问题

1.docker容器故障导致大量日志集满,造成磁盘空间满

2、当日志占满之后如何处理

四、总结


一、理论

1.资源控制

(1)  CPU 资源控制

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

(2)cgroups四大功能

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

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

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

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

(3)  设置CPU使用率上限

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

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

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

        CFS 周期的有效范围是 1ms~1s,对应的 --cpu-period 的数值范围是 1000~100000。

        而容器的 CPU 配额必须不小于 1ms,即 --cpu-quota 的值必须 >= 1000。

启用一台容器:
 

docker run -itd --name test1 centos:7 /bin/bash

cpu.cfs_period_us:cpu分配的周期(微秒,所以文件名中用 us 表示),默认为100000。

cpu.cfs_quota_us:表示该control group限制占用的时间(微秒),默认为-1,表示不限制。 如果设为50000,表示占用50000/100000=50%的CPU。
 

①进行CPU压力测试

编写一个脚本:

docker exec -it 3ed82355f811 /bin/bash
vim /cpu.sh
#!/bin/bash
i=0
while true
do
let i++
done

运行:

chmod +x /cpu.sh
./cpu.sh
exit

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

docker run -itd --name test2 --cpu-quota 50000 centos:7 /bin/bash	#可以重新创建一个容器并设置限额
或者
cd /sys/fs/cgroup/cpu/docker/3ed82355f81151c4568aaa6e7bc60ba6984201c119125360924bf7dfd6eaa42b/
echo 50000 > cpu.cfs_quota_us
docker exec -it 3ed82355f811 /bin/bash
./cpu.sh
exit

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

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

例:

        创建两个容器为 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

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

yum install -y epel-release
yum install stress -y
stress -c 4	

(5)设置容器绑定指定的CPU

先分配虚拟机4个CPU核数

创建容器

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

进入容器,进行压力测试

yum install -y epel-release
yum install stress -y
stress -c 4
exit

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

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

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

例:

docker run -itd --name test4 --device-read-bps /dev/sda:1M  centos:7 /bin/bash

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

例:

docker run -itd --name test5 --device-write-bps /dev/sda:1M centos:7 /bin/bash

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

创建容器,并限制写速度

docker run -it --name cc3 --device-write-bps /dev/sda:1mb centos:7 /bin/bash

通过dd来验证写速度

dd if=/dev/zero of=test.out bs=1M count=10 oflag=direct				#添加oflag参数以规避掉文件系统cache

2.Docker数据管理

(1)数据卷

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

例:

先下载一个镜像

docker pull centos:7

宿主机目录/var/www挂载到容器中的/data1。

注意:宿主机本地目录的路径必须是使用绝对路径。如果路径不存在,Docker会自动创建相应的路径。

docker run -V /var/www:/data1 --name web1 -it centos:7 /bin/bash
#-v选项可以在容器内创建数据卷
 
ls
echo "this is cc1" > /data1/abc.txt
exit
 
#返回宿主机进行查看
cat /var/www/abc.txt

(2)数据卷容器

如果需要在容器之间共享一些数据,最简单的方法就是使用数据卷容器。数据卷容器是一个普通的容器,专门提供数据卷给其他容器挂载使用。

例:

创建一个容器作为数据卷容器

docker run --name web2 -v /data1 -v /data2 -it centos:7 /bin/bash
echo "this is web2" > /data1/abc.txt
echo "THIS IS WEB2" > /data2/ABC.txt

使用 --volumes-from来挂载web2容器中的数据卷到新的容器

docker run -it --volumes-from web2 --name web3 centos:7 /bin/bash
cat /data1 /abc.txt
cat /data2/ABC.txt

(3)端口映射

在启动容器的时候,如果不指定对应的端口,在容器外是无法通过网络来访问容器内的服务。端口映射机制将容器内的服务提供给外部网络访问,实质上就是将宿主机的端口映射到容器中,使得外部网络访问宿主机的端口便可访问容器内的服务。

docker run -d --name test1 -P nginx
#随机映射端口( 从32768开始)
docker run -d --name test2 -p 43000:80 nginx
#指定映射端口

 (4)容器互联(使用centos镜像)

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

例:

docker run -itd -P --name xx1 centos:7 /bin/bash

创建并运行接收容器取名xx2,使用--1ink选项指定连接容器以实现容器互联

docker run -itd -P --name xx2 --link xx1:xx2 centos:7 /bin/bash

进xx2容器,ping xxl

docker exec -it xx2 bash

二、实验

1.Docker资源控制

(1)设置CPU使用率上限

进行CPU压力测试

编写一个脚本:

 

 查看脚本占用CPU资源

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

 可以看到CPU占用率接近50%,cgroups对CPU的控制起了效果

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

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

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

容器c1

 

 容器c2

 查看容器运行状态(动态更新)

CPU总和是400%。因为虚拟机使用的是4核,而且C1和C2的CPU使用百分比约为1:2

 (3)设置容器绑定指定的CPU

已分配虚拟机4个CPU核数

 创建容器

只允许cc1容器使用第2个和第4个CPU

 

 进入容器

安装依赖包

 安装压力测试工具

  进行压力测试

 执行 top 命令

 再按 1 查看CPU使用情况,只有第2个和第4个CPU被使用

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

创建容器,并限制写速度

可以看到写的速度被限制了

清理docker占用的磁盘空间:

用于清理磁盘,删除关闭的容器、无用的数据卷和网络

2.Docker数据管理 

(1) 数据卷

先下载一个镜像

 宿主机目录/var/www挂载到容器中的/data1。

注意:宿主机本地目录的路径必须是使用绝对路径。如果路径不存在,Docker会自动创建相应的路径。

文件内容一样

 (2)数据卷容器

创建一个容器作为数据卷容器

使用 --volumes-from来挂载web2容器中的数据卷到新的容器

 是在上一个容器创建的文件,说明挂载成功

 (3)端口映射

  在启动容器的时候,如果不指定对应的端口,在容器外是无法通过网络来访问容器内的服务。端口映射机制将容器内的服务提供给外部网络访问,实质上就是将宿主机的端口映射到容器中,使得外部网络访问宿主机的端口便可访问容器内的服务。

 

 

 (4)  容器互联(使用centos镜像)

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

创建并运行源容器取名xx1

 创建并运行接收容器取名xx2,使用--1ink选项指定连接容器以实现容器互联

 进xx2容器,ping xxl

三、问题

1.docker容器故障导致大量日志集满,造成磁盘空间满

(1)解决方案
清除日志

#!/bin/bash
logs=$ (find /var/lib/docker/containers/ -name *-json.log*)
for log in $logs
do
cat /dev/null > $log
done

2、当日志占满之后如何处理

###设置docker日志文件数量及每个日志大小
 vim /etc/docker/daemon.json
{
"registry-mirrors": ["http://f613ce8f.m.daocloud.io"],
"log-driver": "json-file",   #我的一日志格式
"log-opts": { "max-size" : "500m", "max-file" : "3"}   日志的参数最大500M   我最大容器中有三个日志文件 每个日志文件大小是500M
}
修改完需要重新加载  systemctl daemon-reload

四、总结

清理docker占用的磁盘空间:

docker system prune -a			#可以用于清理磁盘,删除关闭的容器、无用的数据卷和网络

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构:堆的实现

1.堆的概念 如果有一个关键码的集合 K { k1 &#xff0c;k2 &#xff0c;k3 &#xff0c;…&#xff0c;kn }&#xff0c;把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中&#xff0c;并且 k(i) < k(i*21) 和 k(i) < k(i*22)&#xff0c; i 0 &#xff…

BUUCTF [安洵杯 2019]easy_serialize_php 1 详细讲解

题目来自buuctf&#xff0c;这是一题关于php序列化逃逸的题 1. 题目 题目给出的代码 <?php$function $_GET[f];function filter($img){$filter_arr array(php,flag,php5,php4,fl1g);$filter /.implode(|,$filter_arr)./i;return preg_replace($filter,,$img); }if($_S…

炬芯科技发布全新第二代智能手表芯片,引领腕上新趋势!

2023年7月&#xff0c;炬芯科技宣布全新第二代智能手表芯片正式发布。自2021年底炬芯科技推出第一代的智能手表芯片开始便快速获得了市场广泛认可和品牌客户的普遍好评。随着技术的不断创新和突破&#xff0c;为了更加精准地满足市场多元化的变幻和用户日益增长的体验需求&…

localhost:8080 is already in use

报错原因&#xff1a;本机的8080端口号已经被占用。因为机器的空闲端口号是随机分配的&#xff0c;而idea默认启动的端口号是8080,所以是存在这种情况。 对于这个问题&#xff0c;我们只需要重启idea或者修改项目的启动端口号即可。 更推荐第二种。对于修改项目启动端口号&…

vscode | linux | c++ intelliense 被弃用解决方案

每日一句&#xff0c;vscode用的爽是爽&#xff0c;主要是可配置太强了。如果也很会研究&#xff0c;可以直接去咸鱼接单了 废话少说&#xff0c;直接整。 用着用着说是c intelliense被弃用&#xff0c;很多辅助功能无法使用&#xff0c;像查看定义、查看引用、函数跳转、智能提…

Unity智慧园区夜景制作

近期使用Unity做了一个智慧园区场景的demo&#xff0c;初步了解了3D开发的一些步骤和知识&#xff0c;以下为制作的步骤&#xff0c;比较简略&#xff0c;备忘&#xff1a; 1. 制作前的设计分析&#xff1a; 1. 分析日光角度&#xff0c;阴影长度&#xff0c;效果 2. 分析冷暖…

前后端分离------后端创建笔记(10)用户修改

本文章转载于【SpringBootVue】全网最简单但实用的前后端分离项目实战笔记 - 前端_大菜007的博客-CSDN博客 仅用于学习和讨论&#xff0c;如有侵权请联系 源码&#xff1a;https://gitee.com/green_vegetables/x-admin-project.git 素材&#xff1a;https://pan.baidu.com/s/…

linux——mysql的高可用MHA

目录 一、概述 一、概念 二、组成 三、特点 四、工作原理 二、案例 三、构建MHA 一、基础环境 二、ssh免密登录 三、主从复制 master slave1 四、MHA安装 一、环境 二、安装node 三、安装manager 一、概述 一、概念 MHA&#xff08;MasterHigh Availability&a…

并发编程系列-CompletableFuture

利用多线程来提升性能&#xff0c;实质上是将顺序执行的操作转化为并行执行。仔细观察后&#xff0c;你还会发现在顺序转并行的过程中&#xff0c;一定会牵扯到异步化。举个例子&#xff0c;现在下面这段示例代码是按顺序执行的&#xff0c;为了优化性能&#xff0c;我们需要将…

哈工大开源“活字”对话大模型

一、介绍 大规模语言模型&#xff08;LLM&#xff09;在自然语言处理的通用领域已取得了令人瞩目的成功。对于广泛的应用场景&#xff0c;这种技术展示了强大的潜力&#xff0c;学术界和工业界的兴趣也持续升温。哈工大自然语言处理研究所30余位老师和学生参与开发了通用对话大…

数据库概述、部署MySQL服务、必备命令、密码管理、安装图形软件、SELECT语法 、筛选条件

Top NSD DBA DAY01 案例1&#xff1a;构建MySQL服务器案例2&#xff1a;密码管理案例3&#xff1a;安装图形软件案例4&#xff1a;筛选条件 1 案例1&#xff1a;构建MySQL服务器 1.1 问题 在IP地址192.168.88.50主机和192.168.88.51主机上部署mysql服务练习必备命令的使用 …

性能测试压力曲线模型分析

性能测试模压力曲线&#xff1a; 曲线图关键点介绍&#xff1a; 横轴&#xff1a;从左到右表现了Number of Concurrent Users&#xff08;并发用户数&#xff09;的不断增长。 纵轴&#xff1a;分别表示Utilization&#xff08;资源的利用情况&#xff0c;包括硬件资源和软件…

Android Framework 动态更新插拔设备节点执行权限

TF卡设备节点是插上之后动态添加&#xff0c;所以不能通过初始化设备节点权限来解决&#xff0c;需要监听TF插入事件&#xff0c;在init.rc 监听插入后动态更新设备节点执行权限 添加插拔TF卡监听 frameworks/base/services/core/java/com/android/server/StorageManagerServic…

Vue3组件库

Vue组件库 ViteVue3TypescriptTSX 1、项目搭建 1.1、创建项目&#xff08;yarn&#xff09; D:\WebstromProject>yarn create vite yarn create v1.22.19 [1/4] Resolving packages... [2/4] Fetching packages... [3/4] Linking dependencies... [4/4] Building fresh pa…

MySQL8安装和删除教程 下载源码 保姆级(Windows)

删除 停止Mysql服务 管理员的权限来运行cmd&#xff0c;输入 net stop MySQL80 注意你电脑上的MySQL服务不一定是MySQL80,MySQL80是默认的&#xff0c;不是怎么办?在services.msc中找即可 下载一个小工具 geek:Geek下载打开软件&#xff0c;在列表中找到图片中的两项 sc…

【微服务技术一】Eureka、Nacos、Ribbon(配置管理、注册中心、负载均衡)

微服务技术一 技术栈图一、注册中心Eureka概念&#xff1a;搭建EurekaServer服务注册服务发现&#xff08;消费者对提供者的远程调用&#xff09; 二、Ribbon负载均衡负载均衡的原理&#xff1a;LoadBalanced负载均衡的策略&#xff1a;IRule懒加载 三、Nacos注册中心Nacos的安…

excel中定位条件,excel中有哪些数据类型、excel常见错误值、查找与替换

一、如何定位条件 操作步骤&#xff1a;开始 - 查找和选择 - 定位条件&#xff08;ctrl G 或 F5&#xff09; 注&#xff1a;如果F5不可用&#xff0c;可能是这个快捷键被占用了 案例&#xff1a;使用定位条件选择取余中空单元格&#xff0c;填入100&#xff0c;按组合键ct…

【MySQL】MySQL不走索引的情况分析

未建立索引 当数据表没有设计相关索引时&#xff0c;查询会扫描全表。 create table test_temp (test_id int auto_incrementprimary key,field_1 varchar(20) null,field_2 varchar(20) null,field_3 bigint null,create_date date null );expl…

Python源码05:使用Pyecharts画词云图图

**Pyecharts是一个用于生成 Echarts 图表的 Python 库。Echarts 是一个基于 JavaScript 的数据可视化库&#xff0c;提供了丰富的图表类型和交互功能。**通过 Pyecharts&#xff0c;你可以使用 Python 代码生成各种类型的 Echarts 图表&#xff0c;例如折线图、柱状图、饼图、散…

通过 Amazon SageMaker JumpStart 部署 Llama 2 快速构建专属 LLM 应用

来自 Meta 的 Llama 2 基础模型现已在 Amazon SageMaker JumpStart 中提供。我们可以通过使用 Amazon SageMaker JumpStart 快速部署 Llama 2 模型&#xff0c;并且结合开源 UI 工具 Gradio 打造专属 LLM 应用。 Llama 2 简介 Llama 2 是使用优化的 Transformer 架构的自回归语…