daemon.json无法配置容器Swap限制,仅支持全局swappiness参数;容器级Swap上限必须通过docker run的--memory和--memory-swap成对设置,并依赖宿主机启用swap分区及cgroup swap支持。
daemon.json 文件本身不能直接配置容器的 swap 交换分区限制。它不提供 --memory 或 --memory-swap 这类容器级资源控制参数。这些必须在 docker run 启动时显式指定,或通过 compose 文件、kubernetes pod spec 等运行时方式设置。
daemon.json 中与 Swap 相关的唯一有效配置是 swappiness
该参数作用于整个宿主机内核,影响所有进程(包括 Docker 容器)的内存换出倾向,取值范围 0–100:
- swappiness=0:内核极度避免 swap,仅在内存严重不足时才换出(推荐生产环境)
- swappiness=10~30:平衡策略,适度使用 swap 缓解瞬时压力
- swappiness=60(默认):较积极换出,适合桌面或开发机
- swappiness=100:尽可能把匿名页换出,易导致延迟升高,不建议
配置示例(/etc/docker/daemon.json):
真正控制容器 Swap 使用上限,靠的是 --memory 和 --memory-swap
这是容器启动时的强制约束,和 daemon.json 无关,但依赖宿主机基础支持:
- 必须成对使用:
--memory=512m --memory-swap=1g→ 容器最多用 512MB 物理内存 + 512MB swap -
--memory-swap=512m表示禁用 swap(swap 预留为 0) -
--memory-swap=-1表示不限 swap(危险,生产环境禁止)
宿主机前提条件必须满足
无论 daemon.json 怎么配,以下三项缺一不可:
-
已启用 swap 分区或 swapfile:运行
swapon --show应有输出;若无,需用fallocate+mkswap+swapon创建 -
cgroup swap 控制已开启:检查
/sys/fs/cgroup/memory/memory.memsw.limit_in_bytes是否存在;若无,需在/etc/default/grub中添加cgroup_enable=memory swapaccount=1并重启 -
Docker 未运行在 cgroups v2 强制模式下(除非你明确配置并验证过 v2 的
memory.swap.max行为)
为什么不要依赖 daemon.json 控制 Swap 用量
因为:
- swappiness 是全局内核调优项,不是资源配额,无法防止单个容器耗尽全部 swap
- 没有容器级隔离能力,一个失控容器仍可拖垮整台机器
- 真正防夯死的核心机制是
--memory和--memory-swap成对划定硬边界


















