Docker容器内存Swap限制需联合设置--memory和--memory-swap,后者为内存与swap总和,实际可用swap等于--memory-swap减--memory;单独设任一参数无效,且--memory-swap必须≥--memory。
在 docker 中配置容器内存 swap 限制,核心是协同使用 --memory 和 --memory-swap 两个参数——单独设置任一参数都无效,且 --memory-swap 必须 ≥ --memory。swap 不是独立资源池,而是“内存 + swap”总上限减去物理内存上限后的余量。
明确 memory 与 swap 的数学关系
容器实际可用的 swap 空间 = --memory-swap 值 − --memory 值。这个差值必须为非负数:
- --memory=512m --memory-swap=512m → 差值为 0,swap 被禁用
- --memory=512m --memory-swap=1g → 可用 swap = 512MiB
- --memory=512m --memory-swap=-1 → 允许使用宿主机全部可用 swap(前提是宿主机已启用 swap)
- 只设 --memory=512m(不设 --memory-swap)→ Docker 默认按 1g 处理(即 512m RAM + 512m Swap),但该行为依赖宿主机 swap 是否可用
确保宿主机支持 Swap 才能真正生效
即使参数设得再大,若宿主机没配 swap 分区或 swapfile,容器也无法换出内存,OOM 时会直接被 kill:
使用 Python 脚本下载 Docker 镜像并打包为 tar 文件。用户说“下载镜像”“拉取镜像”“pull xxx”“帮我下载 nginx 镜像”等时触发。支持 SOCKS5 代理直连(推荐)和国内镜像站加速两种模式。
- 运行 swapon --show 确认宿主机已启用 swap
- 若无输出,需先创建并启用 swapfile(如 fallocate -l 2G /swapfile && mkswap /swapfile && swapon /swapfile)
- 仅当宿主机有 swap,--memory-swap > --memory 的配置才有意义
推荐的生产环境配置方式
避免过度消耗宿主机资源,关键不是“放开 swap”,而是**控制总量、预留缓冲、禁用无效 swap”:
- 对内存敏感型服务(如 Java 应用),建议 --memory=1g --memory-swap=1g,彻底禁用 swap,防止 GC 频繁换入换出拖慢响应
- 对短时峰值型服务(如批处理脚本),可设 --memory=512m --memory-swap=768m,允许最多 256MiB swap 缓冲
- 绝对不要设 --memory-swap 小于 --memory,Docker 会静默忽略或降级为等值限制
- 配合 --oom-kill-disable=false(默认),让 OOM Killer 在超限时及时终止容器,保护宿主机稳定性
验证配置是否真正落地
启动容器后,进入容器内检查 cgroup 设置是最可靠的方式:
- cat /sys/fs/cgroup/memory/memory.limit_in_bytes → 应等于 --memory 指定字节数(如 512m = 536870912)
- cat /sys/fs/cgroup/memory/memory.memsw.limit_in_bytes → 应等于 --memory-swap 指定字节数
- 两者相等说明 swap 已关闭;前者小于后者,差值即为可用 swap 容量
- 注意:free 或 swapon -s 在容器内通常看不到 swap,实际换出由内核在 cgroup 约束下自动管理

















