From d877ac3faecbee5ed64bc23665347d14706663c9 Mon Sep 17 00:00:00 2001 From: 13693261870 <252740454@qq.com> Date: 星期二, 24 十二月 2024 16:04:29 +0800 Subject: [PATCH] 操作docker容器 --- se-modules/se-docker/src/main/java/com/se/docker/utils/DockerUtils.java | 164 ++++++++++++++++++-------- 说明.txt | 31 +++++ se-modules/se-docker/src/main/java/com/se/docker/controller/SysDockerController.java | 2 se-common/se-common-core/src/main/java/com/se/common/core/domain/DockerContainer.java | 60 ++++++++++ se-modules/se-docker/src/main/java/com/se/docker/service/SysDockerService.java | 73 +++++++++++ 5 files changed, 275 insertions(+), 55 deletions(-) diff --git a/se-common/se-common-core/src/main/java/com/se/common/core/domain/DockerContainer.java b/se-common/se-common-core/src/main/java/com/se/common/core/domain/DockerContainer.java new file mode 100644 index 0000000..f6bef8a --- /dev/null +++ b/se-common/se-common-core/src/main/java/com/se/common/core/domain/DockerContainer.java @@ -0,0 +1,60 @@ +package com.se.common.core.domain; + +@SuppressWarnings("ALL") +public class DockerContainer { + private String id; + + private String name; + + /** + * running,created,exited,paused,restarting,dead,error + */ + private String state; + + /** + * redis:latest + */ + private String image; + + public DockerContainer() { + } + + public DockerContainer(String id, String name, String state, String image) { + this.id = id; + this.name = name; + this.state = state; + this.image = image; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + public String getImage() { + return image; + } + + public void setImage(String image) { + this.image = image; + } +} diff --git a/se-modules/se-docker/src/main/java/com/se/docker/controller/SysDockerController.java b/se-modules/se-docker/src/main/java/com/se/docker/controller/SysDockerController.java index 9522dd7..3310330 100644 --- a/se-modules/se-docker/src/main/java/com/se/docker/controller/SysDockerController.java +++ b/se-modules/se-docker/src/main/java/com/se/docker/controller/SysDockerController.java @@ -29,7 +29,7 @@ return R.ok(str); } catch (Exception e) { log.error(e.getMessage(), e); - return R.fail(); + return R.fail(e.getMessage()); } } } diff --git a/se-modules/se-docker/src/main/java/com/se/docker/service/SysDockerService.java b/se-modules/se-docker/src/main/java/com/se/docker/service/SysDockerService.java index d97cab8..4ff3a04 100644 --- a/se-modules/se-docker/src/main/java/com/se/docker/service/SysDockerService.java +++ b/se-modules/se-docker/src/main/java/com/se/docker/service/SysDockerService.java @@ -2,25 +2,94 @@ import com.github.dockerjava.api.DockerClient; import com.github.dockerjava.api.command.*; +import com.github.dockerjava.api.model.Container; import com.github.dockerjava.api.model.PullResponseItem; import com.github.dockerjava.core.DockerClientBuilder; +import com.se.common.core.domain.DockerContainer; +import com.se.docker.utils.DockerUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + @Service @SuppressWarnings("ALL") public class SysDockerService { - //@Value("${docker.prefix}") - public String localFilePrefix; + @Value("${docker.host}") + private String host; + + @Value("${docker.apiVersion}") + private String apiVersion; + + private static DockerUtils dockerUtils; private static final Logger log = LoggerFactory.getLogger(SysDockerService.class); + public DockerUtils getDockerUtils() { + if (null == dockerUtils) { + dockerUtils = new DockerUtils(host, apiVersion); + } + + return dockerUtils; + } + public String test() throws Exception { + List<String> names = new ArrayList<>(Arrays.asList("se-redis", "se-mysql", "se-system", "se-wgcloud")); + List<DockerContainer> list = getContainers(names); + + String id = list.get(0).getId(); + start(id); + pause(id); + unpause(id); + stop(id); + restart(id); + return "docker: " + System.currentTimeMillis(); } + public List<DockerContainer> getContainers(List<String> names) { + DockerUtils util = getDockerUtils(); + List<Container> containers = util.listContainers(); + + List<DockerContainer> list = new ArrayList<>(); + for (Container container : containers) { + if (null == container.getNames() || 0 == container.getNames().length) continue; + + String containerName = container.getNames()[0]; + for (String name : names) { + if (containerName.contains(name)) { + list.add(new DockerContainer(container.getId(), containerName, container.getState(), container.getImage())); + break; + } + } + } + return list; + } + + public void start(String id) { + getDockerUtils().start(id); + } + + public void restart(String id) { + getDockerUtils().restart(id); + } + + public void stop(String id) { + getDockerUtils().stop(id); + } + + public void pause(String id) { + getDockerUtils().pause(id); + } + + public void unpause(String id) { + getDockerUtils().unpause(id); + } + /** * java DockerClient鎿嶄綔 * https://blog.csdn.net/weixin_45198228/article/details/130060333 diff --git a/se-modules/se-docker/src/main/java/com/se/docker/utils/DockerUtils.java b/se-modules/se-docker/src/main/java/com/se/docker/utils/DockerUtils.java index 9530b38..ea016c4 100644 --- a/se-modules/se-docker/src/main/java/com/se/docker/utils/DockerUtils.java +++ b/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); } } @@ -77,7 +108,7 @@ DockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder() .withApiVersion(dockerApiVersion) .withDockerHost(dockerHost) - //濡傛灉寮�鍚畨鍏ㄨ繛鎺ワ紝闇�瑕侀厤缃繖琛� + // 濡傛灉寮�鍚畨鍏ㄨ繛鎺ワ紝闇�瑕侀厤缃繖琛� .withDockerTlsVerify(true).withDockerCertPath(dockerCertPath) .build(); @@ -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() - //鏈嶅姟鍣╥p - .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); diff --git "a/\350\257\264\346\230\216.txt" "b/\350\257\264\346\230\216.txt" index c151e2b..d093f5e 100644 --- "a/\350\257\264\346\230\216.txt" +++ "b/\350\257\264\346\230\216.txt" @@ -111,3 +111,34 @@ kill -9 10086 url: jdbc:mysql://localhost:3306/se-cloud?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 +-------------------------------------------------------- +vi /etc/docker/daemon.json + +vim /lib/systemd/system/docker.service +# 閰嶇疆鏅�氭ā寮忥紝-H鍙傛暟鎸囧畾docker搴旂敤绋嬪簭鐩戝惉鏂瑰紡锛屾垨鑰呴噰鐢ㄤ笅闈㈢殑瀹夊叏杩炴帴鏂瑰紡2閫�1 +ExecStart=/usr/bin/dockerd -H unix://var/run/docker.sock -H tcp://0.0.0.0:2375 + +#閰嶇疆瀹夊叏杩炴帴锛屾敞鎰忚繖閲岀殑/home/user/certs/ 鏍规嵁鑷繁鎯呭喌鏇挎崲涓哄疄闄呯殑鐨勫瘑閽ュ瓨鏀捐矾寰� +ExecStart=/usr/bin/dockerd -D --tlsverify=true --tlscert=/home/user/certs/server-cert.pem --tlskey=/home/user/certs/server-key.pem --tlscacert=/home/user/certs/ca.pem -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock + +#閲嶈浇閰嶇疆锛岄噸鍚湇鍔� +systemctl daemon-reload +systemctl restart docker + +#鏌ョ湅绔彛鐩戝惉 +netstat -nlp |grep 2375 + +firewall-cmd --permanent --zone=public --add-port=2375/tcp +firewall-cmd --reload +firewall-cmd --list-ports + +/se-cloud-se-redis-1 + +# se-docker-dev.yml +docker: + host: tcp://192.168.11.203:2375 + apiVersion: 1.45 + +docker pause 7c5b33491640 +docker unpause 7c5b33491640 +-------------------------------------------------------- -- Gitblit v1.9.3