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介绍
什么是微服务 微服务应用的一个最大的优点是,它们往往比传统的应用程序更有效地利用计算资源.这是因为它们通过扩展组件来处理功能瓶颈问题.这样一来,开发人员只需要为额外的组件部署计算资源,而不需要部署一个 ...
随机推荐
- 08-ADMM算法
08-ADMM算法 目录 一.ADMM 算法动机 二.对偶问题 三.对偶上升法 四.对偶分割 五.乘子法(增广拉格朗日函数) 5.1 步长为 $\rho$ 的好处 六.ADMM算法 6.1 ADMM ...
- 一个线上 Maven 诡异问题排查过程
å. 前言 现在的大部分 Java 应用基本都是通过 Maven 进行组织的,不论是分布式应用还是单体集群应用往往都会通过一个 父 POM 加若干子 POM 完成项目的组织.然而这种多应用多模块的拆分 ...
- HashMap 中7种遍历方式的性能分析
随着 JDK 1.8 Streams API 的发布,使得 HashMap 拥有了更多的遍历的方式,但应该选择那种遍历方式?反而成了一个问题. 本文先从 HashMap 的遍历方法讲起,然后再从性能. ...
- Vue3全局APi解析-源码学习
本文章共5314字,预计阅读时间5-15分钟. 前言 不知不觉Vue-next的版本已经来到了3.1.2,最近对照着源码学习Vue3的全局Api,边学习边整理了下来,希望可以和大家一起进步. 我们以官 ...
- 用户RFM模型及应用
RMF含义 R(Recency)(用户粘性,越小越好):用户最近一次交易时间的间隔.R值越大,表示用户交易发生的日期越久,反之则表示用户交易发生的日期越近 F(Frequency)(用户忠诚度,越大越 ...
- 『心善渊』Selenium3.0基础 — 16、Selenium对iframe表单的操作
目录 1.什么是iframe表单 2.iframe表单操作流程 3.iframe表单操作常用方法 (1)进入表单 (2)多表单切换 4.表单操作示例 1.什么是iframe表单 实际上就是HTML页面 ...
- .Net Core 常用开发工具(IDE和运行时、Visual Studio插件、Visual Studio Code插件)
IDE和运行时 组件名 描述 可选版本 推荐版本 Visual Studio Community 社区免费版 For Visual Studio 2017 For Visual Studio 2019 ...
- 流程自动化RPA,Power Automate Desktop系列 - 创建WPF程序安装包及升级包
一.背景 之前写过的几个WPF小工具,每次发布都需要给它打安装包和升级包,涉及到一些系列繁琐的手工操作,有了Power Automate Desktop,于是便寻思着能不能做成一个自动化的流来使用. ...
- uniapp 微信小程序 打开文件
uni.downloadFile({ url: item.url, success: (res) => { if (res.statusCode === 200) { uni.openDocum ...
- centos 8 gitlab 重置管理员的密码
登录gitlab安装服务器 由于 root 账户用的很少,所以我们容易忘记它的密码,但不代表它不重要,类似 linux 的 root 账户:一旦我们忘记了 root 账号的密码,我们需要知道重置的方法 ...