Docker容器需设资源限制防争抢:CPU用--cpus或--cpu-shares,内存必配--memory防OOM,磁盘I/O和网络需按设备或tc限速,宿主机启用cgroup v2并调优内核参数。

启动 Docker 容器时若不加限制,多个容器可能同时抢占 CPU、内存、磁盘 I/O 或网络带宽,导致关键服务响应变慢甚至崩溃。核心思路是:在 docker run 或编排配置中主动设置资源约束,并配合宿主机调度策略,让容器“有节制地用资源”,而非“抢到算赢”。
CPU 资源隔离:避免“全核满载”式争抢
Docker 默认不限制 CPU 使用,容器可占满所有可用核心。建议根据服务类型设置 --cpus(推荐)或 --cpu-shares(相对权重):
-
--cpus=1.5:限制容器最多使用 1.5 个逻辑 CPU 核心(支持小数,底层基于 CFS 配额) -
--cpu-shares=512:仅在 CPU 紧张时生效,表示该容器获得的 CPU 时间是默认值(1024)的一半 - 对延迟敏感服务(如 API 网关),优先用
--cpus;对批处理类任务(如日志压缩),可用--cpu-shares配合低优先级调度
内存限制与 OOM 防护:防止“内存吃爆”拖垮整机
不设内存上限的容器在压力下可能触发宿主机 OOM Killer,误杀其他进程。必须显式指定 --memory:
-
--memory=512m:硬限制,超限后容器内进程被内核 OOM Killer 终止(容器退出) - 建议同时设置
--memory-swap=512m(禁用 swap)或--memory-swap=1g(允许部分 swap),避免因 swap 滥用引发 I/O 飙升 - Java 类应用需注意:JVM 堆内存(
-Xmx)应明显小于--memory值,预留空间给元数据、线程栈、本地内存等
磁盘 I/O 与网络带宽可控化
批量日志写入或大文件传输容易打满磁盘吞吐或网卡,影响同宿主机其他容器:
- 块设备限速:
--device-read-bps /dev/sda:10mb --device-write-bps /dev/sda:5mb(按设备路径限速) - 网络限速(需启用
dockerd的userland-proxy=false并依赖 host 网络命名空间):--network host后用tc命令控制,或改用macvlan网络 + cgroup v2 的 net_cls/net_prio - 对日志密集型容器,挂载
tmpfs卷(-v /var/log/myapp:/var/log/myapp:tmpfs,size=100m)减少落盘压力
宿主机协同:cgroup v2 与内核参数优化
Docker 依赖 Linux cgroup 进行资源控制。确保宿主机启用 cgroup v2(现代发行版默认开启),并验证:
- 检查:
stat -fc %T /sys/fs/cgroup输出应为cgroup2fs - 避免混用 cgroup v1/v2:确认
/proc/cmdline中无systemd.unified_cgroup_hierarchy=0 - 关键内核参数调优:
vm.swappiness=1(降低 swap 倾向)、vm.vfs_cache_pressure=50(缓存回收更保守),减少因内存压力引发的连锁 I/O 抖动















