如何限制Docker的资源分配

Database and Ruby, Python, History


我们有一些自动化的机子在跑 Docker,最近总是发现这些机子的 CPU 占用过高,导致这些机子直接掉线,甚至直接都没法 SSH 上去。由此,我们尝试去限制 Docker 的 CPU 分配。

针对 container

如果是针对某个特定的 container,可以用 docker run -it --cpus=".5" busybox bash 来限制该容器的资源。你也可以在 docker compose 文件里面限制,再docker compose up。可以参见 docker 的官网

针对 docker desktop

对于安装了 Docker desktop 的机子,可以在 settings 里面限制整个 Docker 占用的资源。在我的 Mac 上,可以通过下面的配置限制 CPU 分配。

如果以上都不行

如果你在 Linux 机器上,又没有安装 docker desktop,那只能够通过 Linux 的 cgroup 来限制资源分配了。Docker 是通过 cgroup 和 namespace 来进行资源限制和进程视图的。通过 namespace,我可以隔离出一个新的空间给 docker container。通过 cgroup,我们就可以限制分配给改进程的资源。

  1. 创建一个新的 systemctl unit。我的虚拟机上分配了 8 核,满载 CPU 应该是 800%。所以这里我限制成 600%,就还有资源给其他进程。
[Unit]
Description=Slice that limits docker resources
Before=slices.target

[Slice]
CPUAccounting=true
CPUQuota=600%
#Memory Management
MemoryAccounting=true
MemoryHigh=4G
MemoryMax=6G
  1. 通过 systemctl 加载这个 unit
systemctl start docker_limit.slice
  1. 修改/etc/docker/daemon.json文件
{
  "cgroup-parent": "docker_limit.slice"
}
  1. 重启 docker daemon
systemctl restart docker
  1. 验证。通过systemd-cgtop,可以观察到所有的 docker container 都加载到了docker_limit.slice单元下面了,CPU 峰值被限制到了 600%之下。
systemd-cgtop

Reference

https://unix.stackexchange.com/questions/537645/how-to-limit-docker-total-resources/550954#550954?newreg=00577d490bfc4144ac1b5d957ce3acf9