当前位置: 首页 > news >正文

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[@]}"; 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》🕵️♂️
(关注不迷路,我们一起成为容器内存侦探!🔍)

相关文章:

  • 解决:Conda虚拟环境中未设置CUDA_HOME的问题
  • DeepSeek入门到大师 清华大学[1-5版]全集
  • 2007年诺基亚内部对iPhone的竞争分析报告
  • 算法分享——树形DP之最大独立集问题
  • 二分查找算法的全面解析C++
  • vivado 在ip引出来emio 没有显示
  • 计算机毕业设计SpringBoot+Vue.jst房屋租赁系统(源码+LW文档+PPT+讲解)
  • Leetcode 3464. Maximize the Distance Between Points on a Square
  • vue3中解决组件间 css 层级问题最佳实践(Teleport的使用)
  • 计算机网络真题练习(高软29)
  • 会话对象 Cookie 四、Cookie的路径
  • 【PostgreSQL】如何通过调整PostgreSQL配置参数提高数据库性能
  • Git Repo下如何制作一个patch文件
  • Oracle:执行DELETE语句长时间无响应的排查步骤及解决方案
  • 超多目标优化:基于导航变量的多目标粒子群优化算法(NMOPSO)的无人机三维路径规划,MATLAB代码
  • 机器视觉--Halcon的数据结构(数组)
  • STM32单片机开发(6).离散PID公式:位置式PID 增量式PID
  • Unity 3D模型边缘锯齿严重
  • Android 技术栈
  • 跟着李沐老师学习深度学习(十四)
  • 营业范围中网站开发与网页设计/广州品牌seo推广
  • html静态网站作品/seo入门培训学校
  • 公众号链接wordpress/seo技术学院
  • iis建设网站教程/发稿服务
  • @安徽网站建设/怎样推广自己的商城
  • 医院网站建设与管理ppt/百度一下浏览器下载安装