使用场景
容器运行时默认是不限制资源使用的,就是说容器可以尽可能的使用主机的资源源;但是在多个容器运行时,资源限制还是很有必要的,下面我们介绍一下在docker compose 管理的多容器使用场景:
- 多容器应用:在微服务架构中,多个服务同时运行,需确保每个服务的资源使用不影响其他服务。
- 性能测试:在进行压力测试时,限制资源使用可模拟实际运行环境,避免不必要的资源竞争。
- 开发环境:在本地开发中,资源限制有助于防止开发过程中的资源过度消耗。
演示环境配置
限制容器对CPU的使用
在没有特殊说明的情况下,会在同一目录中操作。
1. 创建容器压测镜像:
$ cat Dockerfile
FROM ubuntu:latest
RUN apt-get update && \
apt-get install stress
CMD ["stress", "--cpu", "4", "--timeout", "600"]
stress --cpu 4 #模拟4个CPU核心的满载负载
--timeout 600 #600秒后结束任务
2. 使用docker-compose启动压测服务
$ cat docker-compose.yaml
version: '3.8'
services:
stress:
build:
context: .
deploy:
resources:
limits:
cpus: '5'
memory: 2048M
reservations:
cpus: '1'
memory: 1024M
配置说明:
YAML文件中,resources配置项可以限制容器的物理资源使用。配置如下:
- limits:限制容器可使用的最大物理资源。
- reservations:必须保证容器至少可以分配资源数量;以上配置是宿主机必须有1024m的内存可分配给stress容器,否则不启动或启动失败。
3. 验证
根据以上两步骤的配置启动容器
$ docker compose up
[+] Running 1/1
✔ Container benchmark-stress-1 Recreated 0.1s
Attaching to stress-1
stress-1 | stress: info: [1] dispatching hogs: 4 cpu, 0 io, 0 vm, 0 hdd
使用docker stats可以看到CPU使用为400%
$ docker stats
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
6702255b11f7 benchmark-stress-1 399.91% 1.684MiB / 2GiB 0.08% 3.67kB / 0B 0B / 0B 5
然后我们将limit cpu改成“3”,再次启动测试容器
## 修改resource limit cpu: 3
...
deploy:
resources:
limits:
cpus: '3'
...
## 启动测试容器
$ docker compose up
[+] Running 1/0
✔ Container benchmark-stress-1 Created 0.0s
Attaching to stress-1
stress-1 | stress: info: [1] dispatching hogs: 4 cpu, 0 io, 0 vm, 0 hdd
## cpu使用300%
$ docker stats
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
f5be0d98f266 benchmark-stress-1 298.55% 1.051MiB / 2GiB 0.05% 3.14kB / 0B 0B / 0B 5
说明一下:
此处的298.55%不是说明使用了3个核,而是使用'stress --cpu 4'指定的4个核的总和的300%,也就是4*75%=300%
使用top命令很容易看出来。
## 进入测试容器内部
$ sudo docker compose exec stress bash
root@f5be0d98f266:/# top
top - 08:59:26 up 10 days, 2:05, 0 user, load average: 4.03, 3.74, 2.59
Tasks: 7 total, 5 running, 2 sleeping, 0 stopped, 0 zombie
%Cpu(s): 1.2 us, 0.0 sy, 0.0 ni, 98.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 515748.2 total, 504690.7 free, 8700.2 used, 5422.7 buff/cache
MiB Swap: 2048.0 total, 2030.2 free, 17.8 used. 507048.1 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
10 root 20 0 3620 0 0 R 74.6 0.0 3:41.51 stress
7 root 20 0 3620 0 0 R 74.3 0.0 3:42.02 stress
8 root 20 0 3620 0 0 R 74.3 0.0 3:41.54 stress
9 root 20 0 3620 0 0 R 74.3 0.0 3:41.44 stress
可以分别将resource limit cpu改成2或4分别看一下top返回。
限制容器对内存的使用
和CPU限制的方法一样,举一反三
参考:
stress:https://www.geeksforgeeks.org/linux-stress-command-with-examples/
docker-compose: https://www.geeksforgeeks.org/linux-stress-command-with-examples/
结论
合理使用 Docker Compose 的资源限制功能,能够提升应用的稳定性和性能,降低成本。通过有效的验证手段,确保资源限制设置的有效性,是良好容器管理的关键。