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

 更新时间:2026年04月27日 09:44:10   作者:舞夢輝影  
这篇文章主要介绍了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)或不超过 1.5 倍内存
  • 关键业务容器配置 --restart=on-failure:3,避免无限重启
  • 宿主机开启 swapaccount=1 和 cgroup_enable=memory
  • 部署 Prometheus + cAdvisor 监控,设置内存使用率 >70% 告警
  • 定期执行 docker stats 审查资源分配是否合理

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

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

相关文章

  • Docker中编码和时区设置不生效问题排查小结

    Docker中编码和时区设置不生效问题排查小结

    本文主要介绍了在Docker容器中排查编码和时区设置不生效的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-01-01
  • 在Docker容器中部署MSSQL

    在Docker容器中部署MSSQL

    这篇文章介绍了在Docker容器中部署MSSQL的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • Docker核心概念与镜像仓库操作指南

    Docker核心概念与镜像仓库操作指南

    文章讲解了Docker核心概念与操作,包括镜像(只读模板)、容器(运行实例)、镜像仓库(存储分发平台)的定义及蛋糕、图书馆等类比,梳理了镜像拉取、推送、搜索等常用命令,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2025-09-09
  • Docker网络配置与自定义IP容器通信

    Docker网络配置与自定义IP容器通信

    IP地址是Docker容器在网络中的唯一标识,每个Docker都会被分配一个 IP,用于网络通信,本文主要介绍了Docker网络配置与自定义IP容器通信,感兴趣的可以了解一下
    2024-03-03
  • Docker如何使用OpenvSwitch网桥

    Docker如何使用OpenvSwitch网桥

    本篇文章主要介绍了Docker如何使用OpenvSwitch网桥,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • 从Docker容器复制文件到主机的四种方法

    从Docker容器复制文件到主机的四种方法

    在使用Docker进行开发和部署时,有时需要将容器内生成的构建工件复制到主机上,例如,在持续集成服务器上使用Docker构建依赖项,而不希望在代理服务器上安装所有运行时和库,所以本文给大家介绍了从Docker容器复制文件到主机的四种方法
    2025-06-06
  • 在docker中部署k8s的方法

    在docker中部署k8s的方法

    这篇文章主要介绍了在docker中部署k8s的方法,包括K8S的基本概念介绍,docker容器的下载方法及k8s相关命令介绍,感兴趣的朋友一起看看吧
    2021-07-07
  • Docker环境安装anythingllm教程

    Docker环境安装anythingllm教程

    用户询问Docker操作步骤,包括拉取镜像、创建挂载目录并检查写权限,使用--cap-add SYS_ADMIN启用安全沙箱,以运行特定应用或服务,其他常用Docker命令亦可参考
    2025-07-07
  • Dockerfile常用命令的使用简介

    Dockerfile常用命令的使用简介

    这篇文章主要介绍了Dockerfile常用命令的使用简介,帮助大家更好的理解和学习使用Docker,感兴趣的朋友可以了解下
    2021-04-04
  • Docker 启动Redis 并设置密码的操作

    Docker 启动Redis 并设置密码的操作

    这篇文章主要介绍了Docker 启动Redis 并设置密码的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11

最新评论