上一篇我们聊到了docker容器的单机编排工具docker-compose的简单使用,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13121678.html;今天我们主要来聊一聊docker容器的资源限制;通常情况下我们启动一个docker容器,其内存和CPU都是同宿主机一样大,这意味着该容器和宿主机共享相同大小的内存和CPU资源;这样一来容器正常情况下没有什么问题,假如容器里运行的进程特别爱吃内存,很可能存在把宿主机上的内存全部吃掉,触发内核OOM,从而导致docker daemon直接被内核杀死;为了避免这样的尴尬局面,对启动容器我们有必要对容器的资源进行限制;

  所谓OOM就是当系统上的应用申请内存资源时,发现申请不到内存,这个时候Linux内核就会启动OOM,内核将给系统上的所有进程进行评分,通过评分得分最高的进程就会被系统第一个干掉,从而腾出一些内存空间,如果腾出的内存空间还是不够该应用使用,它会继续杀得分第二高的,直到应用有足够的内存使用;一旦发生OOM,任何进程都有可能被杀死,包括docker daemon在内,为此,docker特定调整了docker daemon的oom优先级,以免发生oom被内核杀死,但是容器的oom优先级并未做任何调整;

  那么对于内存资源来讲,在启动为容器时,我们可以通过一些选项来指定容器的内存相关设置;如下图

  提示:-m 或 --memory 用来指定容器最大能够使用的内存大小,默认情况不指定表示共享物理宿主机的内存大小;--memory-swap 用来指定容器的内存和交换内存的总大小;对于这个参数的取值比较诡异;待会在说吧;--memory-swappiness该选项用来指定容器使用交换内存的倾向性,swap启用有个好处就是在内存不够使用的情况,它可以临时顶替一部分,但是性能会急剧下降;所以数字越大越早使用交换内存,数字越小越晚使用交换内存,取值在0-100之间;0不代表不是用交换内存,0表示能不用交换内存,则不用,但是在迫不得已的情况还是会使用的,100表示只要有一丝可以使用交换内存的希望,就使用交换内存;通常情况在运行容器的主机上不建议使用swap设备;swap交换分区如果一旦被激活,系统性能会急剧下降,建议直接禁用;--memory-reservation该选项用来指定给系统保留的内存空间大小;--kernel-memory用来指定给内核保留的内存大小;--oom-kill-disable该选项用于指定当发生oom时,是否禁用因oom而杀死该容器进程;

  提示:通常情况--memory-swap这个选项必须同--memory选项一起使用,不可用单独使用;

  示例:限制容器使用最大内存为256M

[root@docker_registry ~]# docker run --name test --rm -m 256M lorel/docker-stress-ng --vm 2

  提示:以上命令表示启动一个名为test的容器,限制该容器最大使用内存大小为256M;lorel/docker-stress-ng这个进行用来压测容器;--vm表示同时使用多少进程来做压测;

  验证:用docker stats看看我们启动test容器是否只能使用256M内存?

  提示:从上面的结果可以看到,在我们启动容器时,使用-m指定内存大小的容器limit的值就是我们指定的值,而对于没有用-m指定的容器,默认就是同宿主机内存大小一样;

  对于CPU来讲,默认情况启动容器时,不限制CPU的资源,此时容器是共享宿主机的CPU资源,也就是说默认情况宿主机上有几颗cpu核心,启动的容器就有多少颗核心;对于CPU这种可压缩资源,不会像内存那样,如果CPU满载,也不会导致某个容器崩溃,原因是因为cpu是可压缩资源;而不同于内存,内存属于不可压缩资源,如果申请不到内存,就会出现异常,出现oom;对启动容器来限制cpu资源,通常也是使用选项来限定;如下图

  提示:--cpus用来指定容器能够使用的最大cpu核心数,例如--cpus=1.5,就表示该容器最大能够使用1.5核的CPU资源,如果宿主机上有4颗CPU核心,那么该容器最多可把1.5颗核心跑满;这样说吧,如果宿主机上有4颗核心,那么该容器如果使用--cpus限定为1.5,那么该容器就只能使用宿主机上的百分之150的核心;--cpu-period 和--cpu-quota该选项在docker1.13以后基本废弃;--cpuset-cpus该选项用于指定容器能够在哪些CPU上运行;如果宿主机上有4颗CPU,--cpuset-cpus=2,3就表示该容器只能使用第2号cpu和第3号cpu;--cpu-shares该选项用于指定容器使用cpu的比例;比如宿主机上只有一个容器,而该容器启动时指定--cpu-shares=1024,则表示,如果没有其他容器,则它可以使用宿主机上的所有cpu资源,如果有第二个容器启动时,指定cpu-shares=512,那么第一个容器会从原来使用整个宿主机的cpu变为使用整个宿主机的cpu的2/3;以此类推,如果有第三个,第四个,他们使用cpu资源都是按照给定的比例动态调整;

  示例:第一个容器使用--cpu-shares=256;第二个容器使用--cpu-shares=512,看看当第一个容器启动后,看看cpu使用情况,然后第二个容器启动后再看看cpu使用情况

  提示:可以看到当第一个容器启动时,虽然设置的cpu-shares=256,但是它还是把所有核心几乎都跑满了;我们在跑一个容器看看,看看第二个容器启动后,第一个容器的cpu使用情况是否有变化?

  提示:从上面的结果看,t1和t2的cpu使用比例大概是1比2;总量还是400%并没有变化;

  示例:设置容器使用1.5个CPU核心

  提示:从上面的结果可以看到使用--cpus来限定容器使用的CPU资源,默认它会在每颗黑核心上都要使用一部分,但是重量不会超过150%;

  示例:限定容器使用CPU核心,只能在0号和3号核心上使用;

  提示:从上面的结果可以看到,限定t1容器只能使用0号和3号CPU后,1号和2号就基本不会被使用,总量也不会增加;

容器技术之Docker资源限制的更多相关文章

  1. linux容器技术和Docker

    linux容器技术和Docker 概述 Docker在一定程度上是LXC的增强版,早期的Docker使用LXC作为容器引擎,所以也可以说Docker是LXC的二次封装发行版,目前docker使用的容器 ...

  2. 容器技术与docker

    名词介绍 IaaS:基础设施即服务,要搭建上层数据应用,先得通过互联网获得基础性设施服务 PaaS:平台即服务,搭建平台,集成应用产品,整合起来提供服务 SaaS:软件即服务,通过网络提供程序应用类服 ...

  3. 容器技术之Docker镜像

    前文我们聊了下docker的基础使用方法,大概介绍了下docker的架构,管理镜像.运行容器.管理容器的一些相关命令说明:回顾请参考https://www.cnblogs.com/qiuhom-187 ...

  4. 容器技术|Docker三剑客之docker-compose

    三剑客简介 docker-machine docker技术是基于Linux内核的cgroup技术实现的,那么问题来了,在非Linux平台上是否就不能使用docker技术了呢?答案是可以的,不过显然需要 ...

  5. 容器技术|Docker三剑客之docker-machine

    docker-machine是什么? ocker-machine就是docker公司官方提出的,用于在各种平台上快速创建具有docker服务的虚拟机的技术,甚至可以通过指定driver来定制虚拟机的实 ...

  6. 容器技术之Docker基础入门

    前文我们了解了下LXC的基础用法以及图形管理工具LXC WEB Panel的简单使用,有兴趣的朋友可以参考https://www.cnblogs.com/qiuhom-1874/p/12904188. ...

  7. 容器技术之Docker网络

    上一篇博客我们主要聊了下docker镜像相关的说明以及怎样基于现有镜像制作镜像.分发镜像到docker仓库中的相关测试:回顾请参考https://www.cnblogs.com/qiuhom-1874 ...

  8. 容器技术之Docker常用命令说明

    前面我们聊了docker的基本概念.架构.镜像.网络.数据卷,回顾请参考https://www.cnblogs.com/qiuhom-1874/category/1766327.html:今天这篇博客 ...

  9. Docker容器技术-优化Docker镜像

    一.优化Docker镜像 1.降低部署时间 一个大的Docker应用是如何影响在新Docker宿主机上的部署时间. (1)编写Dockerfile创建一个大Docker镜像 [root@bogon ~ ...

随机推荐

  1. Python中ThreadLocal的理解与使用

    一.对 ThreadLocal 的理解 ThreadLocal,有的人叫它线程本地变量,也有的人叫它线程本地存储,其实意思一样. ThreadLocal 在每一个变量中都会创建一个副本,每个线程都可以 ...

  2. 仿开源框架从零到一完整实现高性能、可扩展的RPC框架 | 6个月做成教程免费送

    去年年就在写一本付费小册,今年年初基本上就写完了,本来预计计划是春节上线结果由于平台的原因一直拖着没上.五一前跟平台联系给的反馈是五月份能上,结果平台又在重构,停止小册的申请和上线,最后我考虑了一下决 ...

  3. eatwhatApp开发实战(十)

    android应用中,很少有一个activity的app,这次我们设置一个activity,通过listview的点击跳转并显示对应的商店信息. 首先创建类ShopInfoActivity,对应设置其 ...

  4. 中文分词工具——jieba

    汉字是智慧和想象力的宝库. --索尼公司创始人井深大 简介 在英语中,单词就是"词"的表达,一个句子是由空格来分隔的,而在汉语中,词以字为基本单位,但是一篇文章的表达是以词来划分的 ...

  5. 容器技术之Dockerfile (一)

    在前边的随笔中我们聊到了docker的基本命令,镜像,网络,存储卷以及基于现有容器制做docker镜像,相关随笔可参考https://www.cnblogs.com/qiuhom-1874/categ ...

  6. Java实现 LeetCode 833 字符串中的查找与替换(暴力模拟)

    833. 字符串中的查找与替换 对于某些字符串 S,我们将执行一些替换操作,用新的字母组替换原有的字母组(不一定大小相同). 每个替换操作具有 3 个参数:起始索引 i,源字 x 和目标字 y.规则是 ...

  7. Java实现蓝桥杯 最短路

    问题描述 给定一个n个顶点,m条边的有向图(其中某些边权可能为负,但保证没有负环).请你计算从1号点到其他点的最短路(顶点从1到n编号). 输入格式 第一行两个整数n, m. 接下来的m行,每行有三个 ...

  8. Java实现k个数乘(cheng)(自然数的k乘积问题)

    k个数乘(cheng) 题目描述 桐桐想把一个自然数N分解成K个大于l的自然数相乘的形式,要求这K个数按从小到大排列,而且除了第K个数之外,前面(K-l)个数是N分解出来的最小自然数.例如:N=24, ...

  9. C++实现网络寻路

    标题:网络寻路 X 国的一个网络使用若干条线路连接若干个节点.节点间的通信是双向的.某重要数据包,为了安全起见,必须恰好被转发两次到达目的地.该包可能在任意一个节点产生,我们需要知道该网络中一共有多少 ...

  10. java实现第三届蓝桥杯拼音字母

    拼音字母 在很多软件中,输入拼音的首写字母就可以快速定位到某个词条.比如,在铁路售票软件中,输入: "bj"就可以定位到"北京".怎样在自己的软件中实现这个功能 ...