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

可以通过 docker run 的 --memory 和 --memory-swap 参数联合控制容器的内存与 swap 使用上限。
理解 --memory 与 --memory-swap 的关系
这两个参数必须**一起使用**,且 --memory-swap 值必须 ≥ --memory 值:
-
--memory:限制容器可用的物理内存(RAM)上限,例如512m、2g; -
--memory-swap:限制容器可使用的「内存 + swap」总和; - 当
--memory-swap等于--memory时,表示禁用 swap(即容器无法使用任何 swap 空间); - 当
--memory-swap大于--memory时,差值即为允许使用的 swap 量(例如--memory=512m --memory-swap=1g表示最多用 512MiB RAM + 512MiB swap); - 若只设
--memory而不设--memory-swap,Docker 默认将--memory-swap设为--memory的两倍(即允许等量 swap),但该行为依赖宿主机是否启用 swap。
常用配置示例
以下命令均以运行一个 Ubuntu 容器为例:
- 仅限物理内存,禁止 swap:
docker run -it --memory=512m --memory-swap=512m ubuntu:22.04 - 允许最多 512MiB 内存 + 256MiB swap(共 768MiB):
docker run -it --memory=512m --memory-swap=768m ubuntu:22.04 - 不限制 swap(仅限物理内存)——需显式设为
-1(前提是宿主机有 swap):docker run -it --memory=512m --memory-swap=-1 ubuntu:22.04
验证限制是否生效
进入容器后,可通过以下方式确认:
- 查看 cgroup 设置:
cat /sys/fs/cgroup/memory/memory.limit_in_bytes→ 对应--memory值(字节);cat /sys/fs/cgroup/memory/memory.memsw.limit_in_bytes→ 对应--memory-swap值(字节); - 若两者相等,说明 swap 已被禁用;
- 注意:容器内通常看不到 swap 分区,实际 swap 使用由内核在 cgroup 约束下动态分配,不可直接通过
free或swapon -s观察到用量。
注意事项
这些内存限制依赖 Linux cgroups v1 或 v2,需确保:
- 宿主机内核启用
CONFIG_MEMCG和CONFIG_MEMCG_SWAP(主流发行版默认开启); - Docker 启动时未禁用 swap accounting(如未加
--no-swappiness或修改daemon.json中的"default-ulimits"等干扰项); - 宿主机本身需配置 swap 分区或 swapfile,否则即使设了
--memory-swap大于--memory,也无法真正使用 swap; - 对使用 Java、Node.js 等自带内存管理的运行时,还需配合 JVM 参数(如
-XX:+UseContainerSupport)或环境变量(如NODE_OPTIONS=--max_old_space_size=400)避免其无视 cgroup 限制。











