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			#可以用于清理磁盘,删除关闭的容器、无用的数据卷和网络

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

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

相关文章

[论文笔记]Glancing Transformer for Non-Autoregressive Neural Machine Translation

引言 这是论文Glancing Transformer for Non-Autoregressive Neural Machine Translation的笔记。 传统的非自回归文本生成速度较慢,因为需要给定之前的token来预测下一个token。但自回归模型虽然效率高,但性能没那么好。 这篇论文提出了Glancing Transformer,可以只需要一…

windows常用shell命令大全

简介 基于鼠标操作的后果就是OS界面外观发生改变, 就得多花学习成本。更主要的是基于界面引导Path与命令行直达速度是难以比拟的。另外Geek很大一部分是键盘控,而非鼠标流的。 整理Windows的常用Shell命令,一方面帮助深入学习Mysql&#xf…

Android app专项测试之耗电量测试

前言 耗电量指标 待机时间成关注目标 提升用户体验 通过不同的测试场景,找出app高耗电的场景并解决 01、需要的环境准备 1、python2.7(必须是2.7,3.X版本是不支持的) 2、golang语言的开发环境 3、Android SDK 此三个的环境搭建这里就不详细说了&am…

【Linux】多线程1——线程概念与线程控制

文章目录 1. 线程概念什么是线程Linux中的线程线程的优点线程的缺点线程的独立资源和共享资源 2. 线程控制Linux的pthread库用户级线程 📝 个人主页 :超人不会飞)📑 本文收录专栏:《Linux》💭 如果本文对您有帮助&…

Opencv-C++笔记 (17) : 模板匹配

文章目录 1--概念2-- 方法3 结果3.1 ROI区域的获取使用自适应目标匹配 1–概念 opencv 提供了一个专门用于模板匹配的函数 cv::matchTemplate();其调用方式如下: void cv::matchTemplate(cv::InputArray image, // 用于搜索的输入图像, 8U 或 32F, 大小 W-Hcv::Inpu…

docker 学习--03 环境安装(本人使用的win10 Linux也是在win10下模拟)

docker 学习–03 环境安装(本人使用的win10 Linux也是在win10下模拟) docker 学习-- 01 基础知识 docker 学习-- 02 常用命令 文章目录 docker 学习--03 环境安装(本人使用的win10 Linux也是在win10下模拟)[TOC](文章目录) 1. wi…

WPS-0DAY-20230809的分析和利用复现

WPS-0DAY-20230809的分析和初步复现 一、漏洞学习1、本地复现环境过程 2、代码解析1.htmlexp.py 3、通过修改shellcode拿shell曲折的学习msf生成sc 二、疑点1、问题2、我的测试测试方法测试结果 一、漏洞学习 强调:以下内容仅供学习和测试,一切行为均在…

【C++深入浅出】初识C++上篇(关键字,命名空间,输入输出,缺省参数,函数重载)

目录 一. 前言 二. 什么是C 三. C关键字初探 四. 命名空间 4.1 为什么要引入命名空间 4.2 命名空间的定义 4.3 命名空间使用 五. C的输入输出 六. 缺省参数 6.1 缺省参数的概念 6.2 缺省参数的分类 七. 函数重载 7.1 函数重载的概念 7.2 函数重载的条件 7.3 C支…

ML-fairness-gym入门教学

1、ML-fairness-gym简介 ML-fairness-gym是一个探索机器学习系统长期影响的工具。可以用于评估机器学习系统的公平性和评估静态数据集上针对各种输入的误差度量的差异。开源网站:GitHub - google/ml-fairness-gym 2、安装ML-fairness-gym(Windows&…

概述、搭建Redis服务器、部署LNP+Redis、创建Redis集群、连接集群、集群工作原理

Top NSD DBA DAY09 案例1:搭建redis服务器案例2:常用命令限案例3:部署LNPRedis案例4:创建redis集群 1 案例1:搭建redis服务器 1.1 具体要求如下 在主机redis64运行redis服务修改服务运行参数 ip 地址192.168.88.6…

强训第32

选择 D B A A 发送TCP意思应该是已经建立了连接,会超时重传。在未建立连接的时候,会放弃该链接 C A 80端口是http A 交换机攻击主要有五种:VLAN跳跃攻击 生成树攻击 MAC表洪水攻击 ARP攻击 VTP攻击 B A 2^(32-26)2^(32-27)2^(32-27)128 减去…

【2022吴恩达机器学习课程视频翻译笔记】3.3代价函数公式

忙了一阵子,回来继续更新 3.3 代价函数公式 In order to implement linear regression. The first key step is first to define something called a cost function. This is something we’ll build in this video, and the cost function will tell us how well…