本文将带你深入理解 Docker 如何借助 Linux Cgroups 实现对内存、CPU 等系统资源的精细化控制,并提供完整演示与图解、Compose 配置模板和资源包下载,适合初学者与工程师深入学习与实战。
文章目录
二、Docker 是如何利用 Cgroups 实现资源控制的?
五、Docker Compose 方式配置 Cgroup 限制
一、什么是 Cgroups?为什么对容器如此关键?
Cgroups(Control Groups)是 Linux 内核提供的资源限制机制,支持对以下资源进行精细控制:
限制项 | 说明 |
---|---|
CPU | 控制分配的 CPU 核数或使用比例 |
内存 | 限制容器使用的最大内存和 Swap |
I/O | 限制磁盘读写速率 |
PID | 控制进程数量 |
容器的“轻量级资源隔离”正是依赖它实现。
二、Docker 是如何利用 Cgroups 实现资源控制的?
Docker 启动容器时传入资源限制参数,Docker Daemon 会基于这些参数在 /sys/fs/cgroup/
下为容器生成资源控制配置。
Docker 资源限制关键参数汇总
类型 | 参数 | 示例 |
---|---|---|
内存 | --memory |
--memory=256m |
Swap 限制 | --memory-swap |
--memory-swap=512m |
CPU 数 | --cpus |
--cpus=1.5 |
CPU 权重 | --cpu-shares |
--cpu-shares=512 |
指定 CPU 核心 | --cpuset-cpus |
--cpuset-cpus="0,2" |
三、演示一:内存限制 + OOM 触发实战
docker run -it --name mem-limit-demo --memory=100m alpine /bin/sh
在容器中运行:
dd if=/dev/zero of=/dev/null bs=1M count=200
观察 OOM 行为:
dmesg | tail
docker logs mem-limit-demo
四、演示二:限制 CPU 使用率
docker run -it --cpus="0.5" --name cpu-limit-demo busybox
容器中运行死循环模拟压力:
while :; do :; done
在宿主机使用 top
或 htop
观察容器 CPU 使用率是否接近 50%。
五、Docker Compose 方式配置 Cgroup 限制
version: '3'
services:
app:
image: myapp
deploy:
resources:
limits:
cpus: '1.0'
memory: 512M
deploy.resources
仅在 Swarm 模式下生效。普通 compose 建议用mem_limit
等老版本字段或docker run
。
六、查看容器对应的 Cgroup 使用情况
docker inspect <容器ID> | grep -i cgroup
cat /sys/fs/cgroup/memory/docker/<容器ID>/memory.limit_in_bytes
使用 cadvisor
或 Prometheus + Grafana
可进行可视化监控。
七、Cgroup v1 和 v2 区别(面试常考)
对比项 | Cgroup v1 | Cgroup v2 |
---|---|---|
控制器分布 | 分散(cpu/memory 等分开) | 统一结构,更一致 |
支持度 | 传统主流 | Ubuntu 22+/CentOS 8 开始推广 |
Docker 支持 | 默认支持 v1,v2 需配置兼容性 | 新版支持 v2(需设定内核参数) |
八、加分建议:资源包上传
推荐你上传如下配套内容作为资源,便于读者实践:
文件名 | 内容描述 |
---|---|
docker-cgroup-demo.sh |
一键运行多个限制容器脚本 |
docker-compose-limit.yaml |
Compose 限制模板 |
container_resource_monitoring.pdf |
Cgroup 使用与监控文档 |
cadvisor-deploy.yaml |
容器资源可视化组件 |
cpu_limit_vs_performance.png |
限制图解对比图 |
九、总结
通过对 Cgroups 的配置和使用,Docker 实现了对容器资源的精细化控制。它在:
多租户场景下保障隔离性
测试场景中模拟低性能环境
防止单容器资源过载崩溃主机
中都扮演着核心角色。
十、下载资源包 + 图文PDF
如果你觉得有帮助,欢迎:
点赞 收藏 评论
关注我了解更多 Docker、K8s、运维自动化干货!