1、限制容器的资源
默认情况下,容器没有资源限制,可以使用主机内核调度程序允许的尽可能多的给定资源。
Docker提供了控制容器可以使用多少内存或CPU的方法,设置docker run命令的运行时配置标志。
2、内存
2.1 内存不足的风险
重要的是不要让正在运行的容器占用太多的主机内存。在Linux主机上,如果内核检测到没有足够的内存来执行重要的系统功能,它会抛出一个OOME
或者 Out Of Memory Exception
,并开始查杀进程以释放内存。任何进程都会被杀死,包括Docker和其他重要的应用程序。如果错误的进程被杀死,这可以有效地降低整个系统。
Docker尝试通过调整Docker守护程序上的OOM优先级来降低这些风险,以便它比系统上的其他进程更不可能被杀死。容器上的OOM优先级未调整。这使得单个容器被杀死的可能性比Docker守护程序或其他系统进程被杀死的可能性更大。您不应试图通过--oom-score-adj
在守护程序或容器上手动设置为极端负数或通过设置容器来绕过这些安全措施--oom-kill-disable
。
可以通过以下方式降低OOME导致系统不稳定的风险:
- 在将应用程序投入生产之前,请执行测试以了解应用程序的内存要求。
- 确保您的应用程序仅在具有足够资源的主机上运行。
- 限制容器可以使用的内存量,如下所述。
- 在Docker主机上配置交换时要小心。交换比内存更慢且性能更低,但可以提供缓冲以防止系统内存耗尽。
- 考虑将容器转换为服务,并使用服务级别约束和节点标签来确保应用程序仅在具有足够内存的主机上运行
2.2 限制容器对内存设有的设置
Docker可以强制执行硬内存限制,允许容器使用不超过给定数量的用户或系统内存或软限制,这允许容器使用尽可能多的内存,除非满足某些条件,例如内核检测到主机上的低内存或争用。当单独使用或设置了多个选项时,其中一些选项会产生不同的效果。
大部分的选项取正整数,跟着一个后缀b,k, m,g
表示字节,千字节,兆字节或千兆字节。
选项 | 描述 |
---|---|
-m or --memory= | 容器可以使用的最大内存量。如果设置此选项,则允许的最小值为4m。 |
–memory-swap * | 允许此容器交换到磁盘的内存量。 |
–memory-swappiness | 默认情况下,主机内核可以交换容器使用的匿名页面的百分比。您可以设置--memory-swappiness 0到100之间的值,以调整此百分比。 |
–memory-reservation | 允许您指定小于软件限制的软限制--memory ,当Docker检测到主机上的争用或内存不足时,该限制将被激活。如果使用--memory-reservation ,则必须将其设置为低于--memory 优先级。因为它是软限制,所以不保证容器不超过限制。 |
–kernel-memory | 容器可以使用的最大内核内存量。允许的最小值是4m。由于内核内存无法换出,因此内核内存不足的容器可能会阻塞主机资源,这可能会对主机和其他容器产生副作用。 |
–oom-kill-disable | 默认情况下,如果发生内存不足(OOM)错误,内核会终止容器中的进程。要更改此行为,请使用该–oom-kill-disable选项。仅在已设置-m/–memory 选项的容器上禁用OOM杀手。如果-m 未设置该标志,则主机可能会耗尽内存,并且内核可能需要终止主机系统的进程才能释放内存。 |