[一、Docker 资源管理原理](#一、Docker 资源管理原理)
[二、CPU 资源限制](#二、CPU 资源限制)
[2.1 限制 CPU 核数](#2.1 限制 CPU 核数)
[2.2 限制 CPU 时间片配额](#2.2 限制 CPU 时间片配额)
[2.3 指定运行 CPU 核心](#2.3 指定运行 CPU 核心)
[2.4 动态调整 CPU 限制](#2.4 动态调整 CPU 限制)
[3.1 限制最大内存](#3.1 限制最大内存)
[3.2 限制内存 + 交换空间](#3.2 限制内存 + 交换空间)
[3.3 限制内存使用比例](#3.3 限制内存使用比例)
[3.4 实时查看容器内存使用](#3.4 实时查看容器内存使用)
[四、IO 限制(磁盘 / 网络)](#四、IO 限制(磁盘 / 网络))
[4.1 限制设备写入速率](#4.1 限制设备写入速率)
[4.2 限制设备读取速率](#4.2 限制设备读取速率)
[4.3 限制 IO 操作次数(IOPS)](#4.3 限制 IO 操作次数(IOPS))
[4.4 实时监控 IO 性能](#4.4 实时监控 IO 性能)
[5.1 限制最大进程数](#5.1 限制最大进程数)
[5.2 限制最大打开文件数](#5.2 限制最大打开文件数)
[7.1 docker stats 实时监控](#7.1 docker stats 实时监控)
[7.2 docker system df 查看资源占用](#7.2 docker system df 查看资源占用)
[7.3 docker events 实时监听](#7.3 docker events 实时监听)
[案例:CPU 限制测试](#案例:CPU 限制测试)
前言
在生产环境中,如果不限制容器的资源使用,某个容器可能会因为内存泄漏或高负载占满宿主机资源,导致整台服务器宕机。
Docker 提供了一整套基于 Cgroups(Control Groups) 的资源控制机制,用于管理:
-
CPU 占用率
-
内存使用量
-
磁盘 IO 与带宽
本篇我们将详细讲解如何使用这些参数来 限制、监控和优化容器性能。
一、Docker 资源管理原理
Docker 的资源管理依赖于 Linux 内核的 Cgroups 控制组机制:
控制项 | 功能描述 |
---|---|
cpu | 限制 CPU 使用配额 |
memory | 限制容器最大内存 |
blkio | 限制磁盘 IO |
pids | 限制容器可创建的进程数 |
devices | 限制可访问的设备类型 |
💡 原理简述: Cgroups 可以理解为"资源阀门",Docker 在容器创建时通过参数为每个容器设定资源上限。
二、CPU 资源限制
2.1 限制 CPU 核数
docker run -d --cpus=1 --name web1 nginx
限制容器最多只能使用 1 个 CPU 核心。
2.2 限制 CPU 时间片配额
docker run -d --cpu-quota=50000 --cpu-period=100000 nginx
说明:
-
--cpu-period
:默认 100000 微秒(100ms) -
--cpu-quota
:允许的运行时间(单位微秒) 上例表示 CPU 占用率最多 50%
✅ 实战技巧: 若要限制容器 CPU 占用不超过 25%,可设置:
--cpu-quota=25000 --cpu-period=100000
2.3 指定运行 CPU 核心
docker run -d --cpuset-cpus="0,1" nginx
💡 限制容器只能使用第 0 和第 1 号 CPU 核心(适合多核场景的性能隔离)。
2.4 动态调整 CPU 限制
运行中的容器可修改参数:
docker update --cpus=2 web1
查看修改结果:
docker inspect web1 | grep -i cpu
三、内存限制
3.1 限制最大内存
docker run -d --memory=512m nginx
限制容器最大内存为 512MB。
3.2 限制内存 + 交换空间
docker run -d --memory=512m --memory-swap=1g nginx
说明:
-
--memory
:物理内存上限 -
--memory-swap
:物理内存 + swap 总和
例如:
-
--memory=512m --memory-swap=1g
→ 允许最多使用 512MB 内存 + 512MB swap -
--memory-swap=512m
→ 禁用 swap
3.3 限制内存使用比例
docker run -d --memory=256m --memory-reservation=128m nginx
当系统内存紧张时,容器会被限制在
--memory-reservation
值以下运行。
3.4 实时查看容器内存使用
docker stats
输出示例:
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O
a7b9c3a web1 12.4% 128MiB / 512MiB 25.0% 10MB/5MB 0B/0B
四、IO 限制(磁盘 / 网络)
Docker 通过 blkio(Block IO) 控制磁盘读写速率。
4.1 限制设备写入速率
docker run -d --device-write-bps /dev/sda:1mb nginx
限制写入速率为 1MB/s。
4.2 限制设备读取速率
docker run -d --device-read-bps /dev/sda:2mb nginx
限制读取速率为 2MB/s。
4.3 限制 IO 操作次数(IOPS)
docker run -d --device-write-iops /dev/sda:50 nginx
限制每秒最大 50 次写入操作。
4.4 实时监控 IO 性能
安装 iotop
或使用宿主机 iostat
命令:
yum install -y sysstat iotop
iostat -x 1
五、容器进程数与文件句柄数限制
5.1 限制最大进程数
docker run -d --pids-limit=100 nginx
容器最多可创建 100 个进程,防止 fork 炸弹。
5.2 限制最大打开文件数
docker run -d --ulimit nofile=1024:2048 nginx
格式:
soft:hard
soft
:警告阈值
hard
:最大限制
六、组合资源限制实战
一个典型的生产环境限制配置:
docker run -d \
--cpus=1 \
--memory=512m \
--memory-swap=1g \
--pids-limit=200 \
--device-write-bps /dev/sda:1mb \
--name web_limit \
nginx
✅ 结果:
CPU 使用 1 核
内存上限 512MB
可使用 1GB 交换空间
最多 200 个进程
IO 限速 1MB/s
七、容器资源监控与分析
7.1 docker stats 实时监控
docker stats
查看所有运行容器的 CPU、内存、IO 等资源信息。
7.2 docker system df 查看资源占用
docker system df
输出示例:
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 15 10 5.5GB 1.2GB (21%)
Containers 12 4 300MB 0B (0%)
Local Volumes 8 6 1.1GB 200MB (18%)
7.3 docker events 实时监听
docker events
💡 监控容器生命周期事件(启动、停止、销毁、重启)。
八、资源限制验证实验
案例:内存限制测试
运行一个不断分配内存的容器:
docker run -m 256m --name memtest busybox sh -c "while true; do dd if=/dev/zero of=/dev/null; done"
使用 docker stats
查看结果:
MEM USAGE / LIMIT MEM %
256MiB / 256MiB 100%
容器会被系统自动杀死(OOM)。
查看退出原因:
docker inspect -f '{{.State.OOMKilled}}' memtest
输出 true
表示因内存超限被杀死。
案例:CPU 限制测试
docker run -d --cpus=0.5 --name cpu_test busybox sh -c "while true; do :; done"
docker stats
显示 CPU 占用约为 50%。
九、性能调优建议
方向 | 建议 |
---|---|
CPU 限制 | 关键服务分配独立核心,防止资源争用 |
内存限制 | 对所有容器设置上限,避免 OOM |
IO 限制 | 限制日志型容器写入速率,防止卡顿 |
监控 | 使用 docker stats 或 ELK + cAdvisor 监控性能 |
清理 | 定期执行 docker system prune -a 清理无用资源 |
十、总结
通过本篇学习,你已掌握:
✅ Docker 资源限制机制(CPU、内存、IO、进程数)
✅ 实战命令与动态调整方式
✅ 使用 docker stats
、docker system df
进行性能监控
✅ 防止单容器资源滥用的优化策略