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限制防范宿主机死机内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • win10+Docker Toolbox+mysql教程

    win10+Docker Toolbox+mysql教程

    这篇文章主要介绍了win10+Docker Toolbox+mysql教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • docker-desktop启动k8s的详细方法

    docker-desktop启动k8s的详细方法

    这篇文章主要介绍了docker-desktop启动k8s,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08
  • cgroup blkio子系统对容器的读写限速详解

    cgroup blkio子系统对容器的读写限速详解

    这篇文章主要为大家介绍了cgroup blkio子系统对容器的读写限速详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • 关于如何使用docker部署centos系统测试环境

    关于如何使用docker部署centos系统测试环境

    这篇文章主要介绍了关于如何使用docker部署centos系统测试环境,Docker属于操作系统虚拟化技术,本文图文讲解部署过程,需要的朋友可以参考下
    2023-03-03
  • Docker容器添加自定义MySQL配置文件

    Docker容器添加自定义MySQL配置文件

    本文介绍在Docker容器中通过绑定挂载为MySQL添加自定义配置文件,包括确定绑定挂载目录、创建配置文件、添加配置项、重启容器和验证配置,具有一定的参考价值,感兴趣的可以了解一下
    2024-11-11
  • Mac下Docker Desktop starting的问题及解决过程

    Mac下Docker Desktop starting的问题及解决过程

    作者遇到DockerDesktop启动卡住的问题,原因是VirtualDiskLimit默认64GB限制导致Docker.raw过大,通过复制Docker.raw、修改文件名、重启DockerDesktop,然后增加VirtualDiskLimit值并重命名,解决了问题
    2026-04-04
  • Docker容器启动时初始化Mysql数据库的方法

    Docker容器启动时初始化Mysql数据库的方法

    这篇文章给大家介绍Docker容器启动时初始化Mysql数据库的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2013-11-11
  • Docker部署Ragflow(完美解决502 bad gateway)

    Docker部署Ragflow(完美解决502 bad gateway)

    本文主要介绍了Docker部署Ragflow,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-04-04
  • Docker如何修改容器已经映射的端口

    Docker如何修改容器已经映射的端口

    在项目中我们一般通过命令启动一个容器的时候,通常会通过命令指定容器与物理机网络端口的映射,这篇文章主要给大家介绍了关于Docker如何修改容器已经映射的端口的相关资料,需要的朋友可以参考下
    2023-12-12
  • docker run和start的区别说明

    docker run和start的区别说明

    这篇文章主要介绍了docker run和start的区别说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03

最新评论