如何为整个docker-compose栈设置内存限制?
Docker Compose 栈总内存限制方案
目前有两种成熟的方案可以直接限制整个docker compose栈的总内存占用,不需要单独为每个服务设置内存限额:
方案1:基于cgroup的通用限制(适用于所有非Swarm模式部署场景)
这个方案对所有版本的docker-compose都生效,原理是把整个docker-compose启动进程纳入自定义内存限制的cgroup,所有该进程派生的容器子进程都会继承父cgroup的内存上限,实现总内存管控:
- 首先安装cgroup工具包:
Debian/Ubuntu系执行:apt install -y cgroup-tools
RHEL/CentOS/Fedora系执行:yum install -y libcgroup-tools - 创建自定义内存限制cgroup,示例中将总内存上限设为4G:
mkdir -p /sys/fs/cgroup/memory/compose_total_limit echo 4G > /sys/fs/cgroup/memory/compose_total_limit/memory.limit_in_bytes - 启动docker-compose时指定加入该cgroup即可:
cgexec -g memory:compose_total_limit docker-compose up -d
方案2:Swarm模式下的原生配置限制
如果你使用docker stack deploy命令部署compose栈(Swarm模式),可以直接通过compose配置或者Swarm资源配额功能实现总栈内存限制,compose 3.8及以上版本支持顶层资源约束配置,示例如下:
version: "3.8" services: web: image: nginx:alpine db: image: mysql:8.0 # 顶层全局资源限制,作用于整个stack所有服务总和 x-stack-resources: limits: memory: 4G
替代方案
如果不想额外配置cgroup或使用Swarm,也可以手动计算所有服务的内存限额总和,为每个service单独设置mem_limit参数,累加值等于你需要的总内存上限,实际管控效果和直接限制总栈一致。
内容的提问来源于stack exchange,提问作者Christian G. Faraone
相关产品推荐
相关产品推荐

