基于docker-java 3.3.6查询容器资源状态及网络信息的咨询
使用docker-java 3.3.6实现容器资源与网络监控方案
1. 查询容器磁盘占用及最大可占用额度
docker-java 3.3.6没有直接封装磁盘配额的查询方法,但可以通过容器统计信息和容器详情接口组合实现:
获取磁盘占用量
通过statsCmd获取容器实时统计数据,提取磁盘写入/读取的字节数:
StatsResponse stats = dockerClient.statsCmd("容器ID").exec(new ResultCallback<StatsResponse>() { private StatsResponse result; @Override public void onStart(Closeable closeable) {} @Override public void onNext(StatsResponse statsResp) { this.result = statsResp; try { close(); } catch (IOException e) { e.printStackTrace(); } } @Override public void onError(Throwable throwable) {} @Override public void onComplete() {} @Override public void close() throws IOException {} }).awaitCompletion(); // 计算总磁盘写入量(单位:字节) long diskUsage = stats.getBlkioStats().getIoServiceBytesRecursive().stream() .filter(entry -> "Write".equals(entry.getOp())) .mapToLong(BlkioStatsEntry::getValue) .sum();
获取最大磁盘配额
如果容器配置了磁盘配额,可通过inspectContainerCmd读取容器配置的存储参数:
InspectContainerResponse containerInfo = dockerClient.inspectContainerCmd("容器ID").exec(); Map<String, String> storageOpts = containerInfo.getHostConfig().getStorageOpt(); // 配额值为字节,未配置则返回null Long maxDiskQuota = storageOpts != null ? Long.parseLong(storageOpts.get("size")) : null;
2. 获取容器网络带宽速率
通过两次采样容器网络统计数据,计算单位时间内的收发字节差,转换为Mbps:
// 第一次采样 StatsResponse firstSample = dockerClient.statsCmd("容器ID").exec(new ResultCallback<StatsResponse>() { private StatsResponse result; @Override public void onStart(Closeable closeable) {} @Override public void onNext(StatsResponse statsResp) { this.result = statsResp; try { close(); } catch (IOException e) { e.printStackTrace(); } } @Override public void onError(Throwable throwable) {} @Override public void onComplete() {} @Override public void close() throws IOException {} }).awaitCompletion(); long firstRx = firstSample.getNetwork().getRxBytes(); long firstTx = firstSample.getNetwork().getTxBytes(); long start = System.currentTimeMillis(); // 间隔1秒后第二次采样 Thread.sleep(1000); StatsResponse secondSample = dockerClient.statsCmd("容器ID").exec(new ResultCallback<StatsResponse>() { private StatsResponse result; @Override public void onStart(Closeable closeable) {} @Override public void onNext(StatsResponse statsResp) { this.result = statsResp; try { close(); } catch (IOException e) { e.printStackTrace(); } } @Override public void onError(Throwable throwable) {} @Override public void onComplete() {} @Override public void close() throws IOException {} }).awaitCompletion(); long secondRx = secondSample.getNetwork().getRxBytes(); long secondTx = secondSample.getNetwork().getTxBytes(); long end = System.currentTimeMillis(); // 转换为Mbps(1Mbps = 1,000,000比特/秒) double rxMbps = ((secondRx - firstRx) * 8.0) / ((end - start) / 1000.0) / 1000000.0; double txMbps = ((secondTx - firstTx) * 8.0) / ((end - start) / 1000.0) / 1000000.0;
3. 应用与Docker的网络连接质量检测
docker-java未封装网络探测功能,可通过在容器内执行系统命令(如ping、iperf3)实现:
延迟检测(ping)
// 在容器内执行ping命令,测试到应用IP的延迟 ExecCreateResponse execCreate = dockerClient.execCreateCmd("容器ID") .withCmd("ping", "-c", "4", "应用IP") .withAttachStdout(true) .withAttachStderr(true) .exec(); // 获取命令输出,自行解析平均延迟 dockerClient.execStartCmd(execCreate.getId()) .exec(new ExecStartResultCallback(System.out, System.err)) .awaitCompletion();
带宽检测(iperf3)
需确保容器内已安装iperf3,假设应用作为iperf3服务器:
ExecCreateResponse execCreate = dockerClient.execCreateCmd("容器ID") .withCmd("iperf3", "-c", "应用IP", "-t", "5") .withAttachStdout(true) .exec(); // 输出结果包含Mbps单位的带宽数据 dockerClient.execStartCmd(execCreate.getId()) .exec(new ExecStartResultCallback(System.out, System.err)) .awaitCompletion();
内容的提问来源于stack exchange,提问作者LionLive
相关产品推荐
相关产品推荐

