限制容器对内存的使用-每天5分钟玩转docker容器技术(27)

author author     2022-09-04     245

关键词:

一个 docker host 上会运行若干容器,每个容器都需要 CPU、内存和 IO 资源。对于 KVM,VMware 等虚拟化技术,用户可以控制分配多少 CPU、内存资源给每个虚拟机。对于容器,Docker 也提供了类似的机制避免某个容器因占用太多资源而影响其他容器乃至整个 host 的性能。

内存限额

与操作系统类似,容器可使用的内存包括两部分:物理内存和 swap。 Docker 通过下面两组参数来控制容器内存的使用量。

  1. -m 或 --memory:设置内存的使用限额,例如 100M, 2G。

  2. --memory-swap:设置 内存+swap 的使用限额。

当我们执行如下命令:

docker run -m 200M --memory-swap=300M ubuntu

其含义是允许该容器最多使用 200M 的内存和 100M 的 swap。默认情况下,上面两组参数为 -1,即对容器内存和 swap 的使用没有限制。

下面我们将使用 progrium/stress 镜像来学习如何为容器分配内存。该镜像可用于对容器执行压力测试。执行如下命令:

docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 280M

--vm 1:启动 1 个内存工作线程。

--vm-bytes 280M:每个线程分配 280M 内存。

运行结果如下:

技术分享

因为 280M 在可分配的范围(300M)内,所以工作线程能够正常工作,其过程是:

  1. 分配 280M 内存。

  2. 释放 280M 内存。

  3. 再分配 280M 内存。

  4. 再释放 280M 内存。

  5. 一直循环......

如果让工作线程分配的内存超过 300M,结果如下:

技术分享

分配的内存超过限额,stress 线程报错,容器退出。

如果在启动容器时只指定 -m 而不指定 --memory-swap,那么 --memory-swap 默认为 -m 的两倍,比如:

docker run -it -m 200M ubuntu

容器最多使用 200M 物理内存和 200M swap。

内存限额就讨论到这里,下一节我们将学习如何限制容器对 CPU 资源的使用。

技术分享

限制容器对cpu的使用-每天5分钟玩转docker容器技术(28)

上节学习了如何限制容器对内存的使用,本节我们来看CPU。默认设置下,所有容器可以平等地使用hostCPU资源并且没有限制。Docker可以通过 -c 或 --cpu-shares 设置容器使用CPU的权重。如果不指定,默认值为1024。与内... 查看详情

限制容器的blockio-每天5分钟玩转docker容器技术(29)

前面学习了如何限制容器对内存和CPU的使用,本节我们来看BlockIO。BlockIO是另一种可以限制容器使用的资源。BlockIO指的是磁盘的读写,docker可通过设置权重、限制bps和iops的方式控制容器读写磁盘的带宽,下面分别讨论。注:目... 查看详情

限制容器的blockio-每天5分钟玩转docker容器技术(29)

前面学习了如何限制容器对内存和CPU的使用,本节我们来看BlockIO。BlockIO是另一种可以限制容器使用的资源。BlockIO指的是磁盘的读写,docker可通过设置权重、限制bps和iops的方式控制容器读写磁盘的带宽,下面分别讨论。注:目... 查看详情

hostpathvolume-每天5分钟玩转docker容器技术(148)

...使用hostPathVolume,因为这实际上增加了Pod与节点的耦合,限制了Pod的使用。不过那些需要访问Kubernetes或Docker内部数据(配置文件和二进制库)的应用则需要使用hostPath。比如kube-apiserver和kube-controller-ma 查看详情

如何运行容器?-每天5分钟玩转docker容器技术(22)

上一章我们学习了如何构建Docker镜像,并通过镜像运行容器。本章将深入讨论容器:学习容器的各种操作,容器各种状态之间如何转换,以及实现容器的底层技术。运行容器dockerrun 是启动容器的方法。在讨论Dockerfile时我们... 查看详情

如何配置healthcheck?-每天5分钟玩转docker容器技术(107)

容器状态是UP的,应用就是健康的吗?还真不一定!Docker只能从容器启动进程的返回代码判断其状态,而对于容器内部应用的运行情况基本没有了解。执行 dockerrun 命令时,通常会根据Dockerfile中的CMD或ENTRYPOINT启动一个进... 查看详情

每天5分钟玩转容器技术整理目录

原 写在最前面-每天5分钟玩转容器技术(1)容器生态系统-每天5分钟玩转容器技术(2) 容器生态系统(续)-每天5分钟玩转容器技术(3)运行第一个容器-每天5分钟玩转容器技术(4)【视频】运行第一个容器-每天5分钟玩... 查看详情

查看secret-每天5分钟玩转docker容器技术(156)

可以通过 kubectlgetsecret 查看存在的secret。显示有两个数据条目,kubectldescribesecret 查看条目的Key:如果还想查看Value,可以用 kubectleditsecretmysecret:然后通过base64将Value反编码:下节学习如何在Pod中使用Secret。书籍:... 查看详情

在docker中使用flannel-每天5分钟玩转docker容器技术(60)

上一节我们安装和配置了flannel,本节在Docker中使用flannel。配置Docker连接flannel编辑host1的Docker配置文件/etc/systemd/system/docker.service,设置 --bip 和 --mtu。650)this.width=650;"title="http://7xo6kd.com1.z0.glb.cloudd 查看详情

在docker中使用flannel-每天5分钟玩转docker容器技术(60)

上一节我们安装和配置了flannel,本节在Docker中使用flannel。配置Docker连接flannel编辑host1的Docker配置文件/etc/systemd/system/docker.service,设置 --bip 和 --mtu。这两个参数的值必须与/run/flannel/subnet.env中 FLANNEL_SUBNET  查看详情

使用公共registry-每天5分钟玩转docker容器技术(19)

保存和分发镜像的最直接方法就是使用DockerHub。DockerHub是Docker公司维护的公共Registry。用户可以将自己的镜像保存到DockerHub免费的repository中。如果不希望别人访问自己的镜像,也可以购买私有repository。除了DockerHub,quay.io是另一... 查看详情

如何使用secret?-每天5分钟玩转docker容器技术(108)

我们经常要向容器传递敏感信息,最常见的莫过于密码了。比如:docker run -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql在启动MySQL容器时我们通过环境变量 MYSQL_ROOT_PASSWORD 设置了MySQL的管理员密码。不过密码是以... 查看详情

搭建本地registry-每天5分钟玩转docker容器技术(20)

DockerHub虽然非常方便,但还是有些限制,比如:需要internet连接,而且下载和上传速度慢。上传到DockerHub的镜像任何人都能够访问,虽然可以用私有repository,但不是免费的。安全原因很多组织不允许将镜像放到外网。解决方案就... 查看详情

容器常用操作-每天5分钟玩转docker容器技术(25)

前面讨论了如何运行容器,本节学习容器的其他常用操作。stop/start/restart容器通过 dockerstop 可以停止运行的容器。容器在dockerhost中实际上是一个进程,dockerstop 命令本质上是向该进程发送一个SIGTERM信号。如果想快速... 查看详情

如何使用stack?-每天5分钟玩转docker容器技术(112)

定义好了stackYAML文件,就可以通过 dockerstackdeploy 命令部署应用。Docker会按照YAML的内容来创建各种资源。为了不重名,所有资源都会加上stack名称作为前缀,我们这里是 wpstack_*。部署完成后可以通过相关命令查看各种... 查看详情

elk完整部署和使用-每天5分钟玩转docker容器技术(90)

上一节已经部署了容器化的ELK,本节讨论如何将日志导入ELK并进行图形化展示。几乎所有的软件和应用都有自己的日志文件,容器也不例外。前面我们已经知道Docker会将容器日志记录到 /var/lib/docker/containers/<contarinerID>/<... 查看详情

elk完整部署和使用-每天5分钟玩转docker容器技术(90)

上一节已经部署了容器化的ELK,本节讨论如何将日志导入ELK并进行图形化展示。几乎所有的软件和应用都有自己的日志文件,容器也不例外。前面我们已经知道Docker会将容器日志记录到 /var/lib/docker/containers/<contarinerID>/<... 查看详情

跨主机使用rex-rayvolume-每天5分钟玩转docker容器技术(77)

上一节我们在docker1上的MySQL容器中使用了Rex-Rayvolumemysqldata,更新了数据库。现在容器已经删除,今天将演示在docker2中重新使用这个卷。在dokcer2上执行如下命令,启动MySQL容器:dockerrun--namemydb_on_docker2-vmysqldata:/var/lib/mysql-dmysql新... 查看详情