Docker限制
前言
Docker系列文章:
此篇是Docker系列的第十篇,大家一定要按照我做的Demo都手敲一遍,印象会更加深刻的,马上就开始Kubernetes,加油!一起前行!
为什么要学习Docker Docker基本概念 Docker镜像基本原理 Docker容器数据卷 Dockerfile Docker单机网络上 Docker单机网络下 Docker单机网络实战 Docker隔离技术
隔离的问题
之前我们做的Demo都没有使用限制,这个时候我们使用stats命令来看下整体资源的使用情况;
docker stats

这个时候我们可以看到容器是可以使用到宿主机的所有的资源,这也是基于Linux Namespace的隔离机制相比于虚拟化技术的不足之处,就是对资源的隔离不够彻底,当一个宿主机上运行多个容器的时候,容器是共享宿主机的CPU和内存,这个时候如果某XX程序写了一个内存溢出的程序部署到容器中,这个时候就会影响到同一台宿主机的其他容器,那么对于这个问题我们该如何解决?
Cgroups
Linux Cgroups的全称是Linux Control Group。它最主要的作用,就是限制一个进程组能够使用的资源上限,包括CPU、内存、磁盘、网络带宽等等。这种机制可以根据需求把一系列系统任务及其子任务整合(或分隔)到按资源划分等级的不同组内,从而为系统资源管理提供一个统一的框架。简单说,Cgroups 可以限制、记录任务组所使用的物理资源。本质上来说,Cgroups 是内核附加在程序上的一系列钩子(hook),通过程序运行时对资源的调度触发相应的钩子以达到资源追踪和限制的目的。也就是说开发者可以通过 Cgroups 提供的精细化控制能力,限制某一个或者某一组进程的资源使用。
Cgroups的主要作用
实现 Cgroups 的主要目的是为不同用户层面的资源管理提供一个统一化的接口。从单个任务的资源控制到操作系统层面的虚拟化,Cgroups 提供了四大功能:
资源限制:Cgroups 可以对进程的资源总额进行限制;
优先级分配:通过分配的 CPU 时间片数量和磁盘 IO 带宽,实际上就等同于控制了任务运行的优先级;
资源统计:Cgroups 可以统计系统的资源使用量,比如 CPU 使用时长、内存用量等;
任务控制:Cgroups 可以对任务执行挂起、恢复等操作;
Cgroups文件系统探索
在Linux中,Cgroups给用户暴露出来的操作接口是文件系统,即它以文件和目录的方式组织在操作系统的/sys/fs/cgroup路径下,我们可以通过 mount 命令来查看 Cgroups 默认的挂载点:
mount | grep cgroup

输出的结果是一系列文件系统目录(如果你在自己的机器上没有看到这些目录,那你就需要自己去挂载Cgroups)。
让我们来使用ll命令看一下 /sys/fs/cgroup目录下包含哪些子目录,
ll /sys/fs/cgroup

在/sys/fs/cgroup目录包括cpuset、cpu、 memory这样的子目录,这些都是我这台机器当前可以被Cgroups进行限制的资源种类,接下来我们深入到memory的子目录下看下该目录下都有什么:

这些文件就是 Cgroups 的 memory 子系统中的根级设置。比如 memory.limit_in_bytes 中的数字用来限制进程的最大可用内存,memory.swappiness 中保存着使用 swap 的权重等等。
既然 Cgroups 是以这些文件作为 API 的,那么我就可以通过创建或者是修改这些文件的内容来限制进程的资源,接下来我们就来在展示下如何使用Cgroups。
如何使用Cgroups
该案例是限制进程可以用的CPU
在 /sys/fs/cgroup/cpu目录下新建一个名称为limit_cpu的目录;
#进入对应的目录
cd /sys/fs/cgroup/cpu
#新建文件夹
mkdir limit_cpu查看新建文件的目录,我们可以发现系统已经帮我们自动创建的以下目录,也就是说明了Cgroups 的文件系统会在创建文件目录的时候自动创建这些配置文件;
cd limit_cpu/
ls
image.png 我们通过配置将CPU周期限制为总量的十分之一;
#设置CPU period的周期的100ms(100000 us),该值也是默认的值
echo 100000 > cpu.cfs_period_us
#设置CPU的配额为10ms(10000 us),这样就是为总量的十分之一
echo 10000 > cpu.cfs_quota_us切换/usr/local目录下,新建cputime.c文件,编写如下相加程序;
#切换目录
cd /usr/local
#新建文件
touch cputime.c
#编辑文件
vim cputime.c
void main(){
unsigned int i, end;
end = 1024 * 1024 * 1024;
for(i = 0; i < end; )
{
i ++;
}
}编译程序
gcc cputime.c -o cputime使用不同的CPU限制,对比执行时间执行时间,通过对比我们可以发现限制的CPU使用时间大概是我们不使用限制下的时间的10倍,说明我们限制是生效的;
#CentOS系统需要安装libcgroup-tools包,才有cgroup配置命令
yum install -y libcgroup-tools.x86_64
#无限制下的CPU执行时间
time ./cputime
#使用limit_cpu限制下的CPU执行时间
time cgexec -g cpu:limit_cpu ./cputime
image.png
总结一下,Linux Cgroups 就是一个子系统目录加上一组资源限制文件的组合。
Docker限制探究
使用
使用如下命令启动,看到--cpu-period和--cpu-quota相信你会感到熟悉,这不是和我们上面使用限制CPU时候的参数配置基本上是一样,这个时候我们怀疑Docker的限制可能使用Cgroups的技术,接下来我们就探究下是不是这样的。
docker run -it -d --cpu-period=100000 --cpu-quota=20000 --memory 1000M --name limitcentos centos:latest
我们使用docker stats查看docker资源使用情况,会发现limitcentos的内存以及被限制到1000M了。
docker stats

原理探究
通过参数我们猜测可能Docker的限制可能使用Cgroups的技术,验证的最好的办法就是去找下Cgroups的目录结构,接下来我们分别看CPU的目录是否存在docker的限制。
进入Cgroups的cpu目录,我们会发现拖多出docker的目录;
cd /sys/fs/cgroup/cpu
ls
img 进入docker目录,看到蓝色部分我们会想到docker启动成功以后返回一串字符串,确实蓝色部分就是代表Docker,最后那张图是limitcentos启动后返回的,我们可以看到他们是一致的;

img 
img 进入limitcentos的对应的目录,我们会发现其目录和CPU限制的是基本一致的;

image.png 接下来我们查看下cfs_period_us和cfs_quota_us的内容是否和docker启动的参数一致,经过验证发现是一致的;
#查看周期
cat cpu.cfs_period_us
#查看限制
cat cpu.cfs_quota_us
image.png
经过demo验证,证实了Docker的限制就是使用Cgroups的技术。
结束
欢迎大家点点关注,点点赞!

Docker限制的更多相关文章
- docker——容器安装tomcat
写在前面: 继续docker的学习,学习了docker的基本常用命令之后,我在docker上安装jdk,tomcat两个基本的java web工具,这里对操作流程记录一下. 软件准备: 1.jdk-7 ...
- Docker笔记一:基于Docker容器构建并运行 nginx + php + mysql ( mariadb ) 服务环境
首先为什么要自己编写Dockerfile来构建 nginx.php.mariadb这三个镜像呢?一是希望更深入了解Dockerfile的使用,也就能初步了解docker镜像是如何被构建的:二是希望将来 ...
- Docker 第一篇--初识docker
已经多年不写博客, 看完<晓松奇谈>最后一期猛然觉醒, 决定仔细梳理下自己这几年的知识脉络. 既然决定写, 那么首先就从最近2年热门的开源项目Docker开始.Docker 这两年在国内很 ...
- 在docker中运行ASP.NET Core Web API应用程序(附AWS Windows Server 2016 widt Container实战案例)
环境准备 1.亚马逊EC2 Windows Server 2016 with Container 2.Visual Studio 2015 Enterprise(Profresianal要装Updat ...
- docker for mac 学习记录
docker基本命令 docker run -d -p 80:80 --name webserver nginx 运行容器并起别名 docker ps 展示目前启动的容器 docker ps -a 展 ...
- scrapy爬虫docker部署
spider_docker 接我上篇博客,为爬虫引用创建container,包括的模块:scrapy, mongo, celery, rabbitmq,连接https://github.com/Liu ...
- [原][Docker]特性与原理解析
Docker特性与原理解析 文章假设你已经熟悉了Docker的基本命令和基本知识 首先看看Docker提供了哪些特性: 交互式Shell:Docker可以分配一个虚拟终端并关联到任何容器的标准输入上, ...
- 开发者的利器:Docker 理解与使用
困扰写代码的机器难免会被我们安装上各种各样的开发工具.语言运行环境和引用库等一大堆的东西,长久以来不仅机器乱七八糟,而且有些相同的软件还有可能会安装不同的版本,这样又会导致一个项目正常运行了,却不小心 ...
- 使用python自动生成docker nginx反向代理配置
由于在测试环境上用docker部署了多个应用,而且他们的端口有的相同,有的又不相同,数量也比较多,在使用jenkins发版本的时候,不好配置,于是想要写一个脚本,能在docker 容器创建.停止的时候 ...
- 微服务与Docker介绍
什么是微服务 微服务应用的一个最大的优点是,它们往往比传统的应用程序更有效地利用计算资源.这是因为它们通过扩展组件来处理功能瓶颈问题.这样一来,开发人员只需要为额外的组件部署计算资源,而不需要部署一个 ...
随机推荐
- 基于Ubuntu下以Docker方式gitlab软件的部署
基于Ubuntu下以Docker方式gitlab软件的部署 目录 基于Ubuntu下以Docker方式gitlab软件的部署 1.安装Docker Compose 1.1 下载curl 1.2 安装c ...
- 为了提高开发效率,我实现了 uTools 的超级面板
前言 为了进一步提高开发工作效率,最近我们基于 electron 开发了一款媲美 uTools 的开源工具箱 rubick.该工具箱不仅仅开源,最重要的是可以使用 uTools 生态内所有开源插件!这 ...
- Unknown custom element: <...> - did you register the component correct?
之前用过的组件没有出现过任何问题,但偏偏在其他目录下引用就出问题了.组件的名称.import的路径都没任何问题,发现这是因为组件name填写不规范所导致的. 在定义组件的时候我们要严格按照官方文档要求 ...
- CentOS 8 按tab键不能自动补全问题解决方案
CentOS中按tab键不能自动补全问题解决办法 检查一下系统有没有安装bash-completion包 [root@Sonarqube ~]# rpm -lq bash-completion yum ...
- 使用curl断点续传下载文件
办公网络网速不是很好,使用Chrome下载一些软件时不时会中断,恶心的是Chrome居然不支持断点续传下载(为什么chrome的下载不支持断点续传呢?),迅雷自然是不能装的,那怎么办?还好我有大名鼎鼎 ...
- DRF之过滤排序分页异常处理
一.过滤 对于列表数据要通过字段来进行过滤,就需要添加 django-filter 模块 使用方法: # 1.注册,在app中注册 settings.py INSTALLED_APPS = [ 'dj ...
- Java:Java中equlas和==的区别
== 比较的是栈内存的地址值,用来判断两个对象的地址是否相同,即是否是指相同一个对象.比较的是真正意义上的指针操作. 基本数据类型如:byte,short,char,int,long,float,do ...
- 为什么socket是三次握手挥手却是四次
为知笔记地址: https://794e611d.wiz03.com/wapp/pages/view/share/s/1VjC4t215AfJ2knVCX1yXcay1HkR1O0_L4CF2w2CR ...
- centos安装报错:license information (license not accepted)
前言:在最近部署的centos系统发现个问题 出现报错:安装配置完成后,重启虚拟机出现license information (license not accepted) 截图: 解决方案: 在界 ...
- Maven | 把jar包安装到本地仓库
使用的场景 自己写的工具类想安装到本地 从Maven仓库中下载不下来的jar 使用的步骤 首先要保证自己的Maven配置全局环境变量,如果没有配置过maven全局变量,可以按照下面的步骤配置一下: 先 ...