当前位置: 首页 > news >正文

使用Docker-Java监听Docker容器的信息

使用Docker-Java监听Docker容器的信息

Docker作为一种轻量级的容器化平台,极大地方便了应用的部署与管理。然而,在实际使用过程中,我们常常需要对运行中的容器进行监控,以确保其健康状态,并能及时响应各种异常情况。本文将介绍如何使用Docker-Java这个库来监听Docker容器的信息。

什么是Docker-Java?

Docker-Java是一个开源的Java库,旨在通过Java程序与Docker守护进程进行通信。它提供了丰富的API,可以用于管理Docker容器、镜像、网络等各种资源。

安装Docker-Java

在开始之前,确保你已经安装了Docker,并且可以正常运行Docker命令,还需要开放23752376。然后,你需要在你的Java项目中添加Docker-Java的依赖。对于Maven项目,可以在pom.xml中添加以下依赖:

<!-- https://mvnrepository.com/artifact/com.github.docker-java/docker-java-api -->
<dependency><groupId>com.github.docker-java</groupId><artifactId>docker-java-api</artifactId><version>3.3.4</version>
</dependency>

初始化Docker客户端

首先,我们需要创建一个Docker客户端实例,用于与Docker守护进程进行通信。以下是初始化Docker客户端的示例代码:

publi static DockerClient buildDockerClient(String dockerHost) {DefaultDockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder()// 这里填最上面填的ip端口号,ip换成服务器ip.withDockerHost("tcp://" + dockerHost + ":" + PORT)// 这里也可以用另一种配置的// .withDockerHost("unix://var/run/docker.sock").build();/*** 创建一个ApacheDockerHttpClient实例,用于与Docker服务器进行通信。* 这里使用了Apache HTTP客户端作为HTTP通信的实现,通过配置各种参数来优化通信效果。** @param config 提供Docker主机信息、SSL配置等必要信息的配置对象。* @return DockerHttpClient 一个配置好的HTTP客户端,用于与Docker服务进行通信。*/DockerHttpClient httpClient = new ApacheDockerHttpClient.Builder().dockerHost(config.getDockerHost()).sslConfig(config.getSSLConfig()).maxConnections(100).connectionTimeout(Duration.ofSeconds(30)).responseTimeout(Duration.ofSeconds(45)).build();return DockerClientImpl.getInstance(config, httpClient);}

监听Docker事件

Docker支持通过事件流(Event Stream)来监听容器的各种状态变化,例如启动、停止、删除等。我们可以使用Docker-Java提供的API来监听这些事件。

以下是监听Docker容器事件的示例代码:

  /*** @param containerId 容器ID* @Description: 获取容器的基本信息*/public static Map<String, String> getContainerInfo(DockerClient dockerClient, String containerId) {HashMap<String, String> map = new HashMap<>();// 获取容器信息InspectContainerResponse containerInfo = dockerClient.inspectContainerCmd(containerId).exec();// 获取容器的名称map.put("containerName", containerInfo.getName());// 获取容器的镜像名称String image = containerInfo.getConfig().getImage();map.put("dockerImage", image);// 获取容器的端口信息Ports ports = containerInfo.getNetworkSettings().getPorts();map.put("ports", StrUtil.join(",", ports.getBindings().keySet()));// 获取容器的运行状态String containerState = containerInfo.getState().getStatus();map.put("dockerState", containerState);// 获取容器的创建时间戳(以毫秒为单位)String createdTimeMillis = containerInfo.getCreated();map.put("created", formattedTimeZone(createdTimeMillis));// 获取容器的运行状态Boolean running = containerInfo.getState().getRunning();map.put("state", Boolean.TRUE.equals(running) ? "1" : "2");return map;}/*** 获取容器内存占用** @param containerId 容器ID* @return 占用内存(MB)*/public static double getMemoryStats(DockerClient dockerClient, String containerId) {Statistics containerStats = dockerClient.statsCmd(containerId).exec(new InvocationBuilder.AsyncResultCallback<>()).awaitResult();long memoryUsageInBytes = 0;if (containerStats != null && containerStats.getMemoryStats() != null) {memoryUsageInBytes = containerStats.getMemoryStats().getUsage();}// 将字节数转换为 MBreturn NumberUtil.div(memoryUsageInBytes, 1024.0 * 1024.0, 1);}/*** @param isoTimeMillis ISO8601格式的时间* @return {@code String } 时间* @Description: 格式化时间*/private static String formattedTimeZone(String isoTimeMillis) {// 解析ISO 8601格式的字符串为Instant对象Instant instant = Instant.parse(isoTimeMillis);// 将Instant对象转换为ZonedDateTime对象(UTC时区)ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(instant, ZoneId.of("UTC"));// 转换为本地时区(如果需要)ZonedDateTime localZonedDateTime = zonedDateTime.withZoneSameInstant(ZoneId.systemDefault());// 定义时间格式DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");// 格式化时间return localZonedDateTime.format(formatter);}

处理具体事件

根据项目需求,我们可以进一步对不同类型的事件进行分类处理。例如,如果我们只关心容器的启动和停止事件,可以这样处理:

 /*** @return {@code List<Container> }* @Description: 获取所有容器列表*/public static List<Container> getAllContainers(DockerClient dockerClient) {return dockerClient.listContainersCmd().exec();}/*** @param containerId 容器ID* @Description: 启动容器*/public static void startContainer(DockerClient dockerClient, String containerId) {dockerClient.startContainerCmd(containerId).exec();}/*** @param containerId 容器ID* @Description: 停止容器*/public static void stopContainer(DockerClient dockerClient, String containerId) {dockerClient.stopContainerCmd(containerId).exec();}/*** @param containerId 容器ID* @Description: 重启容器*/public static void restartContainer(DockerClient dockerClient, String containerId) {dockerClient.restartContainerCmd(containerId).exec();}

结论

通过Docker-Java库,我们可以轻松地在Java应用中与Docker进行交互,并实时监听Docker容器的状态变化。这对于需要动态监控和管理容器的项目来说,非常实用。希望本文的介绍能帮助你更好地利用Docker-Java来实现容器的监控与管理。

相关文章:

使用Docker-Java监听Docker容器的信息

使用Docker-Java监听Docker容器的信息 Docker作为一种轻量级的容器化平台&#xff0c;极大地方便了应用的部署与管理。然而&#xff0c;在实际使用过程中&#xff0c;我们常常需要对运行中的容器进行监控&#xff0c;以确保其健康状态&#xff0c;并能及时响应各种异常情况。本…...

Spring Boot + Mybatis Plus实现登录注册

Spring Boot 实现登录注册 1. 注册 业务逻辑 客户端输入注册时需要的用户参数&#xff0c;比如&#xff1a;账户名、密码、确认密码、其他服务端接收到客户端的请求参数进行校验&#xff0c;然后判断是否有误&#xff0c;有误的地方就将错误信息抛出将密码进行加密之后存储到…...

IDEA创建web项目

IDEA创建web项目 第一步&#xff1a;创建一个空项目 第二步&#xff1a;在刚刚创建的项目下创建一个子模块 第三步&#xff1a;在子模块中引入web 创建结果如下&#xff1a; 这里我们需要把这个目录移到main目录下&#xff0c;并改名为webapp&#xff0c;结果如下 将pom文件…...

二手物品交易系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;商家管理&#xff0c;用户管理&#xff0c;商品管理&#xff0c;用户咨询管理 商家账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;商品管理&#xff0c;用…...

探索大数据在信用评估中的独特价值

随着我国的信用体系越来越完善&#xff0c;信用将影响越来越多的人。现在新兴的大数据信用和传统信用&#xff0c;形成了互补的优势&#xff0c;大数据信用变得越来越重要&#xff0c;那大数据信用风险检测的重要性主要体现在什么地方呢?本文将详细为大家介绍一下&#xff0c;…...

MFC基础学习应用

MFC基础学习应用 1.基于对话框的使用 左上角为菜单键&#xff08;其下的关于MFC主要功能由IDD_ABOUTBOX决定) 附图 右下角为按钮&#xff08;基本功能由IDD_DIALOG决定,添加按钮使用由左上角的工具箱完成) 附图 2.自行添加功能与按钮//功能代码 void CMFCApplication4Dlg:…...

Gradle实现类似Maven的profiles功能

版本说明 GraalVM JDK 21.0.3Gradle 8.7Spring Boot 3.2.5 目录结构 指定环境打包 application.yml/yaml/properties 执行 bootJar 打包命令前要先执行 clean【其它和 processResources 相关的命令也要先执行 clean】&#xff0c;否则 active 值不会变&#xff01; spring…...

【强化学习】gymnasium自定义环境并封装学习笔记

【强化学习】gymnasium自定义环境并封装学习笔记 gym与gymnasium简介gymgymnasium gymnasium的基本使用方法使用gymnasium封装自定义环境官方示例及代码编写环境文件__init__()方法reset()方法step()方法render()方法close()方法 注册环境创建包 Package&#xff08;最后一步&a…...

TLE9879的基于Arduino调试板SWD刷写接口

官方的Arduino评估板&#xff0c;如下图所示&#xff1a; 如果你有官方的调试器&#xff0c;应该不用关注本文章&#xff0c;如下图连接就是&#xff1a; 如果&#xff0c;您和博主一样需要自己飞线的话&#xff0c;如下图所示&#xff1a;PCB的名称在右边整理&#xff0c;SWD的…...

基于 Delphi 的前后端分离:之五,使用 HTMX 让页面元素组件化之面向对象的Delphi代码封装

前情提要 本博客上一篇文章&#xff0c;描述了使用 Delphi 作为后端的 Web Server&#xff0c;前端使用 HTMX 框架&#xff0c;把一个开源的前端图表 JS 库&#xff0c;进行了组件化。 上一篇文章仅仅是描述了简单的前端代码组件化的可能性&#xff0c;依然是基于前端库的 JS…...

讲透计算机网络知识(实战篇)01——计算机网络和协议

一、计算机网络和协议 1、网络和互联网络 1.1 网络、互联网、Internet 用交换机、集线器连接在一起的计算机构成一个网络。 用路由器连接多个网络&#xff0c;形成互联网。 全球最大的互联网&#xff1a;Internet。 1.2 网络举例 家庭互联网 图中的无线拨号路由器既是路由…...

8个宝藏APP,个个都牛逼哈拉!

AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/ 目前win7已经逐渐淡出人们的视野&#xff0c;大部分人都开始使用win10&#xff0c;在日常工作和使用中&#xff0c;创客们下载神奇的软件能大幅提…...

使用docker构建java应用

1、docker简介 Docker是一个开源的容器化平台&#xff0c;可以帮助开发人员将应用程序及其依赖项打包成一个可移植的容器。容器化是一种轻量级的虚拟化技术&#xff0c;可以使应用程序在不同的操作系统和环境中具有一致的运行方式。 使用Docker带来的好处包括&#xff1a; 简…...

Oracle 存储过程

Oracle存储过程 创建存储过程 CREATE OR REPLACE PROCEDURE UPDATE_EMPLOYEE_SALARY(p_employee_id IN NUMBER,p_employee_salary IN NUMBER )AS BEGINUPDATE employeesSET salary p_employee_salaryWHERE employee_id p_employee_id;COMMIT;EXCEPTIONWHEN NO_DATA_FOUND T…...

下载站名文件

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 得到了请求地址与请求参数后&#xff0c;可以发现请求参数中的出发地与目的地均为车站名的英文缩写。而这个英文缩写的字母是通过输入中文车站名转换…...

345453

38744...

Java操作redis

目录 一&#xff1a;Jedis 二&#xff1a;使用Spring Data Redis Redis 的 Java 客户端很多&#xff0c;官方推荐的有三种&#xff1a; 1.Jedis 2.Lettuce 3.Redisson 同时&#xff0c;Spring 对 Redis 客户端进行了整合&#xff0c;提供了 Spring Data Redis&#xff0c;在S…...

【数据结构(邓俊辉)学习笔记】图03——拓扑排序

文章目录 0. 概述1. 零入度算法1. 1 拓扑排序1. 2 算法 2. 零出度算法2.1 算法2.2 实现2.3. 复杂度 0. 概述 学习下拓扑排序 1. 零入度算法 1. 1 拓扑排序 首先理解下拓扑排序 其实老师经常干这事&#xff0c;如编讲义&#xff0c;将已经知道的知识点串起来变成讲课序列。那…...

C#参数使用场景简要说明

C#参数使用场景简要说明 1、传值参数 方法、类成员的初始化 2、输出参数 方法返回值不能满足&#xff0c;需要多个返回值时&#xff1b; 3、引用参数 方法需要修改变量需带回原变量时&#xff1b; 4、具名参数 代码可读性高&#xff0c;参数可交换位置 5、方法扩展&#xff08…...

线性代数|机器学习-P10最小二乘法的四种方案

文章目录 1. 概述2. SVD奇异值分解3. 最小二乘法方程解4. 最小二乘法图像解释5. Gram-Schmidt 1. 概述 当我们需要根据一堆数据点去拟合出一条近似的直线的时候&#xff0c;就会用到 最小二乘法 .根据矩阵A的情况&#xff0c;有如下四种方法 在r n m 时&#xff0c;SVD奇异…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能

1. 开发环境准备 ​​安装DevEco Studio 3.1​​&#xff1a; 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK ​​项目配置​​&#xff1a; // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...

WebRTC从入门到实践 - 零基础教程

WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC&#xff1f; WebRTC&#xff08;Web Real-Time Communication&#xff09;是一个支持网页浏览器进行实时语音…...

实战三:开发网页端界面完成黑白视频转为彩色视频

​一、需求描述 设计一个简单的视频上色应用&#xff0c;用户可以通过网页界面上传黑白视频&#xff0c;系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观&#xff0c;不需要了解技术细节。 效果图 ​二、实现思路 总体思路&#xff1a; 用户通过Gradio界面上…...

DBLP数据库是什么?

DBLP&#xff08;Digital Bibliography & Library Project&#xff09;Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高&#xff0c;数据库文献更新速度很快&#xff0c;很好地反映了国际计算机科学学术研…...

软件工程 期末复习

瀑布模型&#xff1a;计划 螺旋模型&#xff1a;风险低 原型模型: 用户反馈 喷泉模型:代码复用 高内聚 低耦合&#xff1a;模块内部功能紧密 模块之间依赖程度小 高内聚&#xff1a;指的是一个模块内部的功能应该紧密相关。换句话说&#xff0c;一个模块应当只实现单一的功能…...