Windows下Docker重建容器时Vmmem内存持续增长问题求助
我在Windows 10上用Docker容器部署了Django + Gunicorn + Nginx网站,运行状态良好。每次更新源代码后,会执行docker-compose up -d --build [servicename]重建容器,命令能正常执行,容器在后台完成构建替换,Nginx仅短暂断连后恢复运行。每周会执行1-5次此类操作,次数取决于功能新增、修复及生产环境推送需求。
近期发现Vmmem进程内存占用每次重建都会翻倍:首次运行docker-compose up时内存占用约3000MB,重建后升至6000MB,以此类推。由于设备拥有32GB内存,直到数月后才发现内存大量累积的问题。
想问:
- 这是Docker的正常行为吗?
- 除重启电脑外,是否有其他方法缓解内存累积?
已知无效操作:
- 重启Docker无法解决该问题
- 执行prune操作也无法解决该问题
补充配置信息
docker-compose.yml
version: '3.8' services: nginx: restart: always image: nginx:latest container_name: nginx ports: - "80:80" volumes: - ./config:/etc/nginx/conf.d - ./static:/static - ./media:/media site: restart: always build: ./ container_name: site command: bash -c "python manage.py collectstatic --no-input && gunicorn --workers=8 --worker-class gevent --timeout 120 Site.wsgi -b 0.0.0.0:8080" volumes: - ./:/src - ./static:/static - ./media:/media expose: - "8080" ports: - "8080:8080"
WSL2内存限制配置(%UserProfile%\.wslconfig)
[wsl2] memory=8GB
该配置能限制宿主机内存消耗,但Vmmem仍会在每次重建后增长至8000MB上限。另外我了解Linux倾向于保留内存,仅在需要时释放,这是否是我观察到的现象?
1. 这不是Docker的正常行为
你观察到的内存持续翻倍累积,不属于Docker或WSL2的正常内存管理逻辑。虽然Linux确实会主动利用空闲内存做缓存,但这种每次重建容器就线性增长到上限的情况,更可能是WSL2或容器运行时的内存泄漏问题,或是应用/配置导致的资源未正确释放。
2. 除重启电脑外的缓解方法
(1)重启WSL2实例
无需重启整个电脑,仅重启WSL2即可释放Vmmem占用的内存:
- 打开命令提示符或PowerShell,执行:
wsl --shutdown - 等待几秒后,重新启动Docker(或直接运行
wsl命令启动WSL2实例),内存占用会回到初始水平。
(2)优化容器重建逻辑
你的site服务使用了./:/src的绑定挂载,每次重建时可能存在文件句柄或缓存未被正确清理:
- 生产环境尽量避免绑定挂载源码到容器,改用构建镜像时将代码COPY进镜像的方式,减少宿主机与容器的资源交互。
- 调整Gunicorn配置:当前设置8个gevent worker,重建时旧worker进程可能未彻底销毁导致内存残留。可先手动停止并移除旧容器再重建:
docker-compose stop site && docker-compose rm -f site docker-compose up -d --build site
(3)调整WSL2内存回收配置
在.wslconfig中添加配置,强制WSL2主动释放闲置内存:
[wsl2] memory=8GB swap=4GB localhostForwarding=true # 启用内存自动回收 pageReporting=true
pageReporting=true会让WSL2定期向Windows报告闲置内存,系统可回收这些资源,避免持续占用到上限。
(4)排查应用内存泄漏
虽然重启Docker无效,但也可能是Django应用本身存在内存泄漏,导致旧容器资源未被WSL2正确回收:
- 用
docker stats观察单个容器的内存占用,确认是容器内应用导致的增长,还是WSL2层面的泄漏。 - 在Django应用中添加内存监控(如
memory_profiler工具),排查是否存在未释放的对象或连接。
关于Linux内存缓存的说明
Linux的缓存内存可被主动释放,当系统需要内存时会自动回收这部分资源。但你遇到的是内存占用持续增长到上限且不回落,这和正常缓存行为不同——正常缓存会在内存紧张时释放,而非一直累积到限制值,因此你的情况更偏向内存泄漏,而非正常的Linux内存管理。
内容的提问来源于stack exchange,提问作者johnster000

