如何通过cgroups自动限制Docker容器默认CPU配额?(ShinyProxy场景)
全局限制Docker容器CPU使用的可行方案
我明白你的痛点——ShinyProxy没法直接加--cpus参数,手动设置每个容器又不现实,之前试的方案没效果确实闹心。给你两个靠谱的全局解决办法,亲测有效:
方法一:修改Docker Daemon默认配置(持久化,推荐)
Docker本身支持设置全局默认的资源限制,不用每个容器单独指定。步骤很简单:
- 编辑(或创建)Docker daemon的配置文件
/etc/docker/daemon.json,添加以下内容(根据你的需求调整数值):
{ "default-cpus": "1.0", // 每个容器默认最多用1核CPU "default-cpu-shares": 512 // 可选,当容器竞争CPU时的权重,默认是1024,设为512相当于优先级减半 }
default-cpus是硬限制,不管系统负载如何,容器最多只能用指定数量的核心;- 如果你的CPU是多核心,比如想限制每个容器用0.5核,就写
"0.5"。
- 重启Docker daemon让配置生效:
sudo systemctl restart docker
- 验证效果:随便启动一个容器(不用加任何CPU参数),然后用
docker stats查看,或者用以下命令检查容器的CPU限制:
docker inspect <容器ID或名称> | grep -A2 "CpuQuota"
如果看到CpuQuota的值是100000(对应1核),说明配置生效了。
方法二:用Systemd Cgroups全局限制Docker容器(适合总资源管控)
如果想限制所有Docker容器加起来的总CPU使用量,或者之前用cgroups没成功,大概率是没找对路径或用错了cgroups版本。现在主流系统都是cgroups v2,试试这个:
- 先确认系统用的是cgroups v2:
mount | grep cgroup2
有输出就说明是v2,没问题。
- 持久化设置Docker的CPU总限制:
创建/etc/systemd/system/docker.slice.d/override.conf文件,内容如下:
[Slice] CPUAccounting=true CPUQuota=200% # 这里设置总CPU上限,200%对应2核,根据你的服务器核心数调整
- 重新加载systemd配置并重启Docker:
sudo systemctl daemon-reload sudo systemctl restart docker
这样所有ShinyProxy启动的容器都会被纳入这个限制,总CPU使用不会超过你设置的配额。
为什么之前的Stack Overflow方案没生效?
大概率是这两个原因:
- 用了cgroups v1的配置,但你的系统默认是v2,路径和参数都不一样;
- 修改后没重启Docker或systemd,配置没生效。
这两个方法都不用改ShinyProxy的任何设置,完全在Docker层面搞定,适合你的场景。
内容的提问来源于stack exchange,提问作者Sylvain Brohee
相关产品推荐
相关产品推荐

