资源限制
约 822 字大约 3 分钟
布欧-Lewyon
2026-05-15
首页 › Docker › 容器管理(在新窗口打开) › 资源限制
Docker 通过 Linux CGroup 机制限制容器可使用的 CPU、内存、磁盘 IO 等资源。合理设置资源限制可以防止单个容器耗尽宿主机资源。
内存限制
# 限制最大内存为 512MB
docker run -d --memory="512m" nginx:alpine
# 限制内存 + 设置 swap
docker run -d --memory="512m" --memory-swap="1g" nginx:alpine
# 禁止使用 swap
docker run -d --memory="512m" --memory-swap="512m" nginx:alpine
# 设置内存软限制(超过后尽力回收,不强制杀死)
docker run -d --memory="512m" --memory-reservation="256m" nginx:alpine| 参数 | 默认值 | 说明 |
|---|---|---|
--memory / -m | 无限制 | 硬限制,超过则 OOM 被杀 |
--memory-swap | memory × 2 | 内存 + swap 总量 |
--memory-reservation | 无 | 软限制,宿主机内存不足时尽力保证 |
--oom-kill-disable | false | 达到内存限制时不杀容器(需同时设置 -m) |
# 查看容器的内存限制
docker inspect web --format '{{.HostConfig.Memory}}'CPU 限制
# 限制使用 1.5 个 CPU 核心
docker run -d --cpus="1.5" nginx:alpine
# 限制 CPU 份额(相对权重,默认 1024)
docker run -d --cpu-shares=512 nginx:alpine # 获取默认一半的 CPU 时间
# 限制在指定 CPU 核心上运行
docker run -d --cpuset-cpus="0,2" nginx:alpine # 仅使用 CPU 0 和 2# 查看容器的 CPU 限制
docker inspect web --format '{{.HostConfig.NanoCpus}}'| 参数 | 说明 |
|---|---|
--cpus | 限制 CPU 核心数(推荐) |
--cpu-shares | CPU 时间相对权重(默认 1024) |
--cpuset-cpus | 绑定到特定 CPU 核心 |
磁盘 IO 限制
# 限制写入 IOPS(每秒 IO 次数,CFQ 调度器)
docker run -d --device-write-iops /dev/sda:100 nginx:alpine
# 限制写入带宽(字节/秒)
docker run -d --device-write-bps /dev/sda:10mb nginx:alpine
# 限制读取
docker run -d --device-read-bps /dev/sda:10mb nginx:alpine重启策略结合资源限制
docker run -d \
--name api \
--memory="512m" \
--cpus="1" \
--restart=on-failure:3 \
myapp:latest如果容器因 OOM(内存超限)被杀死,on-failure 会尝试重启。但如果持续 OOM,3 次重启后就不再尝试,避免无限重启耗尽资源。
查看资源使用
# 实时查看所有容器的资源使用
docker stats
# 只查看特定容器,每秒刷新
docker stats --no-stream web db
# 查看容器的内存使用细节
docker inspect web --format '{{.State.OOMKilled}}' # 是否被 OOM 杀死实际场景配置参考
# Web 应用容器
docker run -d \
--name web \
--memory="512m" \
--memory-reservation="256m" \
--cpus="0.5" \
--restart=unless-stopped \
nginx:alpine
# 数据库容器
docker run -d \
--name mysql \
--memory="2g" \
--cpus="2" \
--restart=always \
-v mysql-data:/var/lib/mysql \
mysql:8.4未设置资源限制的风险
# 模拟内存泄漏
docker run -d --name leak python:3-alpine sh -c "while true; do a='a'*10000000; done"
# 无限制时可能耗尽宿主机内存,导致其他进程被 OOM killer 杀死生产环境必须为每一个容器设置资源限制。这是避免"一个坏容器拖垮整台机器"的基本保障。
小结
- 内存限制:
--memory(硬限制)、--memory-reservation(软限制)。 - CPU 限制:
--cpus(核心数,推荐使用)或--cpu-shares(相对权重)。 - 重启策略
--restart=on-failure:N配合资源限制,避免无限重启。 docker stats实时监控,docker inspect查看限制配置。- 生产环境必须为每个容器设置
--memory和--cpus。
上一节:查看日志与监控 下一节:Dockerfile 指令详解
