From 82ced275b4f24a42d7df43fb13511f413ff36909 Mon Sep 17 00:00:00 2001 From: gaoxq <376340421@qq.com> Date: Tue, 27 Jan 2026 22:21:55 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=9F=A5=E7=9C=8B=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/pom.xml | 13 ++++ .../modules/app/utils/DockerUtils.java | 67 +++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 web-api/src/main/java/com/jeesite/modules/app/utils/DockerUtils.java diff --git a/common/pom.xml b/common/pom.xml index 7eda23eb..099da92e 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -19,6 +19,7 @@ + jakarta.servlet @@ -32,6 +33,18 @@ 4.12.0 + + com.github.docker-java + docker-java-transport-okhttp + 3.3.4 + + + + com.github.docker-java + docker-java + 3.3.4 + + com.google.code.gson gson diff --git a/web-api/src/main/java/com/jeesite/modules/app/utils/DockerUtils.java b/web-api/src/main/java/com/jeesite/modules/app/utils/DockerUtils.java new file mode 100644 index 00000000..79da28f2 --- /dev/null +++ b/web-api/src/main/java/com/jeesite/modules/app/utils/DockerUtils.java @@ -0,0 +1,67 @@ +package com.jeesite.modules.app.utils; + +import com.github.dockerjava.api.DockerClient; +import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.model.Container; +import com.github.dockerjava.core.DockerClientBuilder; +import com.github.dockerjava.okhttp.OkDockerHttpClient; + +import java.net.URI; +import java.util.List; + +public class DockerUtils { + private final DockerClient dockerClient; + + public DockerUtils(String dockerIp, int dockerPort) { + String dockerHostStr = String.format("tcp://%s:%d", dockerIp, dockerPort); + URI dockerHost = URI.create(dockerHostStr); + OkDockerHttpClient httpClient = new OkDockerHttpClient.Builder() + .dockerHost(dockerHost) + .connectTimeout(10) + .readTimeout(30) + .build(); + this.dockerClient = DockerClientBuilder.getInstance(dockerHostStr) + .withDockerHttpClient(httpClient) + .build(); + } + + /** + * 获取容器列表 all true=包含停止容器,false=仅运行中容器 + */ + public List listContainers(boolean all) { + return dockerClient.listContainersCmd().withShowAll(all).exec(); + } + + /** + * 创建容器(指定镜像+唯一容器名,后台运行) + * + */ + public String createContainer(String image, String containerName) { + CreateContainerResponse resp = dockerClient.createContainerCmd(image) + .withName(containerName) + .withTty(true) // 分配伪终端,后台运行 + .exec(); + return resp.getId(); + } + + /** + * 启动容器(支持完整ID/短ID/容器名) + */ + public void startContainer(String containerId) { + dockerClient.startContainerCmd(containerId).exec(); + } + + /** + * 停止容器(支持完整ID/短ID/容器名) + */ + public void stopContainer(String containerId) { + dockerClient.stopContainerCmd(containerId).exec(); + } + + /** + * 删除容器 true=强制删除运行中的容器,false=仅删除停止的 + */ + public void removeContainer(String containerId, boolean force) { + dockerClient.removeContainerCmd(containerId).withForce(force).exec(); + } +} \ No newline at end of file