如何获取Docker容器网络使用量的精确数值
解决方案
一、原生Docker命令方案(无额外软件,跨Linux/Windows)
Docker Stats支持通过自定义Go模板输出原始字节数,无需处理格式化后的字符串,精度完全满足千字节级要求,且跨平台通用。
操作步骤:
记录初始流量值
执行命令获取容器当前的接收(Rx)和发送(Tx)原始字节数,保存到文件:docker stats --no-stream --format "{{.RxBytes}} {{.TxBytes}}" <容器ID/名称> > initial_stats.txt参数说明:
--no-stream仅输出一次结果;{{.RxBytes}}/{{.TxBytes}}为模板字段,直接返回无单位的原始字节数。等待指定时长
Linux环境执行sleep 20,Windows环境执行timeout /t 20,等待20秒。记录结束流量值
再次执行相同命令获取结束时刻的流量数据:docker stats --no-stream --format "{{.RxBytes}} {{.TxBytes}}" <容器ID/名称> > final_stats.txt计算流量差值
- Linux下用Shell脚本计算:
read rx_initial tx_initial < initial_stats.txt read rx_final tx_final < final_stats.txt total_rx=$((rx_final - rx_initial)) total_tx=$((tx_final - tx_initial)) total_bytes=$((total_rx + total_tx)) total_KB=$((total_bytes / 1024)) echo "总接收流量:$total_rx 字节 ($((total_rx/1024)) KB)" echo "总发送流量:$total_tx 字节 ($((total_tx/1024)) KB)" echo "总流量:$total_bytes 字节 ($total_KB KB)" - Windows下用批处理计算:
set /p initial=<initial_stats.txt for /f "tokens=1,2" %%a in ("%initial%") do set rx_initial=%%a&set tx_initial=%%b timeout /t 20 >nul set /p final=<final_stats.txt for /f "tokens=1,2" %%a in ("%final%") do set rx_final=%%a&set tx_final=%%b set /a total_rx=rx_final - rx_initial set /a total_tx=tx_final - tx_initial set /a total_bytes=total_rx + total_tx set /a total_KB=total_bytes / 1024 echo 总接收流量:%total_rx% 字节 (%total_rx%/1024 KB) echo 总发送流量:%total_tx% 字节 (%total_tx%/1024 KB) echo 总流量:%total_bytes% 字节 (%total_KB% KB)
- Linux下用Shell脚本计算:
二、关于重置累计统计值的说明
Docker没有官方命令可直接重置容器的网络累计统计数据,因为这些统计由容器运行时(containerd/runc)维护,属于内核级累计值。若强行重置,只能通过重启容器实现,但会中断业务,不建议采用。
三、备选方案(需额外软件)
如果原生方案无法满足特殊需求,可考虑:
- Linux环境:使用
iptables针对容器的虚拟网卡或IP添加流量统计规则,通过查看规则的字节计数计算差值。 - 跨平台:使用
tshark抓包,指定容器的网络接口或IP,统计指定时间段内的数据包总字节数,但需预先安装Wireshark工具包。
内容的提问来源于stack exchange,提问作者Timothy
相关产品推荐
相关产品推荐

