最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python獲取Docker容器實時資源占用(CPU、內(nèi)存、IO等)5種實現(xiàn)方式

 更新時間:2025年12月09日 09:11:37   作者:weixin_46244623  
在運維監(jiān)控、容器管理平臺、云桌面系統(tǒng)等場景中,我們經(jīng)常需要實時獲取?Docker?容器的資源使用情況,本文總結(jié)了5種常用的實現(xiàn)方式,有需要的可以了解下

在運維監(jiān)控、容器管理平臺、云桌面系統(tǒng)等場景中,我們經(jīng)常需要實時獲取 Docker 容器的 CPU、內(nèi)存、網(wǎng)絡(luò)、磁盤 IO 等資源使用情況。本文總結(jié)了 5 種常用的 Python 實現(xiàn)方式,從最基礎(chǔ)到生產(chǎn)可用的方案逐步講解,幫助你根據(jù)實際需求選擇最合適的寫法。

一、使用docker stats --no-stream最簡版(適合快速查看)

# -*- encoding: utf-8 -*-
from subprocess import Popen, PIPE, STDOUT

def Run_Cmd(cmd):
    p = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, stderr=STDOUT)
    stdout, _ = p.communicate()
    return p.returncode, stdout.strip().decode()

if __name__ == "__main__":
    cmd = 'docker stats --no-stream'        # 獲取所有容器
    # cmd = 'docker stats 92d1f89c5bb4 --no-stream'  # 指定容器
    code, out = Run_Cmd(cmd)
    print(out)

輸出示例:

CONTAINER ID   NAME             CPU %     MEM USAGE / LIMIT     MEM %     NET I/O         BLOCK I/O       PIDS
7d0d088b44e6   centos7-novnc2   0.02%     144.2MiB / 7.774GiB   1.81%     2.44kB / 0B     249MB / 403MB   99

優(yōu)點:簡單直接

缺點:輸出是人類可讀的表格,不利于程序解析

二、使用--format自定義輸出 + 結(jié)構(gòu)化解析(推薦)

# -*- encoding: utf-8 -*-
from subprocess import Popen, PIPE, STDOUT

def Run_Cmd(cmd):
    p = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, stderr=STDOUT)
    stdout, _ = p.communicate()
    return stdout.strip()

if __name__ == "__main__":
    cmd = ('docker stats --no-stream --format '
           '"{{.BlockIO}}#{{.CPUPerc}}#{{.Container}}#{{.ID}}#'
           '{{.MemPerc}}#{{.MemUsage}}#{{.Name}}#{{.NetIO}}#{{.PIDs}}##"')

    result = Run_Cmd(cmd).decode("utf-8")
    container_list = []

    for line in result.split("##"):
        if not line:
            continue
        fields = line.split("#")
        info = {
            'BlockIO':   fields[0],
            'CPUPerc':   fields[1],
            'Container': fields[2],
            'ID':        fields[3],
            'MemPerc':   fields[4],
            'MemUsage':  fields[5],
            'Name':      fields[6],
            'NetIO':     fields[7],
            'PIDs':      fields[8]
        }
        container_list.append(info)

    print(container_list)

輸出:

[{'BlockIO': '249MB / 403MB', 'CPUPerc': '0.02%', 'Container': 'centos7-novnc2', ...}]

優(yōu)點:結(jié)構(gòu)化數(shù)據(jù)、易于轉(zhuǎn)為 JSON、前后端交互友好

三、使用 subprocess 列表方式(更安全,避免 shell 注入)

from subprocess import Popen, PIPE
import json

try:
    shell = [
        'docker', 'stats', 'centos7-novnc2', '--no-stream', '--format',
        '{{.BlockIO}}#{{.CPUPerc}}#{{.Container}}#{{.ID}}#'
        '{{.MemPerc}}#{{.MemUsage}}#{{.Name}}#{{.NetIO}}#{{.PIDs}}'
    ]
    
    p = Popen(shell, stdout=PIPE, stderr=PIPE)
    response = {"code": 200, "msg": "success", "data": []}
    
    for line in p.stdout.readlines():
        line = line.decode("utf-8").strip()
        if not line:
            continue
        ls = line.split("#")
        info = {
            'BlockIO':   ls[0], 'CPUPerc': ls[1], 'Container': ls[2],
            'ID':        ls[3], 'MemPerc': ls[4],  'MemUsage': ls[5],
            'Name':      ls[6], 'NetIO':   ls[7],  'PIDs':    ls[8].strip()
        }
        response["data"].append(info)

except FileNotFoundError:
    response = {"code": 500, "msg": "docker 未安裝"}

print(json.dumps(response, ensure_ascii=False, indent=2))

推薦用于 Web 接口返回 JSON 數(shù)據(jù)

四、自動生成--format模板的小工具(偷懶神器)

p = {"BlockIO":"249MB / 403MB","CPUPerc":"0.02%","Container":"centos7-novnc2",
     "ID":"7d0d088b44e6","MemPerc":"1.81%","MemUsage":"144.2MiB / 7.774GiB",
     "Name":"centos7-novnc2","NetIO":"2.44kB / 0B","PIDs":"99"}

pd = []
for i, k in enumerate(p.keys()):
    pd.append(f"{{{{.{k}}}}}#")
    print(f"p.update({{'{k}': ls[{i}]}})")
print("\n生成的 format 字符串:")
print("".join(pd))

運行后自動輸出:

docker stats --no-stream --format "{{.BlockIO}}#{{.CPUPerc}}#{{.Container}}#..."

以后想加新字段,直接改字典再運行即可

五、持續(xù)監(jiān)控 + 計算平均內(nèi)存使用率(適合壓測報告)

# -*- encoding: utf-8 -*-
from subprocess import Popen, PIPE, STDOUT
import time

def get_mem_usage(container_name):
    cmd = f'docker stats {container_name} --no-stream'
    p = Popen(cmd, shell=True, stdout=PIPE, stderr=STDOUT)
    output = p.stdout.read().decode("utf-8")
    lines = output.strip().split("\n")
    if len(lines) < 2:
        return 0.0
    # 第2行是數(shù)據(jù),MemPerc 在第5列(索引4)
    mem_perc = lines[1].split()[4]  # 例如: 1.81%
    return float(mem_perc.rstrip("%"))

if __name__ == "__main__":
    container = "centos7-novnc2"
    total = 0.0
    count = 120

    print("開始監(jiān)控容器內(nèi)存使用率(每3秒采樣一次,共120次)\n")
    for i in range(1, count + 1):
        mem = get_mem_usage(container)
        total += mem
        avg = total / i
        print(f"第{i:3d}次 | 當(dāng)前: {mem:5.2f}% | 累計平均: {avg:.2f}%")
        time.sleep(3)

    print(f"\n120次采樣平均內(nèi)存使用率:{total/count:.2f}%")

適用于:

  • 壓測前后資源占用對比
  • 自動化報告生成
  • 容器資源預(yù)警

總結(jié)對比

方式是否結(jié)構(gòu)化是否安全是否適合生產(chǎn)推薦場景
直接 shell=True 輸出表格一般調(diào)試用快速查看
--format + split("#")推薦強烈推薦前后端、監(jiān)控系統(tǒng)
subprocess 列表傳參生產(chǎn)首選Web API 接口
自動生成模板腳本--開發(fā)輔助快速擴展字段
循環(huán)采樣統(tǒng)計平均值推薦壓測/報告性能測試分析

到此這篇關(guān)于Python獲取Docker容器實時資源占用(CPU、內(nèi)存、IO等)5種實現(xiàn)方式的文章就介紹到這了,更多相關(guān)Python獲取Docker容器資源占用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python?中的np.zeros()和np.ones()函數(shù)詳解

    python?中的np.zeros()和np.ones()函數(shù)詳解

    這篇文章主要介紹了python?中的np.zeros()和np.ones()函數(shù),本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-04-04
  • python selenium執(zhí)行所有測試用例并生成報告的方法

    python selenium執(zhí)行所有測試用例并生成報告的方法

    今天小編就為大家分享一篇python selenium執(zhí)行所有測試用例并生成報告的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-02-02
  • Python的元組和字典知識點超詳細講解

    Python的元組和字典知識點超詳細講解

    這篇文章主要介紹了Python中元組和字典兩種數(shù)據(jù)結(jié)構(gòu)的基本用法,包括初始化、索引、拼接、剔除、重復(fù)、最大值和最小值、鍵值查詢、獲取對應(yīng)值、剔除、更新、添加和計算數(shù)量等操作,需要的朋友可以參考下
    2025-01-01
  • 如何使用python進行pdf文件分割

    如何使用python進行pdf文件分割

    這篇文章主要介紹了如何使用python進行pdf文件分割,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-11-11
  • Python常見內(nèi)置高效率函數(shù)用法示例

    Python常見內(nèi)置高效率函數(shù)用法示例

    這篇文章主要介紹了Python常見內(nèi)置高效率函數(shù)用法,結(jié)合實例形式分析了Python中filter()、map()、reduce()、lambda匿名函數(shù)等功能與簡單使用技巧,需要的朋友可以參考下
    2018-07-07
  • Python爬蟲爬取ts碎片視頻+驗證碼登錄功能

    Python爬蟲爬取ts碎片視頻+驗證碼登錄功能

    這篇文章主要介紹了Python爬蟲爬取ts碎片視頻+驗證碼登錄功能,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • Python中re模塊的元字符使用小結(jié)

    Python中re模塊的元字符使用小結(jié)

    元字符是正則表達式中具有特殊意義的專用字符,本文主要介紹了Python中re模塊的元字符使用小結(jié),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • Python中的循環(huán)控制語句使用詳解

    Python中的循環(huán)控制語句使用詳解

    這篇文章主要介紹了Python中的循環(huán)控制語句使用,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • 在Linux下使用Python的matplotlib繪制數(shù)據(jù)圖的教程

    在Linux下使用Python的matplotlib繪制數(shù)據(jù)圖的教程

    這篇文章主要介紹了在Linux下使用Python的matplotlib繪制數(shù)據(jù)圖的教程,matplotlib基于Numpy進行科學(xué)計算上的延伸,需要的朋友可以參考下
    2015-06-06
  • django rest framework 自定義返回方式

    django rest framework 自定義返回方式

    這篇文章主要介紹了django rest framework 自定義返回方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07

最新評論

扶绥县| 泰安市| 新沂市| 荥阳市| 佛冈县| 达尔| 五大连池市| 凌源市| 马鞍山市| 凤城市| 东兴市| 丰原市| 两当县| 华宁县| 平原县| 阳原县| 虹口区| 永安市| 郯城县| 吴旗县| 大余县| 阳西县| 武功县| 安庆市| 梁平县| 阳山县| 江门市| 蕉岭县| 徐水县| 新巴尔虎左旗| 漳平市| 北票市| 湟源县| 武川县| 井陉县| 咸宁市| 米林县| 汨罗市| 通化市| 宜宾县| 澜沧|