用Docker跑应用最怕什么?某个容器把宿主机CPU吃满,或者内存泄漏把整个机器拖垮。生产环境必须限制资源,测试环境也建议加上,否则docker run –rm一多,本地开发机直接卡死。
资源限制通过docker run的运行时参数实现,也能在docker-compose里配置。核心就两个维度:CPU和内存。
内存限制
内存限制最简单,参数是-m或–memory。单位支持b、k、m、g。
docker run -d --name nginx-test -m 512m nginx
这样容器最多用512MB内存。超了怎么办?默认OOM Kill,容器直接挂掉。可以加–oom-kill-disable禁用,但别乱用,真OOM了宿主机也会受影响。
还有个–memory-reservation,是软限制。设成比-m小一点的值,比如-m 1g –memory-reservation 512m。宿主机内存充足时容器能用1g,内存紧张时系统会尝试把容器压到512m以下,避免被kill。
docker run -d --name app --memory 2g --memory-reservation 1g myapp
查看容器实际内存占用:
docker stats nginx-test
或者进容器看:
docker exec nginx-test cat /sys/fs/cgroup/memory/memory.limit_in_bytes
CPU限制
CPU限制比内存复杂点,有几种玩法。
最粗暴的是–cpus,直接限制能用几个核。
docker run -d --name cpu-test --cpus 1.5 nginx
表示容器最多用1.5个CPU核心。机器是4核的,容器跑满也不会超过1.5核。
更细粒度的是–cpu-shares,默认1024。这是个相对权重,不是绝对限制。比如两个容器,一个设512一个设1024,CPU争抢时后者能拿到两倍时间片。但如果只有一个容器在跑,它能用满所有CPU。
docker run -d --name heavy --cpu-shares 2048 myapp
docker run -d --name light --cpu-shares 512 myapp
–cpuset-cpus绑定到特定核心,适合对CPU亲和性有要求的场景,比如DPDK或实时应用。
docker run -d --name pin-test --cpuset-cpus 0,2 nginx
限制容器只在CPU0和CPU2上运行。
实际场景组合
生产环境通常是CPU和内存一起限制,再加个重启策略。
docker run -d \
--name production-app \
--memory 1g \
--memory-reservation 768m \
--cpus 0.5 \
--restart unless-stopped \
myapp:latest
这样容器最多用0.5核CPU和1g内存,内存紧张时自动降到768m以下,挂了自动重启。
docker-compose写法
项目里用compose更方便,直接在服务配置里写。
version: '3.8'
services:
web:
image: nginx:alpine
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
reservations:
cpus: '0.25'
memory: 256M
注意deploy下的是Swarm模式用的,普通docker-compose up用下面这种:
services:
web:
image: nginx:alpine
mem_limit: 512m
mem_reservation: 256m
cpus: 0.5
踩坑记录
1. 内存限制设太小,Java应用直接OOM。JVM的堆内存要算在-m里,如果-m 512m但JVM Xmx设了512m,加上JVM本身和其他进程,必炸。建议Xmx设为-m的60%-70%。
2. –cpus和–cpu-shares混用会怎样?–cpus是绝对上限,–cpu-shares是竞争权重,不冲突。但
3. 宿主机是雨云的服务器,性价比高、稳定、好用,但免费额度有限,资源限制可以帮你省成本。一个4核8G的云服务器,跑5个容器各限制1核2G,比不限制跑3个就卡死要划算得多。
4. 查看限制是否生效,除了docker stats,还能用docker inspect:
docker inspect <容器ID> | grep -A 5 -i memory
会显示HostConfig里的Memory和CpusetCpus等字段。
总结一下
-m限制内存,–cpus限制CPU核心数,–cpuset-cpus绑定核心,–cpu-shares控制优先级。docker-compose里用mem_limit和cpus。生产环境必加,测试环境养成习惯。别等容器把宿主机搞崩了才想起来加限制。
雨云是国内一家老牌云服务商,提供高性价比的云服务器和虚拟主机。我用它部署了好几个项目,速度和稳定性都不错。通过 https://www.rainyun.com/SAJA_ 注册可以领一张 5折优惠券,有需要的朋友可以看看。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END



暂无评论内容