1. 概述

在许多情况下,我们需要限制Docker主机上的资源使用。

在本教程中,我们将学习如何为Docker容器设置内存和CPU限制。

2. 使用 docker run 设置资源限制

我们可以直接通过 docker run 命令设置资源限制。这是一个简单的解决方案。然而,限制只适用于特定的镜像执行实例。

2.1 内存

例如,让我们将容器可以使用的内存限制为512兆字节。

为了限制内存,我们需要使用 m 参数:

$ docker run -m 512m nginx

我们还可以设置一个称为预留的软限制。

当Docker检测到主机内存不足时激活:

$ docker run -m 512m --memory-reservation=256m nginx

除了设置内存限制外,我们还可以定义容器可用的交换内存量。为此,请将 -memory-swap 参数设置为大于 -memory 限制的值:

$ docker run -m 512m --memory-swap 1g nginx

如果此参数分配为0,则处理为未定义,并忽略交换配置。但如果设置为-1,则容器可以使用主机可用容量的无限交换内存。

最后,如果两个参数具有相同的值,则容器无法使用交换内存。这是因为 -memory-swap 参数代表总内存可用性,包括物理内存和交换内存(RAM + swap)。

要将所做的配置传达给对方,我们可以使用 docker inspect <NAME|ID> 命令与 grep 过滤必要的信息:

$ docker inspect limit | grep MemorySwap
        "MemorySwap": 1073741824,
        "MemorySwappiness": null,

2.2 CPU

默认情况下,主机计算能力的访问是无限制的。我们可以使用 cpus 参数设置CPU限制。

让我们限制我们的容器最多使用两个CPU:

$ docker run --cpus=2 nginx

我们还可以指定CPU分配的优先级。

默认值为1024,数值越高表示优先级越高:

$ docker run --cpus=2 --cpu-shares=2000 nginx

类似于内存预留,当计算能力稀缺需要在竞争进程之间进行分割时,CPU份额起着主要作用。

另一种可能的设置是指定容器将可以访问哪些CPU或内核:

$ docker run --cpus=.5 --cpuset-cpus=1 nginx

在这种情况下,容器可以使用CPU 1的50%。如果主机拥有多个CPU,则可以指定范围,例如 [0-2],其中容器可以使用前三个CPU。另一个选项是定义一个列表,例如 [0, 2],这表示容器只能使用这些CPU。

此外,我们可以通过同时配置CFS周期和容器的配额来对容器进行配置。必须同时配置两者。 在下面的命令中,我们指定了容器可以使用50%的CPU(等同于--cpus=.5):

$ docker run --cpu-period=100000 --cpu-quota=50000 nginx

3. 使用 docker-compose 文件设置限制

我们可以使用 docker-compose 文件实现类似的结果。请记住,格式和可能性会因 docker-compose 版本而有所不同。

3.1 版本3及以上与 docker swarm

让我们给Nginx服务一些上面提到的限制,包括访问CPU 1的50%以及512兆字节的内存。作为预留,我们将设置CPU的四分之一和128兆字节的内存。

我们需要在服务配置中创建 deployresources 部分:

services:
  service:
    image: nginx
    deploy:
      resources:
        limits:
          cpus: '0.50'
          memory: 512M
        reservations:
          cpus: '0.25'
          memory: 128M
    cpuset: "1"
    ports:
      - "80:80"

在Docker Compose v3中,memswap_limit 参数直接不支持。请注意,cpuset-cpus 参数已更改,现在仅是 cpuset

为了利用 deploy 部分在 docker-compose 文件中,我们需要使用 docker stack 命令。

要将堆栈部署到swarm,我们运行 deploy 命令:

$ docker stack deploy --compose-file docker-compose.yml bael_stack

3.2 版本2与 docker-compose

在较旧的 docker-compose 版本中,我们可以在服务的主要属性级别上设置资源限制。

它们也有稍微不同的命名:

services:
  service:
    image: nginx
    mem_limit: 512m
    mem_reservation: 128M
    memswap_limit: 1g
    cpus: "0.5"
    cpuset: "1"
    ports:
      - "80:80"

要创建配置后的容器,我们需要运行 docker-compose 命令:

$ docker-compose up

4. 验证资源使用情况

在我们设置限制后,我们可以使用 docker stats 命令验证它们:

$ docker stats
CONTAINER ID        NAME                                             CPU %               MEM USAGE / LIMIT   MEM %               NET I/O             BLOCK I/O           PIDS
8ad2f2c17078        bael_stack_service.1.jz2ks49finy61kiq1r12da73k   0.00%               2.578MiB / 512MiB   0.50%               936B / 0B           0B / 0B             2

5. 总结

在这篇文章中,我们探讨了限制Docker对主机资源访问的方法。

我们研究了使用 docker rundocker-compose 命令的情况。最后,我们使用 docker stats 控制了资源消耗。


« 上一篇: 列出 Kafka 主题