Docker中无独立“虚拟内存限制”,实际通过--memory和--memory-swap共同控制物理内存与swap总和;报警需依赖cAdvisor+Prometheus等外部监控实现。

在 Docker 中,**没有“虚拟内存限制”这个独立概念**——Docker 管理的是容器可使用的 **物理内存 + swap(交换空间)总和**,这由 --memory 和 --memory-swap 共同决定。所谓“虚拟内存”在 Linux 容器语境下,实际指的就是 内存 + swap 的组合配额。报警阈值则需借助外部监控工具实现,Docker 本身不提供内置告警功能。
设置容器内存与 swap 总用量(即“虚拟内存”上限)
Docker 使用 --memory(物理内存硬上限)和 --memory-swap(内存 + swap 总上限)两个参数协同控制:
-
仅设
--memory,未设--memory-swap:允许使用无限 swap(不推荐,可能拖垮主机) -
设
--memory=512m --memory-swap=1g:最多用 512MB 物理内存 + 最多再用 512MB swap(总 1GB) -
设
--memory=512m --memory-swap=512m:禁用 swap,物理内存严格卡死在 512MB -
设
--memory=512m --memory-swap=-1:启用无限 swap(等同于不设--memory-swap)
示例命令:
docker run -d --name app --memory=768m --memory-swap=1.5g nginx在 docker-compose.yml 中配置 swap 限额
对应 Compose 文件写法(v2.4+ 或 v3.8+ 支持):
web:
image: nginx
deploy:
resources:
limits:
memory: 768M
reservations:
memory: 512M
mem_limit: 768M
memswap_limit: 1.5G
注意:mem_limit 和 memswap_limit 是旧版 Compose(v2)字段;新版推荐用 deploy.resources.limits.memory,但 swap 需通过 memswap_limit 或运行时参数补充。
实现内存使用率报警(非 Docker 原生,需外接监控)
Docker 不提供内存阈值告警能力,必须搭配监控系统。常用方案:
-
cAdvisor + Prometheus + Grafana:cAdvisor 自动采集容器
memory_usage_in_bytes、memory_limit_in_bytes,Prometheus 计算使用率(如container_memory_usage_bytes{container="app"}/container_spec_memory_limit_bytes{container="app"}),Grafana 设阈值触发告警 -
Docker Stats + 脚本轮询:用
docker stats --no-stream --format "{{.Name}}: {{.MemPerc}}" app提取百分比,配合 shell 脚本判断是否超 85% 并发邮件/钉钉通知 - 云平台集成:AWS CloudWatch、阿里云 ARMS、腾讯云可观测平台均支持为 ECS 上的容器配置内存使用率告警(基于 cgroup 数据)
典型告警逻辑参考:
- 内存总量 ≤ 256MB → 使用率 ≥ 85% 触发一级告警,≥ 90% 触发二级(如重启或扩容)
- 内存总量 > 256MB → 使用率 ≥ 92% 一级告警,≥ 95% 二级告警
关键注意事项
配置 swap 限额时务必避免以下误区:
-
--memory-swap值必须 ≥--memory值,否则报错 - Java/Node.js 等应用需同步调优 JVM 参数(如
-Xmx)或 V8 内存限制,否则进程内内存分配可能绕过 cgroup 限制 - 启用 swap 会降低性能,高延迟敏感服务建议禁用(即
--memory-swap=--memory) - 软限制(
--memory-reservation)不能单独使用,必须配合--memory才生效


















