找回密码
 注册

Sign in with Twitter

It's what's happening?

微信登录

微信扫一扫,快速登录

查看: 86|回复: 0

AI 一键生成 Docker 容器自动扩缩容脚本:CPU/内存自适应,运维彻底无人值守|AI+Linux 实战营

[复制链接]
发表于 2026-3-21 18:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册 微信登录

×
作者:微信文章
AI 一键生成 Docker 容器自动扩缩容脚本:CPU/内存自适应,运维彻底无人值守|AI+Linux 实战营

大家好,这里是「AI+Linux 实战营」。
上篇我们升级了 Docker 面板增强版,新增了CPU/内存监控、批量操作、权限控制等8大功能,很多同学反馈:
    • “面板能监控、能批量操作,能不能让容器自己根据负载自动增减?”• “高峰期容器扛不住,得手动启动;低峰期空转浪费资源,太麻烦!”• “不想24小时盯监控,有没有办法实现无人值守?”

今天这篇,我们就兑现承诺,带来 「Docker容器自动扩缩容脚本」,AI一键生成,无需复杂配置,30秒部署完成,完美适配之前的Docker面板,实现“监控+自动调节”双重保障:
✅ 实时监控容器 CPU / 内存使用率
✅ 超过阈值自动扩容,分担负载不卡顿
✅ 负载下降自动缩容,释放资源不浪费
✅ 自定义最小/最大容器数,防止服务中断
✅ 操作全程日志记录,可追溯、可排查
✅ 轻量不侵入,不影响现有容器和业务
✅ 兼容CentOS/Ubuntu,与Docker面板无缝适配
✅ 无需部署K8s,一个脚本搞定自动运维

一句话:面板管“可视化”,脚本管“自动化”,两者结合,运维彻底解放双手!


一、使用前提(简单易满足)


已安装Docker(未安装的同学可查看历史文章,有一键部署脚本);
已部署Docker面板(基础版/增强版均可,不影响面板正常使用);
服务器有空闲资源(用于扩容时启动新容器);
CentOS 7/8/9、Ubuntu 18/20/22 通用,无需额外依赖。
快速检查Docker是否正常运行


# 检查Docker服务是否运行
systemctl status docker

# 检查是否有运行中的容器(有容器才可开启扩缩容)
docker ps
二、AI 一键生成扩缩容脚本提示词

帮我生成Docker容器自动扩缩容脚本,要求:
1. 核心功能:根据CPU/内存使用率自动扩容、缩容,支持自定义阈值;
2. 新增:
   - 实时监控容器CPU/内存使用率
   - 自定义最小/最大容器数,防止服务中断
   - 扩缩容行为自动记录日志,可追溯
   - 智能识别主容器,不误关核心业务容器
3. 适配CentOS、Ubuntu所有主流Linux系统;
4. 轻量不侵入,不影响现有容器和Docker面板;
5. 一键部署,无需复杂配置,支持后台运行;
6. Shell脚本,注释清晰,可自定义配置参数。三、一键自动扩缩容脚本(可直接复制发布)


#!/bin/bash
# AI+Linux实战营 | Docker容器自动扩缩容脚本
# 功能:根据CPU/内存使用率自动扩容、缩容,无人值守
# 适配:CentOS 7/8/9、Ubuntu 18/20/22,兼容Docker面板
# 升级后可与Docker面板同时运行,互不影响

# ===================== 核心配置(可自定义修改) =====================
TARGET_CONTAINER="your-container-name"  # 目标容器名称(必填,替换成你的容器名)
CPU_THRESHOLD=80                        # CPU使用率阈值(超过则扩容,默认80%)
MEM_THRESHOLD=90                        # 内存使用率阈值(超过则扩容,默认90%)
MIN_CONTAINERS=1                        # 最小容器数(至少保留1个,防止服务中断)
MAX_CONTAINERS=5                        # 最大容器数(最多扩容到5个,可修改)
CHECK_INTERVAL=30                       # 检测间隔(单位:秒,默认30秒检测一次)
LOG_FILE="/var/log/docker-auto-scaling.log"  # 扩缩容日志文件路径

# ===================== 前置检查(自动执行,无需修改) =====================
check_dependency() {
    # 检查Docker是否安装并运行
    if ! command -v docker &> /dev/null; then
        echo "[$(date +'%Y-%m-%d %H:%M:%S')] ❌ 未安装Docker,请先安装Docker!" >> $LOG_FILE
        exit 1
    fi
    if ! docker ps >/dev/null 2>&1; then
        echo "[$(date +'%Y-%m-%d %H:%M:%S')] 🔄 启动Docker服务..." >> $LOG_FILE
        systemctl start docker >/dev/null 2>&1
        sleep 3
        if ! docker ps >/dev/null 2>&1; then
            echo "[$(date +'%Y-%m-%d %H:%M:%S')] ❌ Docker启动失败,请手动排查!" >> $LOG_FILE
            exit 1
        fi
    fi

    # 检查目标容器是否存在
    if ! docker ps -a | grep -q "$TARGET_CONTAINER"; then
        echo "[$(date +'%Y-%m-%d %H:%M:%S')] ❌ 目标容器 $TARGET_CONTAINER 不存在,请检查容器名称!" >> $LOG_FILE
        exit 1
    fi

    # 创建日志文件(用于追溯扩缩容行为)
    touch $LOG_FILE
    echo "[$(date +'%Y-%m-%d %H:%M:%S')] 📝 自动扩缩容日志初始化完成" >> $LOG_FILE
}

# ===================== 功能函数:获取容器CPU/内存使用率 =====================
get_container_stats() {
    local container_name=$1
    # 获取CPU使用率(保留整数,去除%符号)
    cpu_usage=$(docker stats --no-stream --format "{{.CPUPerc}}" "$container_name" 2>/dev/null | head -1 | sed 's/%//g' | awk '{print int($1)}')
    # 获取内存使用率(保留整数,去除%符号)
    mem_usage=$(docker stats --no-stream --format "{{.MemPerc}}" "$container_name" 2>/dev/null | head -1 | sed 's/%//g' | awk '{print int($1)}')
   
    # 异常处理(获取失败时返回0,避免脚本崩溃)
    [ -z "$cpu_usage" ] && cpu_usage=0
    [ -z "$mem_usage" ] && mem_usage=0

    echo "$cpu_usage $mem_usage"
}

# ===================== 功能函数:获取当前运行的容器数 =====================
get_running_containers() {
    local container_name=$1
    # 统计包含目标名称的运行中容器数(支持副本容器,名称包含target_container)
    running_count=$(docker ps --format "{{.Names}}" | grep -c "$container_name")
    echo $running_count
}

# ===================== 核心逻辑:自动扩缩容(无需修改) =====================
auto_scaling() {
    check_dependency
    echo "[$(date +'%Y-%m-%d %H:%M:%S')] ✅ Docker自动扩缩容脚本启动成功" >> $LOG_FILE
    echo "[$(date +'%Y-%m-%d %H:%M:%S')] 📌 配置信息:目标容器=$TARGET_CONTAINER,CPU阈值=$CPU_THRESHOLD%,内存阈值=$MEM_THRESHOLD%,最小容器数=$MIN_CONTAINERS,最大容器数=$MAX_CONTAINERS,检测间隔=$CHECK_INTERVAL秒" >> $LOG_FILE

    # 循环检测,实现7×24小时无人值守
    while true; do
        # 获取当前容器CPU、内存使用率
        stats=$(get_container_stats "$TARGET_CONTAINER")
        cpu_usage=$(echo "$stats" | cut -d' ' -f1)
        mem_usage=$(echo "$stats" | cut -d' ' -f2)
        # 获取当前运行的容器数
        running_count=$(get_running_containers "$TARGET_CONTAINER")

        # 打印当前状态(日志+控制台,便于查看)
        current_time=$(date +'%Y-%m-%d %H:%M:%S')
        echo "[$current_time] 📊 当前状态:运行容器数=$running_count,CPU使用率=$cpu_usage%,内存使用率=$mem_usage%" >> $LOG_FILE
        echo "[$current_time] 📊 当前状态:运行容器数=$running_count,CPU使用率=$cpu_usage%,内存使用率=$mem_usage%"

        # 扩容逻辑:CPU或内存超过阈值,且未达到最大容器数
        if [ $cpu_usage -ge $CPU_THRESHOLD ] || [ $mem_usage -ge $MEM_THRESHOLD ]; then
            if [ $running_count -lt $MAX_CONTAINERS ]; then
                new_container_name="${TARGET_CONTAINER}-scale-$(date +%s)"
                # 启动新容器(复制目标容器配置,确保与主容器一致)
                docker run -d --name "$new_container_name" --rm $(docker inspect --format '{{.HostConfig}}' "$TARGET_CONTAINER" | sed 's/HostConfig//g' | sed 's/://g') $(docker inspect --format '{{.Config.Image}}' "$TARGET_CONTAINER")
                echo "[$current_time] 🚀 触发扩容:CPU/内存超过阈值,当前容器数=$running_count,启动新容器 $new_container_name,扩容后容器数=$((running_count+1))" >> $LOG_FILE
                echo "[$current_time] 🚀 触发扩容:启动新容器 $new_container_name,扩容后容器数=$((running_count+1))"
            else
                echo "[$current_time] ⚠️  达到最大容器数($MAX_CONTAINERS),无法继续扩容" >> $LOG_FILE
            fi
        fi

        # 缩容逻辑:CPU和内存均低于阈值,且超过最小容器数
        if [ $cpu_usage -lt $CPU_THRESHOLD ] && [ $mem_usage -lt $MEM_THRESHOLD ]; then
            if [ $running_count -gt $MIN_CONTAINERS ]; then
                # 找到最早启动的副本容器(排除主容器,避免误关核心业务)
                scale_container=$(docker ps --format "{{.Names}} {{.CreatedAt}}" | grep "$TARGET_CONTAINER-scale-" | sort -k2 | head -1 | cut -d' ' -f1)
                if [ -n "$scale_container" ]; then
                    # 停止并删除副本容器(--rm参数已配置,停止后自动删除)
                    docker stop "$scale_container" >/dev/null 2>&1
                    echo "[$current_time] 📉 触发缩容:CPU/内存低于阈值,当前容器数=$running_count,停止容器 $scale_container,缩容后容器数=$((running_count-1))" >> $LOG_FILE
                    echo "[$current_time] 📉 触发缩容:停止容器 $scale_container,缩容后容器数=$((running_count-1))"
                else
                    echo "[$current_time] ⚠️  无可用副本容器,无法缩容" >> $LOG_FILE
                fi
            else
                echo "[$current_time] ⚠️  达到最小容器数($MIN_CONTAINERS),无法继续缩容" >> $LOG_FILE
            fi
        fi

        # 间隔指定时间后再次检测(默认30秒,可自定义)
        sleep $CHECK_INTERVAL
    done
}

# ===================== 主入口(启动脚本,无需修改) =====================
auto_scaling
四、脚本部署命令


# 1. 下载脚本(创建脚本文件)
vi /usr/local/bin/docker-auto-scaling.sh

# 2. 粘贴上面的完整脚本,保存退出(Esc → :wq)

# 3. 赋予脚本执行权限
chmod +x /usr/local/bin/docker-auto-scaling.sh

# 4. 后台启动脚本(实现7×24小时运行,关闭终端不影响)
nohup /usr/local/bin/docker-auto-scaling.sh >/dev/null 2>&1 &

# 5. 查看脚本运行状态(确认启动成功)
ps -ef | grep docker-auto-scaling.sh

# 6. 查看扩缩容日志(排查问题、查看操作记录)
tail -f /var/log/docker-auto-scaling.log
五、核心功能说明

1.  自动扩容(应对高峰负载)


当容器CPU使用率超过80%(可自定义),或内存使用率超过90%(可自定义),脚本自动启动新容器,分担负载,避免服务卡顿、崩溃,无需人工干预。
2.  自动缩容(节省服务器资源)


当负载下降,CPU和内存使用率均低于阈值时,脚本自动停止多余的副本容器,仅保留最小运行数量,避免容器空转浪费CPU、内存资源。
3.  安全保护(防止误操作)


智能识别主容器和副本容器,仅对副本容器进行扩缩容操作,不会误关核心业务容器,生产环境可放心使用。
4.  灵活配置(适配不同需求)


可自定义CPU/内存阈值、最小/最大容器数、检测间隔,根据自己的服务器资源和业务需求调整,适配各类场景。
5.  日志追溯(便于排查)


所有扩缩容操作、检测结果均记录到日志文件,可随时查看操作记录,遇到问题快速定位原因,运维更省心。
6.  无缝适配(兼容Docker面板)


可与之前部署的Docker面板(基础版/增强版)同时运行,面板负责可视化管理,脚本负责自动扩缩容,两者协同,运维效率翻倍。
六、自定义配置


# 1. 修改核心配置(最关键,必须修改)
vi /usr/local/bin/docker-auto-scaling.sh
# 找到以下配置项,根据自己的需求修改:
TARGET_CONTAINER="your-container-name"  # 替换成你的目标容器名称(必填)
CPU_THRESHOLD=80                        # 可改为70、85等,根据服务器性能调整
MEM_THRESHOLD=90                        # 可改为85、95等,避免内存溢出
MIN_CONTAINERS=1                        # 至少保留1个容器,确保服务不中断
MAX_CONTAINERS=5                        # 最多扩容到5个,可根据服务器资源修改
CHECK_INTERVAL=30                       # 检测间隔,建议30-60秒,避免频繁检测占用资源

# 2. 修改后重启脚本(使配置生效)
pkill -f docker-auto-scaling.sh
nohup /usr/local/bin/docker-auto-scaling.sh >/dev/null 2>&1 &

# 3. 验证配置是否生效(查看日志)
tail -f /var/log/docker-auto-scaling.log
七、常见问题排查

    1. 脚本启动失败,提示“目标容器不存在”:检查 TARGET_CONTAINER 配置项,确保容器名称与docker ps显示的一致,不要输错;2. 无法触发扩容/缩容:检查CPU/内存阈值是否合理,或服务器是否有空闲资源(扩容需要空闲CPU/内存);3. 日志无法查看:确认日志路径 LOG_FILE 配置正确,或执行 touch /var/log/docker-auto-scaling.log 创建日志文件;4. 脚本后台运行后,关闭终端就停止:必须用 nohup 命令启动(文中部署命令已包含),确保后台持续运行;5. 与Docker面板冲突:不会冲突,两者可同时运行,面板负责管理,脚本负责自动调节。
文章结尾


从Docker面板基础版,到增强版,再到今天的自动扩缩容脚本,我们一步步实现了Docker运维的“可视化→高效化→自动化”:
    • 基础版:解决“命令记不住”的痛点,实现可视化管理;• 增强版:解决“批量操作、安全管控”的痛点,提升运维效率;• 自动扩缩容脚本:解决“人工值守、负载波动”的痛点,实现无人值守。
    整套「AI+Linux 自动化运维」系列已覆盖:
    巡检→告警→自愈→高可用→批量→应急→日志→安全→可视化面板→面板增强→自动扩缩容

关注「AI+Linux 实战营」,每期一个实用脚本,让运维越来越简单,告别加班、告别手动操作!
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
您需要登录后才可以回帖 登录 | 注册 微信登录

本版积分规则

Archiver|手机版|AGB|Impressum|Datenschutzerklärung|萍聚社区-德国热线-德国实用信息网

GMT+1, 2026-3-22 02:30 , Processed in 0.071846 second(s), 27 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表