Docker不支持内存与swap的动态比例配置,只能通过--memory和--memory-swap联合设定绝对上限;swap可用量等于二者差值,且必须同时指定,宿主机需预先启用swap。

Docker 本身不提供“交换比例”这一配置项,比如不能直接设置“内存与 swap 按 1:2 比例自动分配”。它控制的是绝对上限值,而非动态比例。所谓“交换比例”的需求,实际是想让容器在物理内存用尽后,还能利用一定量的 swap 空间缓冲——这必须通过两个参数联合设定来实现:--memory 和 --memory-swap。
核心逻辑:swap 可用量 = --memory-swap − --memory
-
--memory(如512m):容器能使用的最大物理内存 -
--memory-swap(如1g):容器能使用的物理内存 + swap 的总上限 - 二者必须同时指定,且
--memory-swap ≥ --memory - 实际可换出的 swap 空间就是差值,例如:
-
--memory=512m --memory-swap=1g→ 最多可用 512MB swap -
--memory=2g --memory-swap=3g→ 最多可用 1GB swap -
--memory=2g --memory-swap=2g→ swap 被禁用(差值为 0) -
--memory=2g --memory-swap=-1→ 物理内存限 2GB,swap 不限
-
⚠️ 注意:单独设
--memory-swap会报错;宿主机若没启用 swap(swapon --show无输出),即使配了--memory-swap,容器也无法真正换出,OOM 时仍会被直接 kill。
常见配置场景与建议值
轻量服务(API、Nginx)
物理内存紧张但需防偶发峰值:--memory=256m --memory-swap=512m→ 预留 256MB swap 缓冲数据处理/Notebook 类容器
内存波动大,允许温和换页:--memory=4g --memory-swap=6g→ 给 2GB swap 空间,避免过早 OOM延迟敏感服务(如实时 API、数据库)
建议禁用 swap,防止换页引入不可控延迟:--memory=1g --memory-swap=1g开发调试环境(资源宽松)
允许充分使用 swap 降低崩溃概率:--memory=2g --memory-swap=-1
验证是否生效
运行容器后,检查三项:
宿主机确认 swap 已启用:
swapon --show-
查容器 cgroup 限制值(进容器或用
docker exec):cat /sys/fs/cgroup/memory/memory.limit_in_bytes # 应等于 --memory 字节数 cat /sys/fs/cgroup/memory/memory.memsw.limit_in_bytes # 应等于 --memory-swap 字节数
实时查看用量(注意括号内是 memory+swap 总 limit):
docker stats myapp --no-stream
输出类似:MEM USAGE / LIMIT: 324.1MiB / 768MiB→ 表示当前用了 324MB,总上限(mem+swap)768MB
补充说明
- Docker 默认使用 cgroups v1,上述行为稳定可靠;cgroups v2 下语义略有调整,但 Docker 当前仍兼容 v1 路径。
-
--memory-reservation是软限制,不影响 swap 计算,只影响内核回收策略,适合配合硬限使用。 - Swap 文件需在宿主机层面创建并启用,Docker 不负责管理底层 swap 设备。
不复杂但容易忽略。


















