Docker 容器如何实现资源限制(如 CPU 和内存)
在 Docker 中,可以通过设置容器运行参数,限制容器的 CPU、内存等资源使用量,从而防止某个容器占用过多资源,影响其他服务运行。
一、内存限制(Memory)
限制最大内存使用:
docker run -m 512m --memory-swap 512m ubuntu
参数 | 说明 |
---|---|
-m 或 --memory | 设置最大可用物理内存(如 512m , 2g ) |
--memory-swap | 包含内存+交换分区(swap)的总限制 |
--memory-reservation | 软限制(仅在系统压力大时才强制限制) |
💡 推荐
--memory-swap
值与--memory
相同,避免 swap 占用过多。
二、CPU 限制
Docker 默认不会限制 CPU,但你可以通过如下方式控制:
方法 1:限制可用 CPU 核心数
docker run --cpuset-cpus="0,1" ubuntu
表示容器只能使用第 0 和 1 核心。
方法 2:设置 CPU 份额(相对权重)
docker run --cpu-shares=512 ubuntu
- 默认是 1024
- 多个容器分配 CPU 份额:容器 A 是 512,容器 B 是 1024,B 获取 CPU 的概率是 A 的 2 倍
方法 3:控制 CPU 使用比例
docker run --cpus="1.5" ubuntu
表示最多使用 1.5 核心(如果宿主机是多核,可跨核调度)。
三、综合示例(限制 CPU + 内存)
docker run -d \--name limited_container \-m 512m --memory-swap=512m \--cpus="1.0" \ubuntu sleep 1000
- 限制最大 512MB 内存
- 限制最多 1 个 CPU 核心
四、查看资源限制
docker inspect 容器ID
查看 JSON 中的 "HostConfig"
→ "Memory"
、"NanoCpus"
等字段。
或使用命令:
docker stats 容器名
实时查看容器的 CPU、内存使用情况。
五、推荐实践
建议 | 说明 |
---|---|
限制生产容器的内存和 CPU | 防止容器 OOM、抢占系统资源 |
多容器部署时使用 --cpus | 精细控制资源分配 |
--memory-swap=memory 推荐设置一致 | 避免 swap 被滥用 |
使用 Kubernetes 时通过资源 Request / Limit | 替代 Docker 参数方式 |
docker stats 做定期监控或报警 | 配合 cadvisor / Prometheus |
六、进阶控制(cgroups)
Docker 本质上是使用 Linux 的 cgroups 控制组 实现资源限制的,可以通过如下命令查看:
cat /sys/fs/cgroup/memory/docker/<container_id>/memory.limit_in_bytes
若你使用
containerd
/podman
等容器引擎,也会采用类似方式控制资源。
七、总结图
docker run \--cpus="1.5" \--memory="1g" \--memory-swap="1g" \your-image
限制容器最大使用 1.5 核心、1GB 内存,不允许超额。
如你需要:
- 在
docker-compose.yml
中配置资源限制 - Kubernetes 中 Pod 的资源 request/limit
- 或资源超限后的报警或自恢复机制设计