容器资源限制防止恶意抢占:Docker容器资源限制防恶意抢占
为什么要给容器加资源限制?
想象一下一台服务器上跑了好几个 Docker 容器,如果其中一个容器因为程序 bug 或者被恶意攻击而疯狂占用 CPU 和内存,其他容器就会变慢甚至崩溃。容器资源限制就是给每个容器设定一个“天花板”:内存最多用多少、CPU 核心最多占多少。
这样任何一个容器都无法“抢走”全部资源,保证整体稳定性。
前置准备
- 装好 Docker:执行
docker --version确认版本不低于 19.03(太老的版本可能不支持部分参数)。如果没装,参考官方文档一键安装。 - 有一台 Linux 服务器:建议 CentOS 7+ 或 Ubuntu 18.04+。
- 至少一个运行中的容器:用于练习,比如 Nginx 容器:
docker run -d --name demo nginx
核心操作:两种方式设限制
方式一:启动容器时直接限制(推荐)
使用 docker run 的 --memory 和 --cpus 参数。
示例:启动一个 Nginx 容器,限制内存最大 256MB,CPU 最多使用半个核。
docker run -d --name web_limited \
--memory 256m \
--cpus 0.5 \
nginx
--memory 256m:硬限制,容器内进程最多使用 256MB 物理内存(超过会被 OOM Kill)。--cpus 0.5:CPU 配额,相当于最多占用 0.5 个逻辑核心。如果没有这个限制,容器可能抢满所有 CPU。
? 如果想同时限制内存加 swap,可以加--memory-swap 512m(表示内存+ swap 总上限)。如果只设--memory不设--memory-swap,默认 swap 和内存一样大(即双倍内存)。
方式二:对已经运行的容器修改限制
用 docker update 命令动态调整,无需重启容器。
示例:把刚才的 demo 容器改成内存 512MB,CPU 1 核。
docker update --memory 512m --cpus 1 demo
? docker update 只修改运行中的容器参数,不会影响容器内部进程,非常实用。
避坑指南(新手最容易犯的错)
- 坑 1:内存设置太小导致容器频繁退出。比如
--memory 10m,一个 Nginx 可能刚启动就被 OOM 杀死。建议先通过docker stats观察正常负载下的内存使用,再设置一个略高的值(比如 1.5 倍)。 - 坑 2:忘记限制 CPU。只限内存不限 CPU,一个高并发容器依然可能占满所有 CPU 核心,影响邻居。务必同时设置
--cpus。 - 坑 3:
--cpus和--cpu-quota混淆。--cpus更直观(比如 1.5 表示 1.5 核),而--cpu-quota是微秒值。新手一律用--cpus。 - 坑 4:在 Docker Compose 里忘记写资源限制。如果使用 compose,请在
services.xxx.deploy.resources下设置limits字段,否则 yaml 不生效。
如何验证限制是否生效?
方法一:查看实时统计
docker stats
输出会显示每个容器的 CPU%、内存使用/限制。
重点看 LIMIT 列,是否等于你设定的值。
方法二:压力测试(推荐)
在容器内安装 stress 工具,故意压测:
docker exec -it web_limited /bin/bash
apt update && apt install stress -y
stress --cpu 2 --vm 1 --vm-bytes 300m --timeout 30
此时观察 docker stats,会发现 CPU 使用率被卡在 0.5 核(50%左右),内存被卡在256MB,即使 --vm-bytes 设为 300M,实际也不会超过限制。
如果压力过大,容器可能被 OOM 杀掉,这正是保护机制在起作用。
总结
容器资源限制是防止恶意抢占和误抢的必备技能。
核心就三个动作:启动时加 --memory 和 --cpus,运行后 docker update 动态调,最后用 docker stats 和 stress 验证。
建议对所有生产环境的容器都加上资源限制,就像给每个服务装一个保险丝——平时感觉不到,关键时刻能救命。