使用場景
容器運行時默認是不限制資源使用的剑按,就是說容器可以盡可能的使用主機的資源源弦蹂;但是在多個容器運行時救恨,資源限制還是很有必要的缀匕,下面我們介紹一下在docker compose 管理的多容器使用場景:
- 多容器應(yīng)用:在微服務(wù)架構(gòu)中纳决,多個服務(wù)同時運行,需確保每個服務(wù)的資源使用不影響其他服務(wù)乡小。
- 性能測試:在進行壓力測試時阔加,限制資源使用可模擬實際運行環(huán)境,避免不必要的資源競爭满钟。
- 開發(fā)環(huán)境:在本地開發(fā)中胜榔,資源限制有助于防止開發(fā)過程中的資源過度消耗。
演示環(huán)境配置
限制容器對CPU的使用
在沒有特殊說明的情況下湃番,會在同一目錄中操作夭织。
1. 創(chuàng)建容器壓測鏡像:
$ 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秒后結(jié)束任務(wù)
2. 使用docker-compose啟動壓測服務(wù)
$ 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:必須保證容器至少可以分配資源數(shù)量;以上配置是宿主機必須有1024m的內(nèi)存可分配給stress容器纬向,否則不啟動或啟動失敗择浊。
3. 驗證
根據(jù)以上兩步驟的配置啟動容器
$ 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命令很容易看出來琢岩。
## 進入測試容器內(nèi)部
$ 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返回。
限制容器對內(nèi)存的使用
和CPU限制的方法一樣师脂,舉一反三
參考:
stress:https://www.geeksforgeeks.org/linux-stress-command-with-examples/
docker-compose: https://www.geeksforgeeks.org/linux-stress-command-with-examples/
結(jié)論
合理使用 Docker Compose 的資源限制功能担孔,能夠提升應(yīng)用的穩(wěn)定性和性能,降低成本吃警。通過有效的驗證手段糕篇,確保資源限制設(shè)置的有效性,是良好容器管理的關(guān)鍵酌心。