一、底层基础:Linux 两大内核技术
- Namespace:隔离(容器能看到什么:PID、网络、挂载、用户)
- CGroup:限制(容器能用多少资源:CPU、内存、磁盘IO、PID)
Namespace 分地盘,CGroup 定配额。
CGroup 全称 Control Group,内核子系统,docker run 的 -m、--cpus 底层全部写入 /sys/fs/cgroup/ 对应目录。
二、五大常用子系统
| 子系统 | 作用 | docker参数对应 |
| cpu | CPU使用率、时间片配额 | —cpus、—cpu-shares |
| cpuset | 绑定CPU物理核心 | —cpuset-cpus |
| memory | 内存+swap上限 | -m/—memory、—memory-swap |
| blkio | 磁盘读写IO限速 | —blkio-weight |
| pids | 最大进程数 | —pids-limit |
三、内存限制(高频考点)
1. -m/--memory:容器可用物理内存上限
# 物理内存最多512M
docker run -m 512m nginx
- 容器进程超出内存:内核OOM kill杀掉容器。
2. --memory-swap:物理内存+swap总限额
--memory=512m --memory-swap=1g:物理512M,swap额外512M,合计1G--memory-swap=-1:不限制swap,可无限使用宿主机swap(生产不推荐)
误区:不加—memory,容器无内存上限,可吃光宿主机内存。
3. OOM优先级
--oom-kill-disable 关闭容器内OOM杀进程(谨慎使用,易夯机)
四、CPU限制两种方式
方式1:—cpus(docker1.13+推荐,配额限制)
# 最多占用单个CPU 0.5核(50%)
docker run --cpus=0.5 nginx
# 最多2核
docker run --cpus=2 nginx
底层:cpu.cfs_quota_us / cpu.cfs_period_us
默认周期period=100000us,--cpus=2 → quota=200000。
方式2:—cpu-shares(权重,相对分配,无硬性上限)
默认1024,多容器争抢CPU时按比例分配。
A:--cpu-shares=2048
B:--cpu-shares=1024
CPU满载时A:B=2:1;宿主机空闲时均可跑满全CPU。
方式3:cpuset 绑定物理CPU核心(多核隔离、高性能)
# 绑定CPU 0、1两个物理核
docker run --cpuset-cpus="0,1" nginx
生产:数据库、中间件绑核,避免CPU上下文切换。
五、blkio 磁盘IO权重限速
# 权重10~1000,默认500
docker run --blkio-weight=200 nginx
磁盘打满时按权重分配带宽,不能精准限制MB/s;精准限速需第三方工具。
六、pids 进程数量限制
# 容器最多创建200个进程
docker run --pids-limit=200 nginx
防fork炸弹,恶意程序无限创建进程打满宿主机PID。
七、实操查看容器cgroup配置
# 进入容器对应cgroup目录
cd /sys/fs/cgroup/memory/docker/容器ID/
cat memory.limit_in_bytes
八、生产踩坑总结
- 只设-m不设swap:容器内存打满直接OOM被杀;swap给过小容易频繁swap卡顿。
- 只用—cpu-shares不加—cpus:空闲容器依然能吃满整机CPU,无法限制峰值。
- 不做pids限制:fork漏洞瞬间占满宿主机PID。
关联文档
- ../linux/system/Linux — Linux Cgroup 内核机制
- ../kubernetes/core/K8s 核心概念 — K8s 资源限制