13693261870
2024-12-24 d877ac3faecbee5ed64bc23665347d14706663c9
se-modules/se-docker/src/main/java/com/se/docker/utils/DockerUtils.java
@@ -59,14 +59,45 @@
    private DockerUtils() {
    }
    private DockerUtils(String dockerHost, String dockerApiVersion, String dockerCertPath) {
    public DockerUtils(String dockerHost, String dockerApiVersion) {
        Objects.requireNonNull(dockerHost, "Docker 主机地址不能为空.");
        Objects.requireNonNull(dockerApiVersion, "Docker API 版本不能为空.");
        // 使用双重校验锁实现 Docker 客户端单例
        if (dockerClient == null) {
        if (null == dockerClient) {
            synchronized (DockerUtils.class) {
                if (dockerClient == null) {
                if (null == dockerClient) {
                    dockerClient = createDockerClient(dockerHost, dockerApiVersion);
                }
            }
        }
    }
    private DockerClient createDockerClient(String dockerHost, String dockerApiVersion) {
        DockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder()
                .withApiVersion(dockerApiVersion)
                .withDockerHost(dockerHost)
                .build();
        DockerHttpClient httpClient = new ApacheDockerHttpClient.Builder()
                .dockerHost(config.getDockerHost())
                .sslConfig(config.getSSLConfig())
                .maxConnections(1000)
                .connectionTimeout(Duration.ofSeconds(60))
                .responseTimeout(Duration.ofMinutes(30))
                .build();
        return DockerClientImpl.getInstance(config, httpClient);
    }
    public DockerUtils(String dockerHost, String dockerApiVersion, String dockerCertPath) {
        Objects.requireNonNull(dockerHost, "Docker 主机地址不能为空.");
        Objects.requireNonNull(dockerApiVersion, "Docker API 版本不能为空.");
        // 使用双重校验锁实现 Docker 客户端单例
        if (null == dockerClient) {
            synchronized (DockerUtils.class) {
                if (null == dockerClient) {
                    dockerClient = createDockerClient(dockerHost, dockerApiVersion, dockerCertPath);
                }
            }
@@ -201,6 +232,28 @@
    }
    /**
     * 推送镜像
     *
     * @param authConfig
     * @param tag
     */
    public static void pushImage(AuthConfig authConfig, String tag) {
        Objects.requireNonNull(authConfig, "认证信息不能为空.");
        Objects.requireNonNull(tag, "镜像信息不能为空.");
        log.info("开始推送 Docker 镜像: {}", tag);
        try {
            PushImageCmd pushImageCmd = dockerClient.pushImageCmd(tag);
            pushImageCmd.withAuthConfig(authConfig)
                    .start()
                    .awaitCompletion(30, TimeUnit.SECONDS);
            log.info("镜像push成功:{}", tag);
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("镜像push失败:{}" + e.getMessage());
        }
    }
    /**
     * 获取所有 Docker 容器的信息
     *
     * @return 所有 Docker 容器的信息列表
@@ -209,6 +262,7 @@
        log.info("开始获取所有 Docker 容器信息.");
        try {
            ListContainersCmd listContainersCmd = dockerClient.listContainersCmd();
            listContainersCmd.withShowAll(true);
            return listContainersCmd.exec();
        } catch (Exception e) {
            log.error("获取所有 Docker 容器信息失败: {}", e.getMessage());
@@ -243,28 +297,6 @@
    }
    /**
     * 推送镜像
     *
     * @param authConfig
     * @param tag
     */
    public static void pushImage(AuthConfig authConfig, String tag) {
        Objects.requireNonNull(authConfig, "认证信息不能为空.");
        Objects.requireNonNull(tag, "镜像信息不能为空.");
        log.info("开始推送 Docker 镜像: {}", tag);
        try {
            PushImageCmd pushImageCmd = dockerClient.pushImageCmd(tag);
            pushImageCmd.withAuthConfig(authConfig)
                    .start()
                    .awaitCompletion(30, TimeUnit.SECONDS);
            log.info("镜像push成功:{}", tag);
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("镜像push失败:{}" + e.getMessage());
        }
    }
    /**
     * 获取镜像Id
     *
     * @param tag
@@ -282,33 +314,64 @@
            e.printStackTrace();
            throw new RuntimeException("无法获取镜像信息:" + e.getMessage());
        }
    }
    // 使用 Builder 模式构建 DockerUtil 对象
    public static class Builder {
    public void start(String id) {
        try {
            InspectContainerResponse resp = dockerClient.inspectContainerCmd(id).exec();
            if (null == resp) return;
        private String dockerHost;
        private String dockerApiVersion;
        private String dockerCertPath;
        public Builder withDockerHost(String dockerHost) {
            this.dockerHost = dockerHost;
            return this;
            dockerClient.startContainerCmd(id).exec();
        } catch (Exception ex) {
            log.error(ex.getMessage(), ex);
        }
        }
        public Builder withDockerApiVersion(String dockerApiVersion) {
            this.dockerApiVersion = dockerApiVersion;
            return this;
    public void restart(String id) {
        try {
            InspectContainerResponse resp = dockerClient.inspectContainerCmd(id).exec();
            if (null == resp) return;
            dockerClient.restartContainerCmd(id).exec();
        } catch (Exception ex) {
            log.error(ex.getMessage(), ex);
        }
        }
        public Builder withDockerCertPath(String dockerCertPath) {
            this.dockerCertPath = dockerCertPath;
            return this;
    public void stop(String id) {
        try {
            InspectContainerResponse resp = dockerClient.inspectContainerCmd(id).exec();
            if (null == resp) return;
            dockerClient.stopContainerCmd(id).exec();
        } catch (Exception ex) {
            log.error(ex.getMessage(), ex);
        }
        }
        public DockerUtils build() {
            return new DockerUtils(dockerHost, dockerApiVersion, dockerCertPath);
    public void pause(String id) {
        try {
            InspectContainerResponse resp = dockerClient.inspectContainerCmd(id).exec();
            if (null == resp) return;
            if (null != resp.getState().getRunning() && resp.getState().getRunning()) {
                dockerClient.pauseContainerCmd(id).exec();
            }
        } catch (Exception ex) {
            log.error(ex.getMessage(), ex);
        }
    }
    public void unpause(String id) {
        try {
            InspectContainerResponse resp = dockerClient.inspectContainerCmd(id).exec();
            if (null == resp) return;
            if (null != resp.getState().getPaused() && resp.getState().getPaused()) {
                dockerClient.unpauseContainerCmd(id).exec();
            }
        } catch (Exception ex) {
            log.error(ex.getMessage(), ex);
        }
    }
@@ -319,14 +382,11 @@
                .withUsername("admin")
                .withPassword("admin123");
        DockerUtils dockerUtil = new DockerUtils.Builder()
                //服务器ip
                .withDockerHost("tcp://10.50.80.165:2375")
                //API版本 可通过在服务器 docker version 命令查看
                .withDockerApiVersion("1.41")
                //安全连接密钥文件存放路径
                .withDockerCertPath("/home/user/certs/")
                .build();
        DockerUtils dockerUtil = new DockerUtils(
                "tcp://192.168.11.203:2375",
                "1.45",
                "/home/user/certs/");
        //登录
        dockerUtil.login(authConfig);