You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

非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的配置生效,步骤如下:

  1. 修改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: '[...]'
  1. 启动容器时加上兼容模式参数:
docker-compose --compatibility up -d

该参数会让docker-compose将Swarm模式的资源配置转换为非Swarm模式支持的格式,解决警告和不生效的问题。

方法二:修正Compose 2.4版本的配置写法

若使用Compose 2.4版本,确保参数格式正确,同时排查Docker daemon的全局限制:

  1. 调整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配置始终存在问题,可先构建镜像再手动启动:

  1. 构建镜像:
docker-compose build backend
  1. 用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 23:20:38