Docker内存芭蕾:优雅调整容器内存的极限艺术

news/2025/2/24 17:47:16

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[@]}"; do
    container=${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; then
        status="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_FILE
    else
        status="Failed"
        # 错误信息也记录到日志
        echo "$(date +'%Y-%m-%d %H:%M:%S') | Status: $status | Container: $container | Error: Memory update failed" | tee -a $LOG_FILE
    fi
done

🛠️ 部署自动化

  1. 创建脚本
sudo vim /usr/local/bin/memory_balancer.sh  
# 粘贴上述脚本内容后保存 记得修改你的容器名字 以及如何分配内容哦
  1. 赋予执行权限
sudo chmod +x /usr/local/bin/memory_balancer.sh
  1. 配置定时任务
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
  1. 查看执行日志
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% ]]; then
    echo "警告!app容器内存使用率超过85%" | mail -s "内存警报" admin@example.com
fi

# 根据时间动态调整(上班时间分配更多资源)
if [[ $(date +%H) -ge 9 && $(date +%H) -lt 18 ]]; then
    # 日间模式:增加20%内存
else
    # 夜间模式:减少30%内存
fi


🚨 注意事项

  1. 容器名称适配
    替换脚本中的appdb为你的实际容器

  2. 安全缓冲区调整
    敏感应用可增加安全比例(修改20为更高数值)

  3. 路径问题
    确保cron环境中能识别docker命令(建议使用绝对路径/usr/bin/docker

  4. 权限管理
    如果使用非root用户,需将用户加入docker组:

sudo usermod -aG docker $USER

(保持原文后续内容不变,仅替换最后预告部分)

🐾 下期预告
《等我bug》🕵️♂️
(关注不迷路,我们一起成为容器内存侦探!🔍)


http://www.niftyadmin.cn/n/5864668.html

相关文章

c语言 枚举用法技巧

c语言 枚举用法技巧 typedef enum {Red 0,Green } sc4336p_res_mode;int i 0; td_u8 image_mode;image_mode (sc4336p_res_mode)i; 此分析摘自chatgpt 在你提供的 C 代码片段中,你尝试将一个整数值 i 转换为 sc4336p_res_mode 枚举类型,并将其赋值给…

Sublime Text4安装、汉化

-------------2025-02-22可用---------------------- 官方网址下载:https://www.sublimetext.com 打开https://hexed.it 点击打开文件找到软件安装目录下的 ctrlf 查找 8079 0500 0f94 c2右边启用替换替换为:c641 0501 b200 90点击替换按钮 替换完成后 另存为本地…

车载DoIP协议 --- TCP详细解析

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活…

数据结构与算法再探(七)查找-排序

查找 一、二分查找 二分查找是一种高效的查找算法,适用于在已排序的数组或列表中查找特定元素。它通过将搜索范围逐步减半来快速定位目标元素。理解二分查找的“不变量”和选择左开右闭区间的方式是掌握这个算法的关键。 二分查找关键点 不变量 在二分查找中&a…

Day9,Hot100(图论)

图论 图论部分推荐 acm 模式,因为图的输入处理不一样 DFS,类似二叉树的递归遍历 BFS,类似二叉树的层次遍历 208. 实现 Trie (前缀树) 数据结构大概如下: 可以看成是 二十六叉树 (因为26个小写字母) …

C++的设计模式

1. 创建型模式 单例模式 (Singleton) 意图:确保类仅有一个实例,并提供全局访问点。(常见的日志类)实现:class Singleton { private:static Singleton* instance;Singleton() {} // 私有构造函数 public:static Singl…

【深度学习】手写数字识别任务

数字识别是计算机从纸质文档、照片或其他来源接收、理解并识别可读的数字的能力,目前比较受关注的是手写数字识别。手写数字识别是一个典型的图像分类问题,已经被广泛应用于汇款单号识别、手写邮政编码识别等领域,大大缩短了业务处理时间&…

Linux 命令大全完整版(11)

5.文件管理命令 diff&#xff08;differential&#xff09; 功能说明&#xff1a;比较文件的差异。语  法&#xff1a;diff [-abBcdefHilnNpPqrstTuvwy][-<行数>][-C <行数>][-D <巨集名称>][-I <字符或字符串>][-S <文件>][-W <宽度>…