只用 -m 无法真正防住宿主机被拖垮,必须配对设置 --memory-swap;-m 512m --memory-swap=512m 禁用 swap 并立即 oom,--memory-swap=-1 则允许无限 swap,生产环境禁用。
只用 -m 或 --memory 参数能设物理内存硬上限,但单独使用无法真正防住宿主机被拖垮——因为 docker 默认会额外分配等量 swap,实际可用内存翻倍,oom 行为也不可控。
必须配对设置 --memory-swap 才算完整限制
–memory-swap 不是“额外 swap 大小”,而是“物理内存 + swap 的总上限”。它的值和 -m 的关系直接决定 swap 是否启用:
- -m 512m --memory-swap=512m:禁止使用任何 swap,超 512MB 立即 OOM Kill 进程
- -m 512m --memory-swap=1g:允许最多 512MB swap(1g − 512m = 512m)
- -m 512m --memory-swap=-1:不限制总内存,swap 可用尽宿主机所有 swap 空间
注意:--memory-swap 不能小于 -m 值,否则启动报错 invalid argument: memory-swap must be greater than or equal to memory。
常见可靠组合示例
生产环境推荐让两个值相等,彻底禁用 swap:
使用 Python 脚本下载 Docker 镜像并打包为 tar 文件。用户说“下载镜像”“拉取镜像”“pull xxx”“帮我下载 nginx 镜像”等时触发。支持 SOCKS5 代理直连(推荐)和国内镜像站加速两种模式。
docker run -d -m 512m --memory-swap 512m nginxdocker run -d -m 2g --memory-swap 2g my-java-app
运行时动态加限或验证
已运行的容器也能补加限制:
- 执行:
docker update --memory=1g --memory-swap=1g container-name - 验证是否生效:
docker inspect container-name | grep -i memory - 或进容器查 cgroup:
cat /sys/fs/cgroup/memory/memory.limit_in_bytes,输出应等于设定字节数(如 1073741824 = 1GB)
为什么 top 看到内存用了 900MB,而 -m 只设了 512m?
这就是只设 -m 没设 --memory-swap 的典型表现:Docker 自动把 --memory-swap 设为 1g(512m × 2),容器 malloc 到近 1GB 才触发 OOM。这不是 bug,是默认行为,但极易误判限制是否生效。










