使用 Docker 的 cgroups(control groups)功能,可以对容器的资源使用进行精确控制,例如限制 CPU、内存、IO 和网络带宽等。以下是 Docker 中 cgroups 资源控制的实战教程。
一、Docker 支持的资源限制
1. CPU 相关
- CPU 权重(
--cpu-shares
):设置 CPU 运行优先级。 - CPU 配额(
--cpu-quota
):限制 CPU 使用的时间配额。 - CPU 核心限制(
--cpuset-cpus
):指定运行的 CPU 核心。
2. 内存相关
- 内存限制(
--memory
或-m
):限制容器最大内存使用量。 - 交换空间限制(
--memory-swap
):限制内存+swap 空间。 - 内存预留(
--memory-reservation
):为容器保留一部分内存。
3. IO 相关
- 读写速率限制(
--device-read-bps
和--device-write-bps
):限制设备的读写带宽。 - 读写 IOPS 限制(
--device-read-iops
和--device-write-iops
):限制设备的读写 IOPS。
二、常见资源限制命令
1. 限制 CPU 使用
示例:设置 CPU 权重
运行一个容器并设置 CPU 权重为 512:
docker run -d --cpu-shares=512 ubuntu sleep 1000
解释:--cpu-shares
默认值为 1024,较小值表示优先级较低。
示例:限制 CPU 时间配额
让容器只能使用 50% 的单核 CPU:
docker run -d --cpu-quota=50000 --cpu-period=100000 ubuntu sleep 1000
--cpu-quota
:CPU 时间片的配额,单位为微秒。--cpu-period
:时间片的周期,单位为微秒。
示例:绑定到指定 CPU 核心
让容器只运行在 CPU 核心 0 和 1:
docker run -d --cpuset-cpus="0,1" ubuntu sleep 1000
2. 限制内存使用
示例:限制内存和交换空间
限制容器使用最大 512MB 内存,并禁止使用 swap:
docker run -d --memory=512m --memory-swap=512m ubuntu sleep 1000
解释:--memory-swap
的值等于 --memory
表示禁止 swap。
示例:设置内存预留
为容器保留 256MB 内存,但允许使用更多:
docker run -d --memory-reservation=256m ubuntu sleep 1000
3. 限制 IO 使用
示例:限制设备读写带宽
限制容器对设备 /dev/sda
的读写速率:
docker run -d --device-read-bps /dev/sda:10mb --device-write-bps /dev/sda:5mb ubuntu sleep 1000
解释:
10mb
表示每秒最大读取 10MB 数据。
示例:限制设备读写 IOPS
限制容器对设备 /dev/sda
的 IOPS:
docker run -d --device-read-iops /dev/sda:1000 --device-write-iops /dev/sda:500 ubuntu sleep 1000
三、综合资源限制
同时限制 CPU、内存和 IO:
docker run -d \
--cpus="1.5" \
--memory=512m \
--memory-swap=1g \
--device-read-bps /dev/sda:10mb \
--device-write-bps /dev/sda:5mb \
ubuntu sleep 1000
解释:
--cpus
:限制容器最多使用 1.5 个 CPU。--memory
:限制最大内存为 512MB。--memory-swap
:限制内存+swap 总量为 1GB。
四、验证资源限制
使用 docker stats
查看容器资源使用情况:
docker stats
示例输出:
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
1234567890ab test_cpu 25.55% 256MiB / 512MiB 50.00% 0B / 0B 10MB / 5MB 5
五、调整运行中容器的资源限制
Docker 支持动态调整运行中容器的资源限制:
docker update \
--memory=1g \
--cpus=2 \
CONTAINER_ID
注意:
docker update
不能增加 CPU 或内存的超出系统限制范围。
六、基于 Docker Compose 的资源限制
使用 docker-compose.yml
文件配置资源限制:
version: "3.9"
services:
app:
image: ubuntu
command: sleep 1000
deploy:
resources:
limits:
cpus: "0.5"
memory: "256M"
reservations:
memory: "128M"
启动容器:
docker-compose up -d
七、常见问题及解决
- 容器无法启动:
- 确保资源限制值未超过系统资源。
- 检查宿主机内存、CPU 使用情况。
- 性能不佳:
- 检查容器实际资源需求,调整限制参数。
- 使用
docker stats
分析瓶颈。
- 内存溢出:
- 设置合理的
--memory
和--memory-swap
值,防止容器消耗过多内存。
- 设置合理的
通过以上实战,可以高效地利用 Docker 的 cgroups 资源限制功能,实现容器资源的精细化管理。这对多容器部署、高性能应用、和资源争夺问题特别有帮助!
发布者:myrgd,转载请注明出处:https://www.object-c.cn/4438