防止容器过载拖垮宿主机的关键是节点级资源预留:通过daemon.json配置memory-reservation和cpu-reservation为系统进程留出安全余量,并配合systemd对dockerd自身设memorylimit和cpuquota硬限,同时禁用swap与thp。

要防止容器过载拖垮宿主机操作系统,关键不是只给单个容器设限,而是让 Docker 守护进程(dockerd)本身“留出安全余量”——即在节点级预留 CPU 和内存资源,确保系统进程(如 sshd、systemd、kswapd、dockerd 自身)始终有可用资源。这层预留是容器资源限制无法替代的底层防线。
明确节点级预留与容器级限制的区别
容器的 --memory 或 deploy.resources.limits 只约束单个容器;而节点级预留是告诉 dockerd:“别把整台机器的资源都分出去,必须给我留够系统运转的底子”。它不通过 cgroups 直接作用于容器,而是影响调度决策和资源分配上限。
通过 daemon.json 配置守护进程资源预留
Docker 1.13+ 支持在 /etc/docker/daemon.json 中设置全局资源约束,这是最稳妥的节点级预留方式:
-
memory-reservation:指定 dockerd 启动时向内核申请保留的物理内存(单位:字节或带后缀如
512m),该内存不会被容器调度器分配出去 -
cpu-reservation:同理,为系统保留 CPU 时间片(例如
"0.5"表示预留半核) - 这两个参数需配合 experimental: true 启用(Docker CE 20.10+ 默认开启实验特性)
示例配置:
重启 dockerd 生效:sudo systemctl restart docker
配合 systemd 对 dockerd 进程自身设限
仅靠 daemon.json 不足以防住 dockerd 自身失控(如大量镜像构建、并发 pull 导致内存暴涨)。应通过 systemd 强制约束 dockerd 进程资源:
- 编辑
/etc/systemd/system/docker.service.d/override.conf - 添加内存与 CPU 硬限:
这样即使 dockerd 出现异常,也不会吃光整机资源。注意 MemoryLimit 值需大于 memory-reservation,否则冲突。
禁用 swap 并关闭透明大页(THP)
这两项不是“预留”,但直接决定 OOM 是否会演变成系统夯死:
-
禁用 swap:在宿主机执行
sudo swapoff -a,并在/etc/fstab中注释 swap 行。启用 swap 会让内存压力转为磁盘 I/O 延迟,导致响应冻结而非快速失败 -
关闭 THP:运行
echo never > /sys/kernel/mm/transparent_hugepage/enabled。THP 在内存紧张时触发同步折叠,加剧卡顿,对容器化环境弊大于利











