Bläddra i källkod

docker water 执行

huangxingxing 8 månader sedan
förälder
incheckning
5c2d684875

+ 18 - 5
pom.xml

@@ -46,11 +46,11 @@
             </exclusions>
         </dependency>
 
-        <dependency>
-            <groupId>com.taobao</groupId>
-            <artifactId>taobao-sdk-java-auto</artifactId>
-            <version>1.0.0</version>
-        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>com.taobao</groupId>-->
+<!--            <artifactId>taobao-sdk-java-auto</artifactId>-->
+<!--            <version>1.0.0</version>-->
+<!--        </dependency>-->
 
         <dependency>
             <groupId>org.springframework.cloud</groupId>
@@ -314,6 +314,19 @@
                 </exclusion>
             </exclusions>
         </dependency>
+
+
+            <dependency>
+                <groupId>com.github.docker-java</groupId>
+                <artifactId>docker-java</artifactId>
+                <version>3.2.13</version> <!-- 请检查最新版本 -->
+            </dependency>
+            <dependency>
+                <groupId>com.github.docker-java</groupId>
+                <artifactId>docker-java-transport-httpclient5</artifactId>
+                <version>3.2.13</version>
+            </dependency>
+
     </dependencies>
 
     <dependencyManagement>

+ 33 - 51
src/main/java/com/miniframe/bisiness/system/D00008Service.java

@@ -1,5 +1,7 @@
 package com.miniframe.bisiness.system;
 
+import com.github.dockerjava.api.async.ResultCallback;
+import com.github.dockerjava.api.model.Frame;
 import com.miniframe.constant.MFConstant;
 import com.miniframe.core.ExecProcessFlow;
 import com.miniframe.core.exception.BusinessException;
@@ -11,6 +13,7 @@ import com.miniframe.generate.comm.system.D_D10016_COCODES_RECODE;
 import com.miniframe.model.system.*;
 import com.miniframe.model.system.dao.*;
 import com.miniframe.service.impl.FileServiceImpl;
+import com.miniframe.solverjob.DockerExe;
 import com.miniframe.template.TemplateGenerator;
 import com.miniframe.template.TemplateGenerator2;
 import com.miniframe.tools.XIDateTimeUtils;
@@ -112,7 +115,7 @@ public class D00008Service extends D00008BaseModel implements ExecProcessFlow {
 			LogService.addLog(accident,"water.init配置生成——————————————————成功");
 			TemplateGenerator2.createWaterEsccapeControl(aid,jid);
 			LogService.addLog(accident,"waterEscape.control配置生成——————————————————成功");
-			exeWater(aid,jid);
+			exeWater2(aid,jid);
 		}
 		if(accident.getStype().equals("Gass1")) {//瓦斯爆炸一维
 			TemplateGenerator2.createGeometry(aid,jid);
@@ -369,58 +372,37 @@ public class D00008Service extends D00008BaseModel implements ExecProcessFlow {
 	}
 	//异步执行
 	@SneakyThrows
-	public void exeWater2(Integer aid,Integer jid) throws Exception{
-		CompletableFuture<Void> cf = CompletableFuture.supplyAsync(()->{
+	public void exeWater2(Integer aid,Integer jid){
+		CompletableFuture<Void> cf = CompletableFuture.supplyAsync(()-> {
 			try {
-				// 构建Docker命令字符串
-				String dockerCommand = "docker run --name " +
-						aid +jid+
-						" -it -v /home/disaster/zhty/:/home/disaster/zhty/ " +
-						"-v /cephfs/disaster/:/cephfs/disaster/  " +
-						"-v " +
-						TemplateGenerator.BPATH+"/"+aid+"/"+jid+"/water/runWater.sh" +
-						":/home/disaster/zhty/Water/runWater.sh " +
-						"water:1.0";
-				System.out.println(dockerCommand);
-				ProcessBuilder processBuilder = new ProcessBuilder(dockerCommand.split(" "));
-				LogService.addLog(aid,jid,"Water","求解——————————————————开始");
-//				Runtime runtime = Runtime.getRuntime();
-//				Process p =null;
-//				FileWriter fileWriter = new FileWriter(TemplateGenerator.BPATH + "/" + aid + "/" + jid + "run.sh");
-//				fileWriter.write("docker run --name " +
-//						aid +jid+
-//						" -it -v /home/disaster/zhty/:/home/disaster/zhty/ " +
-//						"-v /cephfs/disaster/:/cephfs/disaster/  " +
-//						"-v " +
-//						TemplateGenerator.BPATH+"/"+aid+"/"+jid+"/water/runWater.sh" +
-//						":/home/disaster/zhty/Water/runWater.sh " +
-//						" water:1.0");
-//				fileWriter.close();
-//				String exs="sh "+TemplateGenerator.BPATH + "/" + aid + "/" + jid + "run.sh";
-//				System.out.println(exs.split(" "));
-//				p= runtime.exec(exs);
-//				InputStream fis = p.getInputStream();
-//				InputStreamReader isr = new InputStreamReader(fis);
-//				BufferedReader br = new BufferedReader(isr);
-				Process process = processBuilder.start();
-				processBuilder.redirectErrorStream(true); // 将错误流合并到标准输出流
-				// 读取命令的输出
-				BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
-				String line = null;
-				while ((line = reader.readLine()) != null) {
-					LogService.addLog(aid,jid,"Water",line);
-					System.out.println(line);
-				}
-				// 等待命令执行完成
-				int exitCode = process.waitFor();
-				System.out.println("\nExited with code: " + exitCode);
+				DockerExe.waterExec(aid, jid,"Water");
+				DockerExe.getDockerLogs(aid,"Water",new ResultCallback.Adapter<Frame>() {
+					@Override
+					public void onNext(Frame frame) {
+						LogService.addLog(aid,jid,"Water","求解——————————————————开始");
+						LogService.addLog(aid,jid,"Water",new String(frame.getPayload()));
+						System.out.print(new String(frame.getPayload()));
+						super.onNext(frame);
+					}
+					@Override
+					public void onError(Throwable throwable) {
+						System.err.println("日志获取失败");
+						throwable.printStackTrace();
+						super.onError(throwable);
+					}
 
-//				saveMonitorValue(aid,jid);
-//				//路径保存
-//				saveWayValue(aid,jid);
-//				JobSucces(jid);
-				LogService.addLog(aid,jid,"Water","求解——————————————————成功");
-			} catch (IOException  | InterruptedException e) {
+					@Override
+					public void onComplete() {
+						LogService.addLog(aid,jid,"Water","求解——————————————————成功");
+						System.out.println("日志获取完成");
+						super.onComplete();
+					}
+				});
+				saveMonitorValue(aid,jid);
+				//路径保存
+				saveWayValue(aid,jid);
+				JobSucces(jid);
+			} catch (Exception e) {
 				LogService.addLog(aid,jid,"Water","求解——————————————————失败");
 				JobError(jid);
 				e.printStackTrace();

+ 2 - 2
src/main/java/com/miniframe/disaster/service/LogService.java

@@ -67,8 +67,8 @@ public class LogService {
         }
         CompletableFuture<Void> cf = CompletableFuture.supplyAsync(()->{
 //                System.out.println("s消息发送:aid:"+aid+"--log:"+log);
-                WebsocketEndPoint webs =  (WebsocketEndPoint) UtilTools.getBean("websocketEndPoint");
-                webs.sendMessageToUser(String.valueOf(aid),log);
+        WebsocketEndPoint webs =  (WebsocketEndPoint) UtilTools.getBean("websocketEndPoint");
+        webs.sendMessageToUser(String.valueOf(aid),log);
 //                System.out.println("d消息发送:aid:"+aid+"--log:"+log);
             return null;
         });

+ 192 - 0
src/main/java/com/miniframe/solverjob/DockerExe.java

@@ -0,0 +1,192 @@
+package com.miniframe.solverjob;
+
+import com.github.dockerjava.api.DockerClient;
+import com.github.dockerjava.api.async.ResultCallback;
+import com.github.dockerjava.api.command.CreateContainerResponse;
+import com.github.dockerjava.api.command.InspectContainerResponse;
+import com.github.dockerjava.api.command.LogContainerCmd;
+import com.github.dockerjava.api.model.*;
+import com.github.dockerjava.core.DefaultDockerClientConfig;
+import com.github.dockerjava.core.DockerClientBuilder;
+import com.github.dockerjava.core.DockerClientConfig;
+import com.github.dockerjava.httpclient5.ApacheDockerHttpClient;
+import com.github.dockerjava.transport.DockerHttpClient;
+import com.miniframe.disaster.service.LogService;
+import jdk.nashorn.internal.ir.IdentNode;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class DockerExe {
+    public static final String DOCKERHOST="tcp://192.168.0.132:2375/";
+    public static final String APIVERSION="1.13.1";
+    // 获取容器信息
+    public static String getDocker(Integer aid){
+        DockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder()
+                .withDockerHost(DOCKERHOST) // 设置 Docker 主机地址
+                .withDockerTlsVerify(false) // 启用 TLS 验证
+                .withApiVersion(APIVERSION) // 设置 API 版本
+                .build();
+        DockerHttpClient httpClient = new ApacheDockerHttpClient.Builder()
+                .dockerHost(config.getDockerHost())
+                .sslConfig(config.getSSLConfig())
+                .build();
+        DockerClient dockerClient = DockerClientBuilder.getInstance(config)
+                .withDockerHttpClient(httpClient)
+                .build();
+        InspectContainerResponse containerInfo = dockerClient.inspectContainerCmd(aid.toString()).exec();
+        //exited 停止  running  运行
+        try{
+            return containerInfo.getState().getStatus();
+        }catch (Exception e){
+            return "No such container:"+aid;
+        }
+
+
+    }
+    private static void stopDocker(Integer aid){
+        DockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder()
+                .withDockerHost(DOCKERHOST) // 设置 Docker 主机地址
+                .withDockerTlsVerify(false) // 启用 TLS 验证
+                .withApiVersion(APIVERSION) // 设置 API 版本
+                .build();
+        DockerHttpClient httpClient = new ApacheDockerHttpClient.Builder()
+                .dockerHost(config.getDockerHost())
+                .sslConfig(config.getSSLConfig())
+                .build();
+        DockerClient dockerClient = DockerClientBuilder.getInstance(config)
+                .withDockerHttpClient(httpClient)
+                .build();
+        try {
+            dockerClient.stopContainerCmd(aid.toString())
+                    .withTimeout(1000)
+                    .exec();
+            dockerClient.removeConfigCmd(aid.toString())
+                    .exec();
+            System.out.println("容器已停止: " + aid.toString());
+        } catch (Exception e) {
+            System.err.println("停止容器失败: " + e.getMessage());
+            e.printStackTrace();
+        }
+    }
+    public static void getDockerLogs(Integer aid,String stype, ResultCallback.Adapter<Frame> logsexe) throws InterruptedException {
+        DockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder()
+                .withDockerHost(DOCKERHOST) // 设置 Docker 主机地址
+                .withDockerTlsVerify(false) // 启用 TLS 验证
+                .withApiVersion(APIVERSION) // 设置 API 版本
+                .build();
+        DockerHttpClient httpClient = new ApacheDockerHttpClient.Builder()
+                .dockerHost(config.getDockerHost())
+                .sslConfig(config.getSSLConfig())
+                .build();
+        DockerClient dockerClient = DockerClientBuilder.getInstance(config)
+                .withDockerHttpClient(httpClient)
+                .build();
+        // 获取容器日志
+        LogContainerCmd logContainerCmd = dockerClient.logContainerCmd(stype+"_"+aid.toString())
+                .withStdOut(true)
+                .withStdErr(true)
+                .withFollowStream(true);
+
+        // 使用 ResultCallback.Adapter 处理日志
+        logContainerCmd.exec(logsexe).awaitCompletion();
+    }
+
+    public static void fireExec(Integer aid, Integer jid,String stype) {
+        DockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder()
+                .withDockerHost(DOCKERHOST) // 设置 Docker 主机地址
+                .withDockerTlsVerify(false) // 启用 TLS 验证
+                .withApiVersion(APIVERSION) // 设置 API 版本
+                .build();
+        DockerHttpClient httpClient = new ApacheDockerHttpClient.Builder()
+                .dockerHost(config.getDockerHost())
+                .sslConfig(config.getSSLConfig())
+                .build();
+        DockerClient dockerClient = DockerClientBuilder.getInstance(config)
+                .withDockerHttpClient(httpClient)
+                .build();
+        Mount zhtyVMount = new Mount()
+                .withType(MountType.BIND)
+                .withSource("/home/disaster/zhty/")
+                .withTarget("/home/disaster/zhty/")
+                .withReadOnly(false);
+        Mount cephfsVMount = new Mount()
+                .withType(MountType.BIND)
+                .withSource("/cephfs/disaster/")
+                .withTarget("/cephfs/disaster/")
+                .withReadOnly(false);
+        Mount runWaterMount = new Mount()
+                .withType(MountType.BIND)
+                .withSource("/cephfs/disaster/" +
+                        aid +
+                        "/" +
+                        jid +
+                        "/fire/runFile.sh")
+                .withTarget("/home/disaster/zhty/Fire/runFire.sh")
+                .withReadOnly(false);
+        List<Mount> am =new ArrayList<>();
+        am.add(zhtyVMount);
+        am.add(cephfsVMount);
+        am.add(runWaterMount);
+        //创建容器
+        CreateContainerResponse container = dockerClient
+                .createContainerCmd("fire:1.0")//镜像名称
+                .withName(stype+"_"+aid)//容器名称
+                .withHostConfig(
+                        HostConfig.newHostConfig()
+                                .withMounts(am)
+                ).exec();
+        dockerClient.startContainerCmd(container.getId()).exec();
+        System.out.println("容器启动成功,ID: " + container.getId());
+    }
+    public static void waterExec(Integer aid, Integer jid,String stype) throws InterruptedException {
+        DockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder()
+                .withDockerHost(DOCKERHOST) // 设置 Docker 主机地址
+                .withDockerTlsVerify(false) // 启用 TLS 验证
+                .withApiVersion(APIVERSION) // 设置 API 版本
+                .build();
+        DockerHttpClient httpClient = new ApacheDockerHttpClient.Builder()
+                .dockerHost(config.getDockerHost())
+                .sslConfig(config.getSSLConfig())
+                .build();
+        DockerClient dockerClient = DockerClientBuilder.getInstance(config)
+                .withDockerHttpClient(httpClient)
+                .build();
+        Mount zhtyVMount = new Mount()
+                .withType(MountType.BIND)
+                .withSource("/home/disaster/zhty/")
+                .withTarget("/home/disaster/zhty/")
+                .withReadOnly(false);
+        Mount cephfsVMount = new Mount()
+                .withType(MountType.BIND)
+                .withSource("/cephfs/disaster/")
+                .withTarget("/cephfs/disaster/")
+                .withReadOnly(false);
+        Mount runWaterMount = new Mount()
+                .withType(MountType.BIND)
+                .withSource("/cephfs/disaster/" +
+                        aid +
+                        "/" +
+                        jid +
+                        "/water/runWater.sh")
+                .withTarget("/home/disaster/zhty/Water/runWater.sh")
+                .withReadOnly(false);
+        List<Mount> am =new ArrayList<>();
+        am.add(zhtyVMount);
+        am.add(cephfsVMount);
+        am.add(runWaterMount);
+        //创建容器
+        CreateContainerResponse container = dockerClient
+                .createContainerCmd("water:1.0")//镜像名称
+                .withName(stype+"_"+aid)//容器名称
+                .withHostConfig(
+                        HostConfig.newHostConfig()
+                                .withMounts(am)
+                ).exec();
+        dockerClient.startContainerCmd(container.getId()).exec();
+        System.out.println("容器启动成功,ID: " + container.getId());
+
+
+
+    }
+}

+ 2 - 0
src/main/java/com/miniframe/template/TemplateGenerator.java

@@ -214,6 +214,7 @@ public class TemplateGenerator {
         XIFileUtils.mkdir(BPATH + "/" + aid + "/" + jid + s + "/" + "/mid");
         XIFileUtils.mkdir(BPATH + "/" + aid + "/" + jid + s + "/" + "/out");
         XIFileUtils.mkdir(BPATH + "/" + aid + "/" + jid + s + "/" + "/case");
+        XIFileUtils.mkdir(BPATH + "/" + aid + "/" + jid + s + "/" + "/data_his");
         XIFileUtils.mkdir(BPATH + "/" + aid + "/" + jid + s + "/" + "/data_mnt");
         XIFileUtils.mkdir(BPATH + "/" + aid + "/" + jid + s + "/" + "/data_rst");
     }
@@ -553,6 +554,7 @@ public class TemplateGenerator {
         // 定义数据模型(Map)
         Map<String, Object> dataModel = new HashMap<>();
         dataModel.put("casepath", BPATH + "/" + aid + "/" + jid  + "/gas" + "/case");
+        dataModel.put("datahis", BPATH + "/" + aid + "/" + jid  + "/gas" + "/data_his");
         dataModel.put("gascontrol", BPATH + "/" + aid + "/" + jid  + "/gas" + "/MashGas.control");
         dataModel.put("gasescapecontrol", BPATH + "/" + aid + "/" + jid + "/" + "/gas"  + "/gasEscape.control");
         // 将数据模型传入模板进行处理

+ 212 - 0
src/test/java/com/miniframe/DockerTest.java

@@ -0,0 +1,212 @@
+package com.miniframe;
+
+import com.github.dockerjava.api.DockerClient;
+import com.github.dockerjava.api.async.ResultCallback;
+import com.github.dockerjava.api.command.CreateContainerResponse;
+import com.github.dockerjava.api.command.InspectContainerResponse;
+import com.github.dockerjava.api.command.LogContainerCmd;
+import com.github.dockerjava.api.command.PullImageResultCallback;
+import com.github.dockerjava.api.model.*;
+import com.github.dockerjava.core.DefaultDockerClientConfig;
+import com.github.dockerjava.core.DockerClientBuilder;
+import com.github.dockerjava.core.DockerClientConfig;
+import com.github.dockerjava.core.command.LogContainerResultCallback;
+import com.github.dockerjava.httpclient5.ApacheDockerHttpClient;
+import com.github.dockerjava.transport.DockerHttpClient;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import static com.github.dockerjava.api.model.MountType.VOLUME;
+
+public class DockerTest {
+    public static final String DOCKERHOST="tcp://192.168.0.132:2375/";
+    public static final String APIVERSION="1.13.1";
+    public static void main(String[] args) throws InterruptedException {
+        // 初始化 Docker 客户端
+//        System.out.println("容器已成功停止: " + getDocker(7182031)); ;
+        getLogs();
+    }
+    public static String getDocker(Integer aid){
+        DockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder()
+                .withDockerHost(DOCKERHOST) // 设置 Docker 主机地址
+                .withDockerTlsVerify(false) // 启用 TLS 验证
+                .withApiVersion(APIVERSION) // 设置 API 版本
+                .build();
+        DockerHttpClient httpClient = new ApacheDockerHttpClient.Builder()
+                .dockerHost(config.getDockerHost())
+                .sslConfig(config.getSSLConfig())
+                .build();
+        DockerClient dockerClient = DockerClientBuilder.getInstance(config)
+                .withDockerHttpClient(httpClient)
+                .build();
+        InspectContainerResponse containerInfo = dockerClient.inspectContainerCmd(aid.toString()).exec();
+        return containerInfo.getState().getStatus();
+//        if (containerInfo.getState().equals("exited")) {
+//            System.out.println("容器已成功停止: " + aid.toString());
+//        } else {
+//            System.out.println("容器状态: " + containerInfo.getState());
+//        }
+    }
+    private static void fireExec() {
+        DockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder()
+                .withDockerHost("tcp://192.168.0.132:2375/") // 设置 Docker 主机地址
+                .withDockerTlsVerify(false) // 启用 TLS 验证
+                .withApiVersion("1.13.1") // 设置 API 版本
+                .build();
+        DockerHttpClient httpClient = new ApacheDockerHttpClient.Builder()
+                .dockerHost(config.getDockerHost())
+                .sslConfig(config.getSSLConfig())
+                .build();
+        DockerClient dockerClient = DockerClientBuilder.getInstance(config)
+                .withDockerHttpClient(httpClient)
+                .build();
+        Mount zhtyVMount = new Mount()
+                .withType(MountType.BIND)
+                .withSource("/home/disaster/zhty/")
+                .withTarget("/home/disaster/zhty/")
+                .withReadOnly(false);
+        Mount cephfsVMount = new Mount()
+                .withType(MountType.BIND)
+                .withSource("/cephfs/disaster/")
+                .withTarget("/cephfs/disaster/")
+                .withReadOnly(false);
+        Mount runWaterMount = new Mount()
+                .withType(MountType.BIND)
+                .withSource("/cephfs/disaster/6/2054/fire/runFile.sh")
+                .withTarget("/home/disaster/zhty/Fire/runFire.sh")
+                .withReadOnly(false);
+        List<Mount> am =new ArrayList<>();
+        am.add(zhtyVMount);
+        am.add(cephfsVMount);
+        am.add(runWaterMount);
+        //创建容器
+        CreateContainerResponse container = dockerClient
+                .createContainerCmd("fire:1.0")//镜像名称
+                .withName("718201")//容器名称
+                .withHostConfig(
+                        HostConfig.newHostConfig()
+                                .withMounts(am)
+                ).exec();
+        dockerClient.startContainerCmd(container.getId()).exec();
+        System.out.println("容器启动成功,ID: " + container.getId());
+    }
+
+    private static void waterExec() throws InterruptedException {
+        DockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder()
+                .withDockerHost("tcp://192.168.0.132:2375/") // 设置 Docker 主机地址
+                .withDockerTlsVerify(false) // 启用 TLS 验证
+                .withApiVersion("1.13.1") // 设置 API 版本
+                .build();
+        DockerHttpClient httpClient = new ApacheDockerHttpClient.Builder()
+                .dockerHost(config.getDockerHost())
+                .sslConfig(config.getSSLConfig())
+                .build();
+        DockerClient dockerClient = DockerClientBuilder.getInstance(config)
+                .withDockerHttpClient(httpClient)
+                .build();
+        Mount zhtyVMount = new Mount()
+                .withType(MountType.BIND)
+                .withSource("/home/disaster/zhty/")
+                .withTarget("/home/disaster/zhty/")
+                .withReadOnly(false);
+        Mount cephfsVMount = new Mount()
+                .withType(MountType.BIND)
+                .withSource("/cephfs/disaster/")
+                .withTarget("/cephfs/disaster/")
+                .withReadOnly(false);
+        Mount runWaterMount = new Mount()
+                .withType(MountType.BIND)
+                .withSource("/cephfs/disaster/7/1820/water/runWater.sh")
+                .withTarget("/home/disaster/zhty/Water/runWater.sh")
+                .withReadOnly(false);
+        List<Mount> am =new ArrayList<>();
+        am.add(zhtyVMount);
+        am.add(cephfsVMount);
+        am.add(runWaterMount);
+        //创建容器
+        CreateContainerResponse container = dockerClient
+                .createContainerCmd("water:1.0")//镜像名称
+                .withName("718203")//容器名称
+                .withHostConfig(
+                        HostConfig.newHostConfig()
+                        .withMounts(am)
+                ).exec();
+        dockerClient.startContainerCmd(container.getId()).exec();
+        System.out.println("容器启动成功,ID: " + container.getId());
+
+        // 获取容器日志
+        LogContainerCmd logContainerCmd = dockerClient.logContainerCmd(container.getId())
+                .withStdOut(true)
+                .withStdErr(true)
+                .withFollowStream(true);
+
+        // 使用 ResultCallback.Adapter 处理日志
+        logContainerCmd.exec(new ResultCallback.Adapter<Frame>() {
+            @Override
+            public void onNext(Frame frame) {
+                System.out.print(new String(frame.getPayload()));
+                super.onNext(frame);
+            }
+
+            @Override
+            public void onError(Throwable throwable) {
+                System.err.println("日志获取失败");
+                throwable.printStackTrace();
+                super.onError(throwable);
+            }
+
+            @Override
+            public void onComplete() {
+                System.out.println("日志获取完成");
+                super.onComplete();
+            }
+        }).awaitCompletion();
+    }
+
+    private static void  getLogs() throws InterruptedException {
+        DockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder()
+                .withDockerHost("tcp://192.168.0.132:2375/") // 设置 Docker 主机地址
+                .withDockerTlsVerify(false) // 启用 TLS 验证
+                .withApiVersion("1.13.1") // 设置 API 版本
+                .build();
+        DockerHttpClient httpClient = new ApacheDockerHttpClient.Builder()
+                .dockerHost(config.getDockerHost())
+                .sslConfig(config.getSSLConfig())
+                .build();
+        DockerClient dockerClient = DockerClientBuilder.getInstance(config)
+                .withDockerHttpClient(httpClient)
+                .build();
+        // 获取容器日志
+        LogContainerCmd logContainerCmd = dockerClient.logContainerCmd("718203")
+                .withStdOut(true)
+                .withStdErr(true)
+                .withFollowStream(true);
+
+        // 使用 ResultCallback.Adapter 处理日志
+        logContainerCmd.exec(new ResultCallback.Adapter<Frame>() {
+            @Override
+            public void onNext(Frame frame) {
+                System.out.print(new String(frame.getPayload()));
+                super.onNext(frame);
+            }
+
+            @Override
+            public void onError(Throwable throwable) {
+                System.err.println("日志获取失败");
+                throwable.printStackTrace();
+                super.onError(throwable);
+            }
+
+            @Override
+            public void onComplete() {
+                System.out.println("日志获取完成");
+                super.onComplete();
+            }
+        }).awaitCompletion();
+        System.out.println("1111日志获取完成");
+    }
+
+}