如何限制Docker容器的内存和CPU
没有限制的容器将可以访问所有系统资源,从而可能使其他服务或者容器枯竭。为了解决这个问题,我们可能需要实施一些限制以确保所有容器均得到平等对待,或者确保某些容器变得比其他容器更平等。本教程将向我们展示如何限制Docker容器的内存和CPU。
在Ubuntu 16.04上设置限制
在Ubuntu 16.04上开箱即用的Docker安装我们无法设置限制。这是因为默认情况下禁用cgroups交换。尝试设置限制时,将出现以下错误。
WARNING: Your kernel does not support swap limit capabilities or the cgroup is not mounted. Memory limited without swap.
为解决此错误,我们可以通过执行以下操作来启用cgroup交换。
- 在文本编辑器中打开grub配置文件。
vi /etc/default/grub
- 添加以下行。如果GRUB_CMDLINE_LINUX可选件已经存在,请将其修改为包括以下值。
GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"
保存更改并退出文本编辑器。
更新grub配置。
sudo update-grub
- 在应用更改之前,我们需要重新启动Docker主机。
无极限运行
容器将自动访问其主机的整个RAM和CPU处理能力范围。如果运行的是单个容器,则可能不是问题。当我们开始托管多个容器时,每个容器将开始互相踩踏。
我们启动了NGINX容器来演示内存使用情况。从下面的屏幕截图中可以看到,容器的限制为8GB。
Docker统计信息输出
例如,我们可以应用内存限制来确保容器使用的RAM永远不会超过256 MB。我们将保持第一个容器运行,并在应用限制的情况下启动一个新容器。
具有两个正在运行的容器的Docker统计信息
限制记忆
为了限制内存,我们在启动容器时使用了内存标志。例如,我们使用以下方法将NGINX服务器限制为仅256 MB RAM。
docker run -d -p 8081:80 --memory="256m" nginx
这设置了硬限制。这意味着在任何情况下都不允许容器使用超过256 MB的RAM。另外,我们可以设置一个软限制。软限制可确保我们的容器在达到限制后仍可以请求更多内存,从而防止服务中断。
设置软限制的标志是内存保留。要设置256 MB或者RAM的软限制,我们将运行以下命令。
docker run -d -p 8081:80 --memory-reservation="256m" nginx
限制CPU
允许一个容器垄断Docker主机中的处理器可能会导致其他服务和容器饿死,从而导致服务中断。限制容器可以使用多少CPU。
限制核心数
我们可以使用cpus标志来限制容器可用的核心数量。
将容器锁定到特定核心
仅限制内核数量就意味着进程将使用任何可用的可用内核。对于大多数目的来说,这很好。但是,有时我们可能希望将容器锁定到特定的内核。
限制CPU时间
限制CPU时间可确保进程多长时间中断一次处理器或者一组内核。
份额和权重
与其说出计算器,也不是非常详细地说明一个进程可以拥有多少个内核或者CPU时间,不如将份额应用于进程。这样可以在需要时让更多关键容器具有高于CPU的优先级。