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年 审核中10 分钟前
说说SSH的端口转发
大数据·运维·ssh
盛世隐者11 分钟前
【Linux】定制Linux系统
linux·运维·服务器
行思理1 小时前
Docker 应该如何学习 分四个阶段
学习·docker·容器
-Excalibur-2 小时前
形象解释关于TCP/IP模型——层层封装MAC数据帧的过程
linux·c语言·网络·笔记·单片机·网络协议·tcp/ip
小跌—2 小时前
Linux:数据链路层
linux·网络
用户31187945592182 小时前
Fedora 37 安装 libicu-71.1-2.fc37.x86_64.rpm 教程(命令行步骤)
linux
..Move...2 小时前
Docker应用部署tomcat和nginx
nginx·docker·tomcat
搬砖的小码农_Sky2 小时前
Linux(Ubuntu)操作系统下文件的解压
linux·ubuntu
景彡先生3 小时前
Python函数定义与调用全解析:从基础语法到实战技巧
linux·开发语言·python
Lxt.星翊3 小时前
MySQL(安装和卸载、数据库存储原理图)
linux·运维·windows