123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- package com.miniframe.tools.docker;
- import com.github.dockerjava.api.DockerClient;
- import com.github.dockerjava.api.async.ResultCallback;
- import com.github.dockerjava.api.command.*;
- import com.github.dockerjava.api.model.Frame;
- import com.github.dockerjava.api.model.HostConfig;
- import com.github.dockerjava.api.model.Mount;
- import com.github.dockerjava.api.model.MountType;
- 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.model.system.SysFile;
- import com.miniframe.tools.XIFileUtils;
- import java.io.File;
- import java.io.IOException;
- import java.nio.file.Path;
- import java.nio.file.Paths;
- import java.util.ArrayList;
- import java.util.List;
- public class DockerExe {
- // public static String DOCKERHOST="tcp://127.0.0.1:2375/";
- // public static String APIVERSION="26.1.0";
- public static final String DOCKERHOST="tcp://192.168.0.132:2375/";
- public static final String APIVERSION="1.13.1";
- // 获取容器信息
- public static String getDocker(String pid){
- 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(pid).exec();
- //exited 停止 running 运行
- try{
- return containerInfo.getState().getStatus();
- }catch (Exception e){
- return "No such container:"+pid;
- }
- }
- public static void stopDocker(String pid){
- 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 {
- RemoveContainerCmd removeContainerCmd = dockerClient.removeContainerCmd(pid)
- .withForce(true);
- removeContainerCmd.exec();
- System.out.println("容器已停止: " + pid);
- } catch (Exception e) {
- System.err.println("停止容器失败: " + e.getMessage());
- // e.printStackTrace();
- }
- }
- public static void getDockerLogs(String pid, 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(pid)
- .withStdOut(true)
- .withStdErr(true)
- .withFollowStream(true);
- // 使用 ResultCallback.Adapter 处理日志
- logContainerCmd.exec(logsexe).awaitCompletion();
- }
- public static void run(String pid,Integer type) {
- 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 wokerMount = new Mount()
- .withType(MountType.BIND)
- .withSource("/cephfs/ac/"+pid)
- .withTarget("/cephfs/ac/"+pid)
- .withReadOnly(false);
- List<Mount> am =new ArrayList<>();
- am.add(wokerMount);
- //创建容器
- CreateContainerResponse container = dockerClient
- .createContainerCmd("aircraft:1.0")//镜像名称
- .withName(pid)//容器名称
- .withHostConfig(
- HostConfig.newHostConfig()
- .withMounts(am)
- ).withCmd("bash", "-c", "cd /home/aircraft/project " +
- "&& export PYTHONPATH=$PYTHONPATH:/home/aircraft/Soad_Project " +
- "&& source ~/miniconda3/etc/profile.d/conda.sh " +
- "&& conda activate " +
- "&& python test.py gui.xml /cephfs/ac/"+pid+"/"+type+
- " && conda deactivate")
- .exec();
- dockerClient.startContainerCmd(container.getId()).exec();
- System.out.println("容器启动成功,ID: " + container.getId());
- }
- }
|