Docker 资源限制与性能优化(CPU / 内存 / IO 管控实战)

前言

[一、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 statsdocker system df 进行性能监控

✅ 防止单容器资源滥用的优化策略

相关推荐
爱码社长3 小时前
centos8安装docker【新】
运维·docker·容器
阑梦清川3 小时前
深入理解动态链接和静态链接
linux
孞㐑¥3 小时前
Linux网络部分—网络层
linux·c++·经验分享·笔记
ms72wx3 小时前
拥抱终端:Linux 新手命令行入门指南
linux·运维·服务器
東雪蓮☆3 小时前
容器生命周期与管理策略
linux·运维·docker
---学无止境---4 小时前
Linux 内核等待队列(Wait Queue)机制深度分析
linux
wheeldown4 小时前
【Linux】Linux管道与进程池深度解析:从原理到实战
linux·运维·服务器
_extraordinary_5 小时前
Java Linux --- 基本命令,部署Java web程序到线上访问
java·linux·前端
Ronin3055 小时前
【Linux网络】网络命令
linux·网络·网络命令