Docker内存芭蕾:优雅调整容器内存的极限艺术
title: “💾 Docker内存芭蕾:优雅调整容器内存的极限艺术”
author: “Cjs”
date: “2025-2-23”
emoji: “🩰💥📊”
当你的容器变成内存吸血鬼时…
🚀 完美内存编排示范
📜 智能内存管家脚本
#!/bin/bash
# memory_balancer_v3.sh# 定义容器列表和对应的内存分配比例(总可用内存的百分比)
containers=("container-1" "container-2" "container-3" "container-4" "container-5")
percentages=(10 20 30 20 20)# 获取系统总内存
TOTAL_MEM=$(free -b | awk '/Mem:/{print $2}')# 设置安全缓冲为总内存的20%
SAFETY_BUFFER=$((TOTAL_MEM * 20 / 100))# 计算可用内存(总内存 - 安全缓冲)
AVAILABLE_MEM=$((TOTAL_MEM - SAFETY_BUFFER))# 日志文件路径
LOG_FILE="memory_balancer.log"# 格式转换函数:字节转GB
bytes_to_gb() {echo "scale=2; $1 / 1024 / 1024 / 1024" | bc
}# 格式转换函数:字节转MB
bytes_to_mb() {echo "scale=0; $1 / 1024 / 1024" | bc
}for i in "${!containers[@]}"; docontainer=${containers[$i]}percentage=${percentages[$i]}# 计算内存限制mem_limit=$(( AVAILABLE_MEM * percentage / 100 ))swap_limit=$(( mem_limit * 150 / 100 ))# 获取旧内存设置old_mem=$(docker inspect $container --format '{{.HostConfig.Memory}}' 2>/dev/null || echo "0")old_swap=$(docker inspect $container --format '{{.HostConfig.MemorySwap}}' 2>/dev/null || echo "0")# 转换单位用于显示total_mem_gb=$(bytes_to_gb $TOTAL_MEM)old_mem_mb=$(bytes_to_mb $old_mem)new_mem_mb=$(bytes_to_mb $mem_limit)new_swap_mb=$(bytes_to_mb $swap_limit)# 执行内存更新if docker update --memory="$mem_limit" --memory-swap="$swap_limit" $container >/dev/null 2>&1; thenstatus="Success"# 记录到日志文件echo "$(date +'%Y-%m-%d %H:%M:%S') | Status: $status | Container: $container | TotalMem: ${total_mem_gb}GB | OldMem: ${old_mem_mb}MB | NewMem: ${new_mem_mb}MB | NewSwap: ${new_swap_mb}MB" | tee -a $LOG_FILEelsestatus="Failed"# 错误信息也记录到日志echo "$(date +'%Y-%m-%d %H:%M:%S') | Status: $status | Container: $container | Error: Memory update failed" | tee -a $LOG_FILEfi
done
🛠️ 部署自动化
- 创建脚本:
sudo vim /usr/local/bin/memory_balancer.sh
# 粘贴上述脚本内容后保存 记得修改你的容器名字 以及如何分配内容哦
- 赋予执行权限:
sudo chmod +x /usr/local/bin/memory_balancer.sh
- 配置定时任务:
sudo crontab -e # 使用root权限编辑cron
添加以下内容:
# 每分钟检测一次,Docker运行时生效
* * * * * if [ $(systemctl is-active docker) = "active" ]; then /usr/local/bin/memory_balancer.sh >> /var/log/memory_balancer.log 2>&1; fi
- 查看执行日志:
tail -f /var/log/memory_balancer.log # 实时监控调整记录

🔍 脚本功能详解
| 代码片段 | 功能说明 | 可视化比喻 |
|---|---|---|
free -b | 精确获取物理内存字节数 | 🕵️♂️ 内存侦探 |
SAFETY_BUFFER计算 | 保留20%内存应对突发流量 | 🚧 安全气囊 |
docker update命令 | 动态调整运行中容器的内存限制 | 🎚️ 内存调音师 |
cron定时任务 | 每分钟自动优化内存分配 | ⏰ 内存生物钟 |
💡 高阶技巧:智能扩展
# 添加邮件报警功能(需安装mailutils)
MEM_USAGE=$(docker stats --no-stream --format "{{.MemUsage}}" app | cut -d'/' -f1)
if [[ $MEM_USAGE > 85% ]]; thenecho "警告!app容器内存使用率超过85%" | mail -s "内存警报" admin@example.com
fi# 根据时间动态调整(上班时间分配更多资源)
if [[ $(date +%H) -ge 9 && $(date +%H) -lt 18 ]]; then# 日间模式:增加20%内存
else# 夜间模式:减少30%内存
fi

🚨 注意事项
-
容器名称适配:
替换脚本中的app和db为你的实际容器名 -
安全缓冲区调整:
敏感应用可增加安全比例(修改20为更高数值) -
路径问题:
确保cron环境中能识别docker命令(建议使用绝对路径/usr/bin/docker) -
权限管理:
如果使用非root用户,需将用户加入docker组:
sudo usermod -aG docker $USER
(保持原文后续内容不变,仅替换最后预告部分)
🐾 下期预告
《等我bug》🕵️♂️
(关注不迷路,我们一起成为容器内存侦探!🔍)
相关文章:
Docker内存芭蕾:优雅调整容器内存的极限艺术
title: “💾 Docker内存芭蕾:优雅调整容器内存的极限艺术” author: “Cjs” date: “2025-2-23” emoji: “🩰💥📊” 当你的容器变成内存吸血鬼时… 🚀 完美内存编排示范 📜 智能内存管家脚本…...
一周学会Flask3 Python Web开发-flask3上下文全局变量session,g和current_app
锋哥原创的Flask3 Python Web开发 Flask3视频教程: 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili flask3提供了session,g和current_app上下文全局变量来方便我们操作访问数据。 以下是一个表格,用于比较Flask中的…...
【蓝桥杯单片机】客观题
一、第十三届省赛(一) 二、第十三届省赛(二)...
QT中经常出现的用法:组合
在 C 中,一个类包含另一个类的对象称为组合( Composition )。这是一种常见的设计模式,用 于表示一个类是由另一个类的对象组成的。这种关系通常表示一种 " 拥有 " ( "has-a" )的关系。…...
下载CentOS 10
1. 进入官网:https://www.centos.org/ 2. 点击右上角的Download进入下载页面。 3. 选择对应的CPU架构,点击ISOs下面的Mirrors开始下载。...
第9章:LangChain让大模型结构化输出
文章详细介绍了LangChain4j中如何使用结构化输出(Structured Outputs)。主要内容包括: JSON Schema:通过指定JSON Schema,LLM可以生成符合结构的输出。工具(Tools):通过工具调用实现…...
ES6 新特性,优势和用法?
ES6 新特性,优势和用法? ES6(ECMAScript 2015)引入了许多新特性,这些特性让 JavaScript 变得更加强大、简洁和易于使用。下面为你详细介绍一些常见的 ES6 新特性、它们的优势以及用法。 1. 块级作用域:le…...
简说spring 的设计模式
spring 的设计模式(23种…) (面试题)说说BeanFactory和FactoryBean的实现原理和区别? spring 中你还知道哪些设计模式?? 1.简单工厂模式 实质: 由一个工厂类根据传入的参数,动态决…...
【 Avalonia UI 语言国际化 I18n】图文结合教学,保姆级教学,语言国际化就是这么简单(.Net C#)
完整项目地址 github : https://github.com/Crazy-GrowUp/AvaloniaI18nTest/tree/master gitee :https://gitee.com/jack_of_disco/avalonia-i18n-test 0.项目新建 Properties 文件夹 对应的项目配置文件里面就会增加 <Folder Include"Properties\" /> 1.项…...
Spring Boot 日志管理(官网文档解读)
摘要 本篇文章详细介绍了SpringBoot 日志管理相关的内容,文章主要参考官网文章的描述内容,并在其基础上进行一定的总结和拓展,以方便学习Spring Boot 的小伙伴能快速掌握Spring Boot 日志管理相关的内容。 日志实现方式 Sping Boot 的日志管…...
Nginx学习笔记:常用命令端口占用报错解决Nginx核心配置文件解读
Nginx 1. 基础命令1.1 重新加载systemd配置1.2 停止Nginx服务1.3 启动Nginx服务1.4 重启Nginx服务1.5 查看Nginx服务状态1.6 测试配置和重载Nginx 2. 额外命令2.1 启用开机自启2.2 禁用开机自启2.3 强制关闭所有Nginx进程 3. Nginx端口占用解决方案3.1 查找占用端口8090的进程3…...
【玩转 Postman 接口测试与开发2_020】(完结篇)DIY 实战:随书示例 API 项目本地部署保姆级搭建教程(含完整调试过程)
《API Testing and Development with Postman》最新第二版封面 文章目录 最新版《Postman 接口测试与开发实战》示例 API 项目本地部署保姆级搭建教程1 前言2 准备工作3 具体部署3.1 将项目 Fork 到自己名下3.2 创建虚拟环境并安装依赖3.3 初始运行与项目调试 4 示例项目的用法…...
高清下载油管视频到本地
下载工具并安装: yt-dlp官网地址: GitHub - yt-dlp/yt-dlp: A feature-rich command-line audio/video downloader ffmpeg官网地址: Download FFmpeg 注:记住为其添加环境变量 操作命令: 该指令表示以720p码率下载VIDEO_UR…...
网络运维学习笔记 021 HCIA-Datacom新增知识点02 SDN与NFV概述
SDN与NFV概述 经典IP网络是一个分布式的、对等控制的网络。 每台网络设备存在独立的数据平面、控制平面和管理平面。 设备的控制平面对等的交互路由协议,然后独立的生成数据平面指导报文转发。 它的优势在于设备与协议解耦,厂家间的兼容性较好且故障场景…...
《论模型驱动架构设计方法及其应用》审题技巧 - 系统架构设计师
软件测试工程师软考论文写作框架 一、考点概述 “模型驱动架构设计及其应用”这一论题,主要考察了考生对模型驱动架构设计(MDA)这一先进软件设计方法的理解与应用能力。论题涵盖了MDA的基本概念、核心要素、实施流程及在实际项目中的应用等…...
【Linux】多线程 -> 线程同步与基于BlockingQueue的生产者消费者模型
线程同步 条件变量 当一个线程互斥地访问某个变量时,它可能发现在其它线程改变状态之前,它什么也做不了。 例如:一个线程访问队列时,发现队列为空,它只能等待,直到其它线程将一个节点添加到队列中。这…...
Docker Mysql 数据迁移
查看启动命令目录映射 查看容器名称 docker ps查看容器的启动命令 docker inspect mysql8.0 |grep CreateCommand -A 20如下图所示:我这边是把/var/lib/mysql 目录映射到我宿主机的/mnt/mysql/data目录下,而且我的数量比较大使用方法1的话时间比较久,所以我采用方法2 如果没…...
四步彻底卸载IDEA!!!
各位看官早安午安晚安呀 如果您觉得这篇文章对您有帮助的话 欢迎您一键三连,小编尽全力做到更好 欢迎您分享给更多人哦 大家好,我们今天来学习四步彻底卸载IDEA!!! 首先我要提醒各位 如果你想删除 IDEA 相关…...
HTTP实验(ENSP模拟器实现)
HTTP概述 HTTP(HyperText Transfer Protocol,超文本传输协议),设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。 HTTP定义了多种请求方法,常用的包括: GET:请求资源。 POST&…...
【网络安全】常见的web攻击
1、SQL注入攻击 定义: 攻击者在HTTP请求中注入恶意的SQL代码,当服务器利用参数构建SQL语句的时候,恶意的SQL代码被一起构建,并在数据库中执行。 示例: 用户登录: 输入用户名xx, 密码 or 1 …...
登录-05.JWT令牌-介绍
一.JWT令牌 JWT令牌是一种简洁的、自包含的格式,用于在通讯双方之间以json数据格式安全的传输数据。说白了,JWT令牌就是将json格式的数据进行封装,从而实现安全传输。 所谓简洁,就是指JWT令牌就是一个简单的字符串。 所谓自包含…...
K8S下redis哨兵集群使用secret隐藏configmap内明文密码方案详解
#作者:朱雷 文章目录 一、背景环境及方案说明1.1、环境说明1.2、方案一:使用配置文件设置密码1.3、方案二:使用args 的命令行传参设置密码 二、redis secret configmap deployment参考2.1 创建secret-redis.yaml参考2.2 修改configmap配置参…...
Spring框架基本使用(Maven详解)
前言: 当我们创建项目的时候,第一步少不了搭建环境的相关准备工作。 那么如果想让我们的项目做起来方便快捷,应该引入更多的管理工具,帮我们管理。 Maven的出现帮我们大大解决了管理的难题!! Maven…...
spring boot知识点4
1.如何监视所有spring boot微服务 安装actuator插件,然后通过接口查询 /actuator/health 2.spring boot项目性能如何优化 a.优化启动时间,去除重复的依赖 b.JVM优化(java虚拟机优化),限制堆的最小最大值 c.数据库…...
简识Spring创建Bean方式和设计模式
一、理论解释: Spring在创建Bean时主要有四种方式,这些方式分别涉及到了不同的设计模式。以下是具体的创建方式及对应的设计模式: 通过反射调用构造方法创建Bean: 方式:在Spring的配置文件中,使用<bean…...
归并排序 Listnode* vector<int> vector<ListNode*>
加粗样式 ListNode* merge(ListNode* l1,ListNode* l2){ListNode* dummyheadnew ListNode(0);ListNode* curdummyhead;while(l1&&l2){if(l1->val>l2->val){cur->nextl2;l2l2->next;curcur->next;}else if(l1->val<l2->val){cur->nextl1…...
深度解析:大模型在多显卡服务器下的通信机制与分布式训练——以DeepSeek、Ollama和vLLM为例
一、引言:大模型与多显卡的必然结合 随着大模型参数规模突破千亿级(如GPT-4、DeepSeek),单显卡的显存容量与算力已无法满足需求。多显卡并行计算成为训练与推理的核心技术,其核心挑战在于高效通信与负载均衡。本文以国…...
鸿蒙NEXT应用App测试-专项测试(DevEco Testing)
注意:大家记得先学通用测试在学专项测试 鸿蒙NEXT应用App测试-通用测试-CSDN博客 注意:博主有个鸿蒙专栏,里面从上到下有关于鸿蒙next的教学文档,大家感兴趣可以学习下 如果大家觉得博主文章写的好的话,可以点下关注…...
达梦数据库学习笔记@1
目录 达梦数据库学习笔记一、表空间管理(一)默认表空间(二)相关数据字典(三)表空间操作(四)临时表空间管理 二、重做日志管理(一)系统视图(二&…...
设计模式| 观察者模式 Observer Pattern详解
目录 一、概述1.1 动机1.2 核心思想1.3 别名 二、角色与实现原理2.1 角色2.2 实现原理2.3 类图 三、经典接口实现3.1 示例3.1.1 观察者接口3.1.2 目标接口3.1.3 具体被观察者3.1.4 具体观察者3.1.5 Client3.1.6 UML时序图 3.2 特点 四、其他实现方式4.1 委托与事件(…...
