Docker 资源限制与性能优化(CPU / 内存 / IO 管控实战)
前言
一、Docker 资源管理原理
二、CPU 资源限制
2.1 限制 CPU 核数
2.2 限制 CPU 时间片配额
2.3 指定运行 CPU 核心
2.4 动态调整 CPU 限制
三、内存限制
3.1 限制最大内存
3.2 限制内存 + 交换空间
3.3 限制内存使用比例
3.4 实时查看容器内存使用
四、IO 限制(磁盘 / 网络)
4.1 限制设备写入速率
4.2 限制设备读取速率
4.3 限制 IO 操作次数(IOPS)
4.4 实时监控 IO 性能
五、容器进程数与文件句柄数限制
5.1 限制最大进程数
5.2 限制最大打开文件数
六、组合资源限制实战
七、容器资源监控与分析
7.1 docker stats 实时监控
7.2 docker system df 查看资源占用
7.3 docker events 实时监听
八、资源限制验证实验
案例:内存限制测试
案例: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
进行性能监控
✅ 防止单容器资源滥用的优化策略