| | |
| | | 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); |
| | | } |
| | | } |
| | |
| | | DockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder() |
| | | .withApiVersion(dockerApiVersion) |
| | | .withDockerHost(dockerHost) |
| | | //如果开启安全连接,需要配置这行 |
| | | // 如果开启安全连接,需要配置这行 |
| | | .withDockerTlsVerify(true).withDockerCertPath(dockerCertPath) |
| | | .build(); |
| | | |
| | |
| | | } |
| | | |
| | | /** |
| | | * 推送镜像 |
| | | * |
| | | * @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 容器的信息列表 |
| | |
| | | log.info("开始获取所有 Docker 容器信息."); |
| | | try { |
| | | ListContainersCmd listContainersCmd = dockerClient.listContainersCmd(); |
| | | listContainersCmd.withShowAll(true); |
| | | return listContainersCmd.exec(); |
| | | } catch (Exception e) { |
| | | log.error("获取所有 Docker 容器信息失败: {}", e.getMessage()); |
| | |
| | | } |
| | | |
| | | /** |
| | | * 推送镜像 |
| | | * |
| | | * @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 |
| | |
| | | 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); |
| | | } |
| | | } |
| | | |
| | |
| | | .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); |
| | | |