前言

Docker系列文章:

此篇是Docker系列的第十篇,大家一定要按照我做的Demo都手敲一遍,印象会更加深刻的,马上就开始Kubernetes,加油!一起前行!

  1. 为什么要学习Docker
  2. Docker基本概念
  3. Docker镜像基本原理
  4. Docker容器数据卷
  5. Dockerfile
  6. Docker单机网络上
  7. Docker单机网络下
  8. Docker单机网络实战
  9. Docker隔离技术

隔离的问题

之前我们做的Demo都没有使用限制,这个时候我们使用stats命令来看下整体资源的使用情况;

docker stats

img

这个时候我们可以看到容器是可以使用到宿主机的所有的资源,这也是基于Linux Namespace的隔离机制相比于虚拟化技术的不足之处,就是对资源的隔离不够彻底,当一个宿主机上运行多个容器的时候,容器是共享宿主机的CPU和内存,这个时候如果某XX程序写了一个内存溢出的程序部署到容器中,这个时候就会影响到同一台宿主机的其他容器,那么对于这个问题我们该如何解决?

Cgroups

Linux Cgroups的全称是Linux Control Group。它最主要的作用,就是限制一个进程组能够使用的资源上限,包括CPU、内存、磁盘、网络带宽等等。这种机制可以根据需求把一系列系统任务及其子任务整合(或分隔)到按资源划分等级的不同组内,从而为系统资源管理提供一个统一的框架。简单说,Cgroups 可以限制、记录任务组所使用的物理资源。本质上来说,Cgroups 是内核附加在程序上的一系列钩子(hook),通过程序运行时对资源的调度触发相应的钩子以达到资源追踪和限制的目的。也就是说开发者可以通过 Cgroups 提供的精细化控制能力,限制某一个或者某一组进程的资源使用。

Cgroups的主要作用

实现 Cgroups 的主要目的是为不同用户层面的资源管理提供一个统一化的接口。从单个任务的资源控制到操作系统层面的虚拟化,Cgroups 提供了四大功能:

  1. 资源限制:Cgroups 可以对进程的资源总额进行限制;

  2. 优先级分配:通过分配的 CPU 时间片数量和磁盘 IO 带宽,实际上就等同于控制了任务运行的优先级;

  3. 资源统计:Cgroups 可以统计系统的资源使用量,比如 CPU 使用时长、内存用量等;

  4. 任务控制:Cgroups 可以对任务执行挂起、恢复等操作;

Cgroups文件系统探索

在Linux中,Cgroups给用户暴露出来的操作接口是文件系统,即它以文件和目录的方式组织在操作系统的/sys/fs/cgroup路径下,我们可以通过 mount 命令来查看 Cgroups 默认的挂载点:

mount | grep cgroup

image.png

输出的结果是一系列文件系统目录(如果你在自己的机器上没有看到这些目录,那你就需要自己去挂载Cgroups)。

让我们来使用ll命令看一下 /sys/fs/cgroup目录下包含哪些子目录,

ll /sys/fs/cgroup

image.png

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


image.png

这些文件就是 Cgroups 的 memory 子系统中的根级设置。比如 memory.limit_in_bytes 中的数字用来限制进程的最大可用内存,memory.swappiness 中保存着使用 swap 的权重等等。

既然 Cgroups 是以这些文件作为 API 的,那么我就可以通过创建或者是修改这些文件的内容来限制进程的资源,接下来我们就来在展示下如何使用Cgroups。

如何使用Cgroups

该案例是限制进程可以用的CPU

  1. 在 /sys/fs/cgroup/cpu目录下新建一个名称为limit_cpu的目录;

    #进入对应的目录
    cd /sys/fs/cgroup/cpu
    #新建文件夹
    mkdir limit_cpu
  2. 查看新建文件的目录,我们可以发现系统已经帮我们自动创建的以下目录,也就是说明了Cgroups 的文件系统会在创建文件目录的时候自动创建这些配置文件;

    cd limit_cpu/
    ls

    image.png
  3. 我们通过配置将CPU周期限制为总量的十分之一;

    #设置CPU period的周期的100ms(100000 us),该值也是默认的值
    echo 100000 > cpu.cfs_period_us
    #设置CPU的配额为10ms(10000 us),这样就是为总量的十分之一
    echo 10000 > cpu.cfs_quota_us
  4. 切换/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 ++;
        }
    }
  5. 编译程序

    gcc cputime.c -o cputime
  6. 使用不同的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

image.png

原理探究

通过参数我们猜测可能Docker的限制可能使用Cgroups的技术,验证的最好的办法就是去找下Cgroups的目录结构,接下来我们分别看CPU的目录是否存在docker的限制。

  1. 进入Cgroups的cpu目录,我们会发现拖多出docker的目录;

    cd /sys/fs/cgroup/cpu
    ls

    img
  2. 进入docker目录,看到蓝色部分我们会想到docker启动成功以后返回一串字符串,确实蓝色部分就是代表Docker,最后那张图是limitcentos启动后返回的,我们可以看到他们是一致的;


    img

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


    image.png
  4. 接下来我们查看下cfs_period_us和cfs_quota_us的内容是否和docker启动的参数一致,经过验证发现是一致的;

    #查看周期
    cat cpu.cfs_period_us
    #查看限制
    cat cpu.cfs_quota_us

    image.png

经过demo验证,证实了Docker的限制就是使用Cgroups的技术。

结束

欢迎大家点点关注,点点赞!

Docker限制的更多相关文章

  1. docker——容器安装tomcat

    写在前面: 继续docker的学习,学习了docker的基本常用命令之后,我在docker上安装jdk,tomcat两个基本的java web工具,这里对操作流程记录一下. 软件准备: 1.jdk-7 ...

  2. Docker笔记一:基于Docker容器构建并运行 nginx + php + mysql ( mariadb ) 服务环境

    首先为什么要自己编写Dockerfile来构建 nginx.php.mariadb这三个镜像呢?一是希望更深入了解Dockerfile的使用,也就能初步了解docker镜像是如何被构建的:二是希望将来 ...

  3. Docker 第一篇--初识docker

    已经多年不写博客, 看完<晓松奇谈>最后一期猛然觉醒, 决定仔细梳理下自己这几年的知识脉络. 既然决定写, 那么首先就从最近2年热门的开源项目Docker开始.Docker 这两年在国内很 ...

  4. 在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 ...

  5. docker for mac 学习记录

    docker基本命令 docker run -d -p 80:80 --name webserver nginx 运行容器并起别名 docker ps 展示目前启动的容器 docker ps -a 展 ...

  6. scrapy爬虫docker部署

    spider_docker 接我上篇博客,为爬虫引用创建container,包括的模块:scrapy, mongo, celery, rabbitmq,连接https://github.com/Liu ...

  7. [原][Docker]特性与原理解析

    Docker特性与原理解析 文章假设你已经熟悉了Docker的基本命令和基本知识 首先看看Docker提供了哪些特性: 交互式Shell:Docker可以分配一个虚拟终端并关联到任何容器的标准输入上, ...

  8. 开发者的利器:Docker 理解与使用

    困扰写代码的机器难免会被我们安装上各种各样的开发工具.语言运行环境和引用库等一大堆的东西,长久以来不仅机器乱七八糟,而且有些相同的软件还有可能会安装不同的版本,这样又会导致一个项目正常运行了,却不小心 ...

  9. 使用python自动生成docker nginx反向代理配置

    由于在测试环境上用docker部署了多个应用,而且他们的端口有的相同,有的又不相同,数量也比较多,在使用jenkins发版本的时候,不好配置,于是想要写一个脚本,能在docker 容器创建.停止的时候 ...

  10. 微服务与Docker介绍

    什么是微服务 微服务应用的一个最大的优点是,它们往往比传统的应用程序更有效地利用计算资源.这是因为它们通过扩展组件来处理功能瓶颈问题.这样一来,开发人员只需要为额外的组件部署计算资源,而不需要部署一个 ...

随机推荐

  1. 复习Spring第一课--Spring的基本知识及使用

    关于Spring: spring容器是Spring的核心,该容器负责管理spring中的java组件, ApplicationContext ctx  = new ClassPathXmlApplic ...

  2. VLAN的基础介绍与使用方法

    一.VLAN概述与优势 二.VLAN的种类 三.VLAN的范围 四.VLAN的三种接口模式 五.VLAN的实例操作 一.VLAN概述与优势 VLAN(虚拟局域网)通过为子网提供数据链路连接来抽象出局域 ...

  3. 66.QT-线程并发、QTcpServer并发、QThreadPool线程池

    1.线程并发一个程序内部能拥有多个线程并行执行.一个线程的执行可以被认为是一个CPU在执行该程序.当一个程序运行在多线程下,就好像有多个CPU在同时执行该程序.总之,多线程即可以这么理解:多线程是处理 ...

  4. 重新整理 .net core 实践篇————网关中的身份签名认证[三十七]

    前言 简单整理一下网关中的jwt,jwt用于授权认证的,其实关于认证授权这块https://www.cnblogs.com/aoximin/p/12268520.html 这个链接的时候就已经写了,当 ...

  5. java list 分页

    /** * * @param list * @param pageNum * @param pageSize * @param <T> * @return 返回当前页数据 */ publi ...

  6. 精尽Spring Boot源码分析 - 日志系统

    该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...

  7. 使用Linux Deploy将闲置的安卓手机改造简易服务器

    本文将介绍我在自己闲置的小米4手机安装CentOS系统的过程.手机配置信息:MIUI 9开发板(方便ROOT).Android 6.架构 ARMv7(arm32) 准备工作 1.手机必须ROOT!!! ...

  8. Linux:修改Ubuntu环境变量后bash找不到

    1.问题显示 修改环境变量,导致命令全部失效  2.解决办法 #使用备份bin export PATH=/usr/bin:/bin  之后使用命令就可以了. 3.找到修改的环境变量 一般修改的环境变量 ...

  9. 在Intellij IDEA中新建Web项目

    1.点击左上角 文件(F) ,--> new  --> 项目 2.勾选下面的复选框,下一步就是给项目起名字和存放项目的位置 2.在Web文件下新建 clsses 和 lib文件夹:http ...

  10. 6.Java方法

    一.什么是方法 方法:要去做某件事情,而采取的一些解决办法( Java 中的方法是完成某些事情的) System.out.println(); //类(系统类) 对象(标准输出对象) 方法(print ...