DockerExe.java 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. package com.miniframe.tools.docker;
  2. import com.github.dockerjava.api.DockerClient;
  3. import com.github.dockerjava.api.async.ResultCallback;
  4. import com.github.dockerjava.api.command.*;
  5. import com.github.dockerjava.api.model.Frame;
  6. import com.github.dockerjava.api.model.HostConfig;
  7. import com.github.dockerjava.api.model.Mount;
  8. import com.github.dockerjava.api.model.MountType;
  9. import com.github.dockerjava.core.DefaultDockerClientConfig;
  10. import com.github.dockerjava.core.DockerClientBuilder;
  11. import com.github.dockerjava.core.DockerClientConfig;
  12. import com.github.dockerjava.httpclient5.ApacheDockerHttpClient;
  13. import com.github.dockerjava.transport.DockerHttpClient;
  14. import com.miniframe.model.system.SysFile;
  15. import com.miniframe.tools.XIFileUtils;
  16. import java.io.File;
  17. import java.io.IOException;
  18. import java.nio.file.Path;
  19. import java.nio.file.Paths;
  20. import java.util.ArrayList;
  21. import java.util.List;
  22. public class DockerExe {
  23. // public static String DOCKERHOST="tcp://127.0.0.1:2375/";
  24. // public static String APIVERSION="26.1.0";
  25. public static final String DOCKERHOST="tcp://192.168.0.132:2375/";
  26. public static final String APIVERSION="1.13.1";
  27. // 获取容器信息
  28. public static String getDocker(String pid){
  29. DockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder()
  30. .withDockerHost(DOCKERHOST) // 设置 Docker 主机地址
  31. .withDockerTlsVerify(false) // 启用 TLS 验证
  32. .withApiVersion(APIVERSION) // 设置 API 版本
  33. .build();
  34. DockerHttpClient httpClient = new ApacheDockerHttpClient.Builder()
  35. .dockerHost(config.getDockerHost())
  36. .sslConfig(config.getSSLConfig())
  37. .build();
  38. DockerClient dockerClient = DockerClientBuilder.getInstance(config)
  39. .withDockerHttpClient(httpClient)
  40. .build();
  41. InspectContainerResponse containerInfo = dockerClient.inspectContainerCmd(pid).exec();
  42. //exited 停止 running 运行
  43. try{
  44. return containerInfo.getState().getStatus();
  45. }catch (Exception e){
  46. return "No such container:"+pid;
  47. }
  48. }
  49. public static void stopDocker(String pid){
  50. DockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder()
  51. .withDockerHost(DOCKERHOST) // 设置 Docker 主机地址
  52. .withDockerTlsVerify(false) // 启用 TLS 验证
  53. .withApiVersion(APIVERSION) // 设置 API 版本
  54. .build();
  55. DockerHttpClient httpClient = new ApacheDockerHttpClient.Builder()
  56. .dockerHost(config.getDockerHost())
  57. .sslConfig(config.getSSLConfig())
  58. .build();
  59. DockerClient dockerClient = DockerClientBuilder.getInstance(config)
  60. .withDockerHttpClient(httpClient)
  61. .build();
  62. try {
  63. RemoveContainerCmd removeContainerCmd = dockerClient.removeContainerCmd(pid)
  64. .withForce(true);
  65. removeContainerCmd.exec();
  66. System.out.println("容器已停止: " + pid);
  67. } catch (Exception e) {
  68. System.err.println("停止容器失败: " + e.getMessage());
  69. // e.printStackTrace();
  70. }
  71. }
  72. public static void getDockerLogs(String pid, ResultCallback.Adapter<Frame> logsexe) throws InterruptedException {
  73. DockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder()
  74. .withDockerHost(DOCKERHOST) // 设置 Docker 主机地址
  75. .withDockerTlsVerify(false) // 启用 TLS 验证
  76. .withApiVersion(APIVERSION) // 设置 API 版本
  77. .build();
  78. DockerHttpClient httpClient = new ApacheDockerHttpClient.Builder()
  79. .dockerHost(config.getDockerHost())
  80. .sslConfig(config.getSSLConfig())
  81. .build();
  82. DockerClient dockerClient = DockerClientBuilder.getInstance(config)
  83. .withDockerHttpClient(httpClient)
  84. .build();
  85. // 获取容器日志
  86. LogContainerCmd logContainerCmd = dockerClient.logContainerCmd(pid)
  87. .withStdOut(true)
  88. .withStdErr(true)
  89. .withFollowStream(true);
  90. // 使用 ResultCallback.Adapter 处理日志
  91. logContainerCmd.exec(logsexe).awaitCompletion();
  92. }
  93. public static void run(String pid,Integer type) {
  94. DockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder()
  95. .withDockerHost(DOCKERHOST) // 设置 Docker 主机地址
  96. .withDockerTlsVerify(false) // 启用 TLS 验证
  97. .withApiVersion(APIVERSION) // 设置 API 版本
  98. .build();
  99. DockerHttpClient httpClient = new ApacheDockerHttpClient.Builder()
  100. .dockerHost(config.getDockerHost())
  101. .sslConfig(config.getSSLConfig())
  102. .build();
  103. DockerClient dockerClient = DockerClientBuilder.getInstance(config)
  104. .withDockerHttpClient(httpClient)
  105. .build();
  106. Mount wokerMount = new Mount()
  107. .withType(MountType.BIND)
  108. .withSource("/cephfs/ac/"+pid)
  109. .withTarget("/cephfs/ac/"+pid)
  110. .withReadOnly(false);
  111. List<Mount> am =new ArrayList<>();
  112. am.add(wokerMount);
  113. //创建容器
  114. CreateContainerResponse container = dockerClient
  115. .createContainerCmd("aircraft:1.0")//镜像名称
  116. .withName(pid)//容器名称
  117. .withHostConfig(
  118. HostConfig.newHostConfig()
  119. .withMounts(am)
  120. ).withCmd("bash", "-c", "cd /home/aircraft/project " +
  121. "&& export PYTHONPATH=$PYTHONPATH:/home/aircraft/Soad_Project " +
  122. "&& source ~/miniconda3/etc/profile.d/conda.sh " +
  123. "&& conda activate " +
  124. "&& python test.py gui.xml /cephfs/ac/"+pid+"/"+type+
  125. " && conda deactivate")
  126. .exec();
  127. dockerClient.startContainerCmd(container.getId()).exec();
  128. System.out.println("容器启动成功,ID: " + container.getId());
  129. }
  130. }