默认docker容器可以使用宿主机所有的内存和CPU,我们可以通过 docker run 来限制内存和CPU的使用。

有的系统内核不支持 Linux capabilities. 可以通过 docker info 命令来检查,如果系统内核不支持,会有如下报错

WARNING: No swap limit support

在linux主机上,如果kernel发现没有足够的内存了,会报出OOME或者Out Of Memory Exception,并且会kill 进程来释放内存,任何的进程都有可能会被kill,包括docker,这可能引起整个系统的宕机。

docker尝试通过调整docker守护进程的OOM优先级来减轻风险,以便它比系统上的其他进程更不可能被杀死。

选项 描述
-m or --memory= 容器可使用最大内存,最小内存为4m,单位可以为 b,k,m,g
--memory-swap* 容器可用于交换到硬盘的最大内存
--memory-swappiness 默认情况下,容器的内核可以交换出一定比例的匿名页,设置为从 0 到 100,0表示关闭
--memory-reservation 内存预留
--kernel-memory 核心内存限制。最小为 4M
--oom-kill-disable 是否阻止 OOM killer 杀死容器,默认没设置

--memory-swap 介绍

只有当--memory设置之后,--memory-swap 才会生效

1、如果--memory-swap设置为正整数,那么这两个--memory和 --memory-swap必须设置。--memory-swap表示可以使用的内存和交换总量,并--memory控制非交换内存使用的数量。因此,如果--memory="300m"--memory-swap="1g",容器可以使用300m的内存和700m(1g - 300m)交换。

2、如果--memory-swap设置为0,则忽略该设置,并将该值视为未设置。

3、如果--memory-swap设置为与值相同的值--memory,并且--memory设置为正整数,则不使用swap。

4、如果--memory-swap未设置并且--memory--memory设置,则如果主机容器配置了交换内存,则容器可以使用两倍于设置的交换。例如,如果--memory="300m"--memory-swap未设置,容器可以使用300m的内存和600m的交换。

5、如果--memory-swap明确设置为-1,则允许容器使用无限制交换,最多可达主机系统上可用的数量。

防止容器使用交换

如果--memory--memory-swap设置为相同的值,则可以防止容器使用任何交换。这是因为--memory-swap可以使用的组合内存和交换量,而--memory只是可以使用的物理内存量。

--memory-swappiness 细节

  • 值为0将关闭匿名页面交换。
  • 值100将所有匿名页面设置为可交换。
  • 默认情况下,如果未设置--memory-swappiness,则值将从主机继承。

--kernel-memory 细节

内核内存限制以分配给容器的总内存表示。请考虑以下方案:

  • 无限内存,无限内核内存:这是默认行为。
  • 无限内存,有限内核内存:当所有cgroup所需的内存量大于主机上实际存在的内存量时,这是合适的。您可以将内核内存配置为永远不会覆盖主机上可用的内容,而需要更多内存的容器需要等待它。
  • 有限的内存,无限的内核内存:整体内存有限,但内核内存不受限制。
  • 有限的内存,有限的内核内存:限制用户和内核内存对于调试与内存相关的问题非常有用。如果容器正在使用意外数量的任一类型的内存,则它会耗尽内存而不会影响其他容器或主机。在此设置中,如果内核内存限制低于用户内存限制,则内核内存不足会导致容器遇到OOM错误。如果内核内存限制高于用户内存限制,则内核限制不会导致容器遇到OOM。

当您打开任何内核内存限制时,主机会根据每个进程跟踪“高水位线”统计信息,因此您可以跟踪哪些进程(在本例中为容器)正在使用多余的内存。通过/proc/<PID>/status在主机上查看,可以在每个过程中看到这一点。

最新文章

  1. iOS小知识:使UIButton中的图片和文字实现左对齐
  2. 深入理解DOM事件机制系列第四篇——事件模拟
  3. 原生js-日历插件
  4. 【GPS】 数据围栏
  5. nginx配置中文域名解析
  6. 【干货】.NET开发通用组件发布(三) 简易数据采集组件
  7. LeetCode OJ 235. Lowest Common Ancestor of a Binary Search Tree
  8. linux常用命令 、查看日志、web排查
  9. 2、Libgdx配置你的开发环境(Eclipse,Intellij IDEA,NetBeans)
  10. Java基础 -- 深入理解Java类型信息(Class对象)与反射机制
  11. python3+selenium框架设计05-配置文件和浏览器引擎类
  12. Hash算法和一致性Hash算法
  13. 【awesome-dotnet-core-learning】(1)-Sprache-解析器构建库
  14. java transient 知识点学习
  15. 学JS的心路历程Day28 - PixiJS -基础(二)
  16. Inside NGINX: How We Designed for Performance &amp; Scale
  17. iOS 优秀开源框架 开源包 开发包 from : Podfile of chatsecure ---待完善
  18. Java模拟双色球彩票
  19. unity, 人物与移动跳台的交互
  20. C# 序列化详解,xml序列化,json序列化对比

热门文章

  1. Rainbond通过插件整合ELK/EFK,实现日志收集
  2. mac学习Python第一天:安装、软件说明、运行python的三种方法
  3. 【错误】NetBeans2007:Cannot find nbproject/build-impl.xml
  4. Counterfactual VQA: A Cause-Effect Look at Language Bias
  5. Obfuscated Gradients Give a False Sense of Security: Circumventing Defenses to Adversarial Examples
  6. oralce索引中INDEX SKIP SCAN 和 INDEX RANGE SCAN区别
  7. Java高级程序设计作业目录(作业笔记)
  8. SpringBoot中如何优雅的使用多线程
  9. dos 之 for循环(小“病毒”)
  10. 初识python: random 模块