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兆字节的内存。
我们需要在服务配置中创建 deploy
和 resources
部分:
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 run
和 docker-compose
命令的情况。最后,我们使用 docker stats
控制了资源消耗。