docker

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > 云和虚拟化 > docker > Docker Swap限制防范宿主机死机

Docker中配置容器的Swap限制防范宿主机死机

作者:舞夢輝影

这篇文章主要介绍了Docker中配置容器的Swap限制防范宿主机死机,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

要在 Docker 中配置 Swap 限制来防范宿主机死机,核心不是“单独限制 Swap”,而是通过 --memory 和 --memory-swap 联合控制内存与交换空间的总边界。Swap 本身不是万能保险——若宿主机没开启 swap 分区,容器根本用不了 swap;若配置不当(比如只设 --memory-swap 不设 --memory),Docker 会直接报错或静默降级,起不到防护作用。

一、核心参数:限制容器 Swap

Docker 使用 --memory-swap 控制"内存 + Swap"的总和,而非仅 Swap 大小。

场景命令 / 配置说明
完全禁用 Swap(推荐生产环境)docker run -m 1g --memory-swap=1gmemory-swap 等于 memory,Swap 被禁,容器超限即触发 OOM Killer,快速止损 
限制 Swap 用量docker run -m 1g --memory-swap=2g可用 1GB 内存 + 1GB Swap,总计 2GB
危险:不限制 Swapdocker run -m 1g(默认)默认 Swap = memory,总计 2GB;若设为 -1 则无限 Swap,极易拖垮宿主机 

Docker Compose 配置示例

services:
  app:
    image: myapp:latest
    deploy:
      resources:
        limits:
          memory: 1G
          memory-swap: 1G   # 与 memory 相同,禁用 swap
        reservations:
          memory: 512M
    restart: on-failure:3

二、宿主机层面加固

1. 启用 cgroup swap 限制支持

部分 Ubuntu/Debian 系统默认未开启,需修改 GRUB:

# 编辑 /etc/default/grub
GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"
sudo update-grub
sudo reboot

开启后约有 1% 内存开销和 10% 性能损耗,但生产环境强烈建议开启。

2. 调整宿主机 Swappiness

降低系统使用 Swap 的激进程度,优先使用物理内存:

# 临时生效
sudo sysctl vm.swappiness=10
# 永久生效:写入 /etc/sysctl.conf
echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.conf

3. 设置 Docker Daemon 全局限制

/etc/docker/daemon.json 中配置默认资源限制(需重启 Docker):

{
  "default-ulimits": {
    "memlock": { "Name": "memlock", "Hard": -1, "Soft": -1 }
  }
}

三、关键注意事项

⚠️ 危险操作后果建议
--memory-swap=-1容器可无限使用 Swap,导致磁盘 thrashing,宿主机卡死生产环境绝对禁止 
--oom-kill-disable 且未设 -mOOM 时内核无法杀容器,可能杀系统进程或导致死机仅在设置了 -m 且明确需要时才使用 
容器设置 restart: always + 无资源限制容器反复 OOM 重启,持续消耗资源使用 on-failure:3 限制重启次数 

四、监控与应急

1. 检查现有容器是否有限制

docker ps --format "{{.Names}}" | xargs docker inspect \
  --format='{{.Name}}: Memory={{.HostConfig.Memory}} Swap={{.HostConfig.MemorySwap}}'

Memory=0 表示无限制,是潜在风险。

2. 实时监控

# 查看容器内存/Swap 使用
docker stats --no-stream --format "table {{.Name}}\t{{.MemUsage}}\t{{.MemPerc}}"
# 查看宿主机 Swap 使用
free -h
cat /proc/swaps

3. 应急处理(宿主机已卡死)

若宿主机已因 Swap 耗尽死机,需通过 VNC/控制台连接:

# 停止 Docker 服务,防止容器自动重启
systemctl stop docker
# 找到问题容器并删除/禁用
cd /var/lib/docker/containers/
# 修改 hostconfig.json 中 RestartPolicy 为 never,或删除容器目录
systemctl start docker

五、生产环境检查清单

一句话总结:生产环境中,给每个容器设置 --memory 并令 --memory-swap 等于 --memory,是防止单个容器耗尽宿主机 Swap 导致系统死机的最有效手段 。

到此这篇关于Docker中配置容器的Swap限制防范宿主机死机的文章就介绍到这了,更多相关Docker Swap限制防范宿主机死机内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文