使用Docker-Java监听Docker容器的信息
使用Docker-Java监听Docker容器的信息
Docker作为一种轻量级的容器化平台,极大地方便了应用的部署与管理。然而,在实际使用过程中,我们常常需要对运行中的容器进行监控,以确保其健康状态,并能及时响应各种异常情况。本文将介绍如何使用Docker-Java这个库来监听Docker容器的信息。
什么是Docker-Java?
Docker-Java是一个开源的Java库,旨在通过Java程序与Docker守护进程进行通信。它提供了丰富的API,可以用于管理Docker容器、镜像、网络等各种资源。
安装Docker-Java
在开始之前,确保你已经安装了Docker,并且可以正常运行Docker命令,还需要开放2375和2376。然后,你需要在你的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作为一种轻量级的容器化平台,极大地方便了应用的部署与管理。然而,在实际使用过程中,我们常常需要对运行中的容器进行监控,以确保其健康状态,并能及时响应各种异常情况。本…...
 
Spring Boot + Mybatis Plus实现登录注册
Spring Boot 实现登录注册 1. 注册 业务逻辑 客户端输入注册时需要的用户参数,比如:账户名、密码、确认密码、其他服务端接收到客户端的请求参数进行校验,然后判断是否有误,有误的地方就将错误信息抛出将密码进行加密之后存储到…...
 
IDEA创建web项目
IDEA创建web项目 第一步:创建一个空项目 第二步:在刚刚创建的项目下创建一个子模块 第三步:在子模块中引入web 创建结果如下: 这里我们需要把这个目录移到main目录下,并改名为webapp,结果如下 将pom文件…...
 
二手物品交易系统的设计
管理员账户功能包括:系统首页,个人中心,管理员管理,商家管理,用户管理,商品管理,用户咨询管理 商家账户功能包括:系统首页,个人中心,商品管理,用…...
 
探索大数据在信用评估中的独特价值
随着我国的信用体系越来越完善,信用将影响越来越多的人。现在新兴的大数据信用和传统信用,形成了互补的优势,大数据信用变得越来越重要,那大数据信用风险检测的重要性主要体现在什么地方呢?本文将详细为大家介绍一下,…...
 
MFC基础学习应用
MFC基础学习应用 1.基于对话框的使用 左上角为菜单键(其下的关于MFC主要功能由IDD_ABOUTBOX决定) 附图 右下角为按钮(基本功能由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】,否则 active 值不会变! spring…...
 
【强化学习】gymnasium自定义环境并封装学习笔记
【强化学习】gymnasium自定义环境并封装学习笔记 gym与gymnasium简介gymgymnasium gymnasium的基本使用方法使用gymnasium封装自定义环境官方示例及代码编写环境文件__init__()方法reset()方法step()方法render()方法close()方法 注册环境创建包 Package(最后一步&a…...
 
TLE9879的基于Arduino调试板SWD刷写接口
官方的Arduino评估板,如下图所示: 如果你有官方的调试器,应该不用关注本文章,如下图连接就是: 如果,您和博主一样需要自己飞线的话,如下图所示:PCB的名称在右边整理,SWD的…...
基于 Delphi 的前后端分离:之五,使用 HTMX 让页面元素组件化之面向对象的Delphi代码封装
前情提要 本博客上一篇文章,描述了使用 Delphi 作为后端的 Web Server,前端使用 HTMX 框架,把一个开源的前端图表 JS 库,进行了组件化。 上一篇文章仅仅是描述了简单的前端代码组件化的可能性,依然是基于前端库的 JS…...
 
讲透计算机网络知识(实战篇)01——计算机网络和协议
一、计算机网络和协议 1、网络和互联网络 1.1 网络、互联网、Internet 用交换机、集线器连接在一起的计算机构成一个网络。 用路由器连接多个网络,形成互联网。 全球最大的互联网:Internet。 1.2 网络举例 家庭互联网 图中的无线拨号路由器既是路由…...
 
8个宝藏APP,个个都牛逼哈拉!
AI视频生成:小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/ 目前win7已经逐渐淡出人们的视野,大部分人都开始使用win10,在日常工作和使用中,创客们下载神奇的软件能大幅提…...
使用docker构建java应用
1、docker简介 Docker是一个开源的容器化平台,可以帮助开发人员将应用程序及其依赖项打包成一个可移植的容器。容器化是一种轻量级的虚拟化技术,可以使应用程序在不同的操作系统和环境中具有一致的运行方式。 使用Docker带来的好处包括: 简…...
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 得到了请求地址与请求参数后,可以发现请求参数中的出发地与目的地均为车站名的英文缩写。而这个英文缩写的字母是通过输入中文车站名转换…...
345453
38744...
 
Java操作redis
目录 一:Jedis 二:使用Spring Data Redis Redis 的 Java 客户端很多,官方推荐的有三种: 1.Jedis 2.Lettuce 3.Redisson 同时,Spring 对 Redis 客户端进行了整合,提供了 Spring Data Redis,在S…...
 
【数据结构(邓俊辉)学习笔记】图03——拓扑排序
文章目录 0. 概述1. 零入度算法1. 1 拓扑排序1. 2 算法 2. 零出度算法2.1 算法2.2 实现2.3. 复杂度 0. 概述 学习下拓扑排序 1. 零入度算法 1. 1 拓扑排序 首先理解下拓扑排序 其实老师经常干这事,如编讲义,将已经知道的知识点串起来变成讲课序列。那…...
C#参数使用场景简要说明
C#参数使用场景简要说明 1、传值参数 方法、类成员的初始化 2、输出参数 方法返回值不能满足,需要多个返回值时; 3、引用参数 方法需要修改变量需带回原变量时; 4、具名参数 代码可读性高,参数可交换位置 5、方法扩展(…...
 
线性代数|机器学习-P10最小二乘法的四种方案
文章目录 1. 概述2. SVD奇异值分解3. 最小二乘法方程解4. 最小二乘法图像解释5. Gram-Schmidt 1. 概述 当我们需要根据一堆数据点去拟合出一条近似的直线的时候,就会用到 最小二乘法 .根据矩阵A的情况,有如下四种方法 在r n m 时,SVD奇异…...
 
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
 
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
 
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
 
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...
WebRTC从入门到实践 - 零基础教程
WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC? WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音…...
 
实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...
 
DBLP数据库是什么?
DBLP(Digital Bibliography & Library Project)Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高,数据库文献更新速度很快,很好地反映了国际计算机科学学术研…...
 
软件工程 期末复习
瀑布模型:计划 螺旋模型:风险低 原型模型: 用户反馈 喷泉模型:代码复用 高内聚 低耦合:模块内部功能紧密 模块之间依赖程度小 高内聚:指的是一个模块内部的功能应该紧密相关。换句话说,一个模块应当只实现单一的功能…...
