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