Python获取Docker容器实时资源占用(CPU、内存、IO等)5种实现方式

2025-12-13 0 497
目录
  • 一、使用docker stats –no-stream最简版(适合快速查看)
  • 二、使用–format自定义输出 + 结构化解析(推荐)
  • 三、使用 subprocess 列表方式(更安全,避免 shell 注入)
  • 四、自动生成–format模板的小工具(偷懒神器)
  • 五、持续监控 + 计算平均内存使用率(适合压测报告)
  • 总结对比

在运维监控、容器管理平台、云桌面系统等场景中,我们经常需要实时获取 Docker 容器的 CPU、内存、网络、磁盘 IO 等资源使用情况。本文总结了 5 种常用的 Python 实现方式,从最基础到生产可用的方案逐步讲解,帮助你根据实际需求选择最合适的写法。

一、使用docker stats –no-stream最简版(适合快速查看)

# -*- encoding: utf-8 -*-

fromsubprocessimportPopen, PIPE, STDOUT

defRun_Cmd(cmd):

p=Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, stderr=STDOUT)

stdout, _=p.communicate()

returnp.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

优点:简单直接
缺点:输出是人类可读的表格,不利于程序解析

二、使用–format自定义输出 + 结构化解析(推荐)

# -*- encoding: utf-8 -*-

fromsubprocessimportPopen, PIPE, STDOUT

defRun_Cmd(cmd):

p=Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, stderr=STDOUT)

stdout, _=p.communicate()

returnstdout.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=[]

forlineinresult.split(\”##\”):

ifnotline:

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\’, …}]

优点:结构化数据、易于转为 JSON、前后端交互友好

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

fromsubprocessimportPopen, PIPE

importjson

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\”: []}

forlineinp.stdout.readlines():

line=line.decode(\”utf-8\”).strip()

ifnotline:

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)

exceptFileNotFoundError:

response={\”code\”:500,\”msg\”:\”docker 未安装\”}

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

推荐用于 Web 接口返回 JSON 数据

四、自动生成–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=[]

fori, kinenumerate(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}}#…\”

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

五、持续监控 + 计算平均内存使用率(适合压测报告)

# -*- encoding: utf-8 -*-

fromsubprocessimportPopen, PIPE, STDOUT

importtime

defget_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\”)

iflen(lines) <2:

return0.0

# 第2行是数据,MemPerc 在第5列(索引4)

mem_perc=lines[1].split()[4]# 例如: 1.81%

returnfloat(mem_perc.rstrip(\”%\”))

if__name__==\”__main__\”:

container=\”centos7-novnc2\”

total=0.0

count=120

print(\”开始监控容器内存使用率(每3秒采样一次,共120次)\\n\”)

foriinrange(1, count+1):

mem=get_mem_usage(container)

total+=mem

avg=total/i

print(f\”第{i:3d}次 | 当前: {mem:5.2f}% | 累计平均: {avg:.2f}%\”)

time.sleep(3)

print(f\”\\n120次采样平均内存使用率:{total/count:.2f}%\”)

适用于:

  • 压测前后资源占用对比
  • 自动化报告生成
  • 容器资源预警

总结对比

方式 是否结构化 是否安全 是否适合生产 推荐场景
直接 shell=True 输出表格 一般 调试用 快速查看
–format + split(\”#\”) 推荐 强烈推荐 前后端、监控系统
subprocess 列表传参 生产首选 Web API 接口
自动生成模板脚本 开发辅助 快速扩展字段
循环采样统计平均值 推荐 压测/报告 性能测试分析

到此这篇关于Python获取Docker容器实时资源占用(CPU、内存、IO等)5种实现方式的文章就介绍到这了,更多相关Python获取Docker容器资源占用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

来源:https://www.jb51.net/python/354527619.htm

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

申明:本文由第三方发布,内容仅代表作者观点,与本网站无关。对本文以及其中全部或者部分内容的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。本网发布或转载文章出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,也不代表本网对其真实性负责。

左子网 编程相关 Python获取Docker容器实时资源占用(CPU、内存、IO等)5种实现方式 https://www.zuozi.net/36757.html

常见问题
  • 1、自动:拍下后,点击(下载)链接即可下载;2、手动:拍下后,联系卖家发放即可或者联系官方找开发者发货。
查看详情
  • 1、源码默认交易周期:手动发货商品为1-3天,并且用户付款金额将会进入平台担保直到交易完成或者3-7天即可发放,如遇纠纷无限期延长收款金额直至纠纷解决或者退款!;
查看详情
  • 1、描述:源码描述(含标题)与实际源码不一致的(例:货不对板); 2、演示:有演示站时,与实际源码小于95%一致的(但描述中有”不保证完全一样、有变化的可能性”类似显著声明的除外); 3、发货:不发货可无理由退款; 4、安装:免费提供安装服务的源码但卖家不履行的; 5、收费:价格虚标,额外收取其他费用的(但描述中有显著声明或双方交易前有商定的除外); 6、其他:如质量方面的硬性常规问题BUG等。 注:经核实符合上述任一,均支持退款,但卖家予以积极解决问题则除外。
查看详情
  • 1、左子会对双方交易的过程及交易商品的快照进行永久存档,以确保交易的真实、有效、安全! 2、左子无法对如“永久包更新”、“永久技术支持”等类似交易之后的商家承诺做担保,请买家自行鉴别; 3、在源码同时有网站演示与图片演示,且站演与图演不一致时,默认按图演作为纠纷评判依据(特别声明或有商定除外); 4、在没有”无任何正当退款依据”的前提下,商品写有”一旦售出,概不支持退款”等类似的声明,视为无效声明; 5、在未拍下前,双方在QQ上所商定的交易内容,亦可成为纠纷评判依据(商定与描述冲突时,商定为准); 6、因聊天记录可作为纠纷评判依据,故双方联系时,只与对方在左子上所留的QQ、手机号沟通,以防对方不承认自我承诺。 7、虽然交易产生纠纷的几率很小,但一定要保留如聊天记录、手机短信等这样的重要信息,以防产生纠纷时便于左子介入快速处理。
查看详情

相关文章

猜你喜欢
发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务