非Swarm模式下docker-compose内存预留与限制不生效问题求助
我在非Swarm模式下运行容器,使用的docker-compose.yml配置如下:
version: '3.9' services: backend: container_name: 'w_server' restart: always build: . mem_reservation: '30G' mem_limit: '40G' environment: NODE_USER: '[...]'
容器构建启动成功后,执行docker stats --all --no-stream得到的统计信息显示内存限制为23.55GiB,而非配置的40G:
docker stats --all --no-stream CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS d4426dd4e34d w_server 0.00% 573.7MiB / 23.55GiB 2.38% 225MB / 8.47MB 0B / 16MB 18
已知deploy.resources.reservations和deploy.resources.limits仅在Swarm模式下生效,配置后构建会提示警告且不生效。将compose版本改为2.4后,问题依旧,docker stats显示的内存限制未读取配置文件中的值。
我的Docker和docker-compose版本为:
docker-compose version 1.28.5, build c4eb3a1f Docker version 18.09.7, build 2d0083d
请问非Swarm模式下还有其他分配内存资源的方法吗?
针对你的Docker和docker-compose版本,提供以下几种可行的非Swarm模式内存限制配置方法:
方法一:使用docker-compose兼容模式启动
对于Compose 3.x语法,非Swarm模式下可通过--compatibility参数让deploy.resources的配置生效,步骤如下:
- 修改
docker-compose.yml为以下内容:
version: '3.9' services: backend: container_name: 'w_server' restart: always build: . deploy: resources: reservations: memory: '30G' limits: memory: '40G' environment: NODE_USER: '[...]'
- 启动容器时加上兼容模式参数:
docker-compose --compatibility up -d
该参数会让docker-compose将Swarm模式的资源配置转换为非Swarm模式支持的格式,解决警告和不生效的问题。
方法二:修正Compose 2.4版本的配置写法
若使用Compose 2.4版本,确保参数格式正确,同时排查Docker daemon的全局限制:
- 调整
docker-compose.yml:
version: '2.4' services: backend: container_name: 'w_server' restart: always build: . mem_limit: 40g mem_reservation: 30g environment: NODE_USER: '[...]'
注意单位使用小写g或明确指定GiB(如40GiB),避免格式识别问题。
2. 检查Docker daemon配置:
查看/etc/docker/daemon.json文件,若存在memory或default-ulimits等全局内存限制,需调整或移除,避免覆盖容器级配置。修改后重启Docker服务:
systemctl restart docker
方法三:手动用docker run指定内存限制
如果Compose配置始终存在问题,可先构建镜像再手动启动:
- 构建镜像:
docker-compose build backend
- 用
docker run命令指定内存限制启动容器:
docker run -d --name w_server --restart always --memory 40G --memory-reservation 30G -e NODE_USER='[...]' <你的镜像名称>
额外排查点
执行free -h查看宿主机内存情况,若宿主机实际可用内存小于40G,Docker会自动将容器内存限制设为宿主机可用内存(这可能是你看到23.55GiB的原因),需确保宿主机内存充足。
内容的提问来源于stack exchange,提问作者AbreQueVoy

