家里那台旧电脑装了ref="/tag/2019/" style="color:#EB6E00;font-weight:bold;">Docker跑几个服务,结果一开容器系统就卡得不行。后来才发现,默认情况下容器会用尽主机的所有CPU和内存资源,根本不讲武德。尤其是同时跑Nginx、MySQL和Node.js应用时,谁都不让着谁,最后全家一起慢。
限制内存很简单
比如你只想给一个镜像分配512MB内存,启动时加个参数就行:
docker run -d --memory=512m my-web-app
这样就算程序内存泄漏,也不会把整台机器拖垮。我之前跑了个爬虫容器,没设限制,结果吃掉3GB内存,家里的NAS直接假死,远程都连不上。
CPU也能按比例分
CPU配额用的是相对权重。比如有两个容器,一个设为1024,一个设为512,在资源紧张时前者能拿到两倍的CPU时间。
限制具体核数也可以。想让容器最多只用一个CPU核心:
docker run -d --cpus=1.0 my-api-service
要是家里是四核处理器,还可以精确到小数点。比如给媒体转码容器分2.5个核,留点余量给日常使用:
docker run -d --cpus=2.5 video-converter
组合使用更安心
实际部署时通常两个参数一起上。比如家里的博客容器,既不想它占太多内存,也不能让它抢光CPU:
docker run -d --memory=300m --cpus=0.6 blog-container
这样即使后台在备份数据库,前台网页照样能流畅打开。调试阶段可以先不设限,观察资源占用情况后再调整,别一上来就卡太死。
现在我家那台老机器同时跑五六个服务也不慌,每个容器各安其位,就像厨房里锅碗瓢盆各有位置,互不打架。