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
🛠️ 部署自动化
- 创建脚本:
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% ]]; then
echo "警告!app容器内存使用率超过85%" | mail -s "内存警报" admin@example.com
fi
# 根据时间动态调整(上班时间分配更多资源)
if [[ $(date +%H) -ge 9 && $(date +%H) -lt 18 ]]; then
# 日间模式:增加20%内存
else
# 夜间模式:减少30%内存
fi
🚨 注意事项
-
安全缓冲区调整:
敏感应用可增加安全比例(修改20
为更高数值) -
权限管理:
如果使用非root用户,需将用户加入docker组:
sudo usermod -aG docker $USER
(保持原文后续内容不变,仅替换最后预告部分)
🐾 下期预告
《等我bug》🕵️♂️
(关注不迷路,我们一起成为容器内存侦探!🔍)