Docker容器Swap限制需联合设置--memory和--memory-swap,后者为内存与swap总和,实际可用swap等于--memory-swap减--memory;单独设--memory-swap无效,且swap值不得小于memory值。

要在 Docker 中配置 Swap 限制来防范宿主机死机,核心不是“单独限制 Swap”,而是通过 --memory 和 --memory-swap 联合控制内存与交换空间的总边界。Swap 本身不是万能保险——若宿主机没开启 swap 分区,容器根本用不了 swap;若配置不当(比如只设 --memory-swap 不设 --memory),Docker 会直接报错或静默降级,起不到防护作用。
必须确保宿主机已启用 Swap
容器能否使用 swap,完全取决于宿主机:
- 运行
swapon --show,确认有活跃 swap 分区或文件;没有则--memory-swap设置无效,容器最大内存 =--memory值 - 若宿主机无 swap,建议先配置(如
sudo fallocate -l 2G /swapfile && sudo mkswap /swapfile && sudo swapon /swapfile) - 仅当宿主机 swap 可用时,容器才可能把部分内存换出,避免物理内存瞬间耗尽触发 OOM Killer 杀死关键系统进程
--memory 和 --memory-swap 必须成对设置
这两个参数是绑定关系,缺一不可:
-
--memory=512m --memory-swap=1g→ 容器最多用 512MB 物理内存 + 最多 512MB swap(总上限 1GB) -
--memory=512m --memory-swap=512m→ 禁用 swap,纯物理内存限制(适合延迟敏感服务) -
--memory=512m --memory-swap=-1→ 物理内存限 512MB,但 swap 不限(依赖宿主机剩余 swap,风险较高) - 单独写
--memory-swap=1g会报错:“--memory-swap requires --memory to be set”
生产环境推荐禁用 Swap 或严格限制
Swap 虽能缓解内存压力,但频繁换页会导致响应延迟飙升、I/O 飙升,反而加剧系统不稳:
- 对 Web API、数据库代理等低延迟服务:设
--memory=512m --memory-swap=512m,彻底禁用 swap - 对批处理类应用(可容忍延迟):设
--memory=1g --memory-swap=2g,预留 1GB swap 作缓冲,但不超过宿主机 swap 总量的 70% - 绝对避免
--memory-swap=-1在生产环境使用——宿主机 swap 耗尽后,OOM Killer 很可能先杀掉 SSH 或 systemd 进程,导致宿主机“假死”或无法登录
验证配置是否真正生效
启动后别只看命令是否成功,要确认内核层面限制已写入 cgroup:
- 进容器执行:
cat /sys/fs/cgroup/memory/memory.limit_in_bytes(应等于你设的--memory字节数) - 进容器执行:
cat /sys/fs/cgroup/memory/memory.memsw.limit_in_bytes(应等于--memory-swap字节数) - 在宿主机运行:
docker stats --no-stream,观察 “MEM USAGE / LIMIT” 后括号中数值是否含 swap 用量(如324.6MiB / 2GiB)


















