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

ops/2025/2/25 1:50:33/

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

🛠️ 部署自动化

  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% ]]; thenecho "警告!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.ppmy.cn/ops/161083.html

相关文章

DPVS-1:编译安装DPVS (ubuntu22.04)

操作系统 rootubuntu22:~# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.3 LTS Release: 22.04 Codename: jammy rootubuntu22:~# 前置软件准备 apt install git apt install meson apt install gcc ap…

数据结构——二叉搜索树

目录 引言 二叉搜索树 一、基本概念 二、性能分析 三、具体实现 1.基本结构 2.初始化和销毁 3.插入操作 4.查找操作 5.删除操作 四、应用场景 1.K模型 2.KV模型 五、源码 结束语 引言 在之前的学习中,我们已经对二叉树有所了解。详细内容可以看看我…

HTTP SSE 实现

参考: SSE协议 SSE技术详解:使用 HTTP 做服务端数据推送应用的技术 一句概扩 SSE可理解为:服务端和客户端建立连接之后双方均保持连接,但仅支持服务端向客户端推送数据。推送完毕之后关闭连接,无状态行。 下面是基于…

OpenSSL实验

文章目录 一、OpenSSL安装二、OpenSSL配置常见路径查找配置文件的方法示例**1. 配置文件结构****2. 主要段落及其作用****(1) 默认段(Default Section)****(2) OID段(OID Section)****(3) CA相关段(CA Section&#xf…

[Android]App生命周期

类似iOS的applicationWillEnterForeground:等方法 以下是使用 Application.ActivityLifecycleCallbacks 接口来监听应用启动和进入前台的示例代码。 创建一个自定义的 ActivityLifecycleCallbacks 首先,创建一个实现 Application.ActivityLifecycleCallbacks 的类…

华为最新OD机试真题-找单词-Python-OD统一考试(E卷)

最新华为OD机试考点合集:华为OD机试2024年真题题库(E卷+D卷+C卷)_华为od机试题库-CSDN博客 题目描述 给一个字符串和一个 二维字符数组,如果该字符串存在于该数组中,则按字符串的字符顺序输出字符串每个字符所在单元格的位置下标字符串,如果找不到返回字符串“N” 1.需…

采用DDNS-GO与cloudflare实现双域名同时访问NAS

这个标题其实解释的还不够清楚,本人是小白,但是买了群晖的NAS后自己瞎折腾了一下,遇到了如下的问题: 1、家里是移动宽带,没有公网IP,因此Ipv4无法使用,IPV6可以正常使用。 2、办公室场地采用的…

DeepSeek-R1之三_基于RAGFlowAI托管平台在Docker中部署搭建本地AI知识库

DeepSeekR1之三_基于RAGFlowAI托管平台在Docker中部署搭建本地AI知识库 文章目录 DeepSeekR1之三_基于RAGFlowAI托管平台在Docker中部署搭建本地AI知识库1. RAGFlow是什么1. 主要功能1. **"Quality in, quality out"**2. 🍱 **基于模板的文本切片**3. &am…