c6550a4d9bd69e59e9bb6ac6ad740e509edbd215..d877ac3faecbee5ed64bc23665347d14706663c9
2024-12-24 13693261870
操作docker容器
d877ac 对比 | 目录
2024-12-13 13693261870
1
b7a71b 对比 | 目录
2024-12-13 13693261870
1
d2cbc7 对比 | 目录
已添加3个文件
已修改12个文件
543 ■■■■ 文件已修改
docker-compose/mysql/initdb/se_cloud_20241119.sql 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docker-compose/mysql/initdb/se_cloud_20241204.sql 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/se-common-core/src/main/java/com/se/common/core/domain/DockerContainer.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-docker/src/main/java/com/se/docker/controller/SysDockerController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-docker/src/main/java/com/se/docker/service/SysDockerService.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-docker/src/main/java/com/se/docker/utils/DockerUtils.java 164 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/pom.xml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/java/com/se/system/config/RestTemplateConfig.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/java/com/se/system/config/WebSocketConfig.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/java/com/se/system/controller/SysCtrlLogController.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/java/com/se/system/domain/SysCtrlLog.java 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/java/com/se/system/service/WebSocketService.java 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/java/com/se/system/service/impl/SysStatusCtrlServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/resources/mapper/system/SysCtrlLogMapper.xml 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
说明.txt 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docker-compose/mysql/initdb/se_cloud_20241119.sql
@@ -197,16 +197,17 @@
drop table if exists sys_ctrl_log;
create table sys_ctrl_log (
  log_id            bigint(20)      not null auto_increment    comment '日志ID',
  title             varchar(100)    not null                   comment '标题',
  type              char(1)         default '0'                comment '类型',
  tab_id            bigint(20)                                 comment '表ID',
  title             varchar(200)    not null                   comment '标题',
  type              char(1)                                    comment '类型(n-正常,e-错误)',
  ip                varchar(50)                                comment 'IP',
  url               varchar(4000)                              comment 'URL',
  method            varchar(20)                                comment '方法',
  method            varchar(50)                                comment '方法',
  args              varchar(4000)                              comment '参数',
  msg               varchar(2000)                              comment '消息',
  oper              varchar(50)                                comment '操作员',
  msg               varchar(4000)                              comment '消息',
  oper              varchar(100)                               comment '操作员',
  time              datetime        default now()              comment '操作时间',
  remark            varchar(500)    default ''                 comment '备注',
  remark            varchar(500)                               comment '备注',
  primary key (log_id)
) engine=innodb auto_increment=1 comment = '控制日志表';
select * from sys_ctrl_log order by log_id;
docker-compose/mysql/initdb/se_cloud_20241204.sql
@@ -108,4 +108,4 @@
insert into sys_status_ctrl (sys_name,ip,url,method,order_num) values ('用户及权限管理','127.0.0.1','http://localhost:8080/system/health', 'GET',1);
insert into sys_status_ctrl (sys_name,ip,url,method,order_num) values ('数据管理分系统','127.0.0.1','http://localhost:8080/gateway/health','GET',2);
-- ----------------------------
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;
    }
}
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());
        }
    }
}
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
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()
                //服务器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);
se-modules/se-system/pom.xml
@@ -16,7 +16,6 @@
    </description>
    
    <dependencies>
        <!-- SpringCloud Alibaba Nacos -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
@@ -130,6 +129,17 @@
            <artifactId>caffeine</artifactId>
            <version>2.9.3</version>
        </dependency>
        <!--websocket-->
        <dependency>
            <groupId>javax.websocket</groupId>
            <artifactId>javax.websocket-api</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
        </dependency>
    </dependencies>
    <build>
se-modules/se-system/src/main/java/com/se/system/config/RestTemplateConfig.java
@@ -4,8 +4,8 @@
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@SuppressWarnings("ALL")
@Configuration
@SuppressWarnings("ALL")
public class RestTemplateConfig {
    @Bean
    public RestTemplate restTemplate() {
se-modules/se-system/src/main/java/com/se/system/config/WebSocketConfig.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package com.se.system.config;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
@Component
@SuppressWarnings("ALL")
public class WebSocketConfig {
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
}
se-modules/se-system/src/main/java/com/se/system/controller/SysCtrlLogController.java
@@ -21,16 +21,16 @@
import com.se.common.core.utils.poi.ExcelUtil;
import com.se.common.core.web.page.TableDataInfo;
/**
 * æŽ§åˆ¶æ—¥å¿—Controller
 *
 *
 * @author se
 * @date 2024-11-22
 * @date 2024-12-13
 */
@RestController
@RequestMapping("/ctrlLog")
public class SysCtrlLogController extends BaseController
{
public class SysCtrlLogController extends BaseController {
    @Autowired
    private ISysCtrlLogService sysCtrlLogService;
@@ -39,8 +39,7 @@
     */
    @RequiresPermissions("system:ctrlLog:list")
    @GetMapping("/list")
    public TableDataInfo list(SysCtrlLog sysCtrlLog)
    {
    public TableDataInfo list(SysCtrlLog sysCtrlLog) {
        startPage();
        List<SysCtrlLog> list = sysCtrlLogService.selectSysCtrlLogList(sysCtrlLog);
        return getDataTable(list);
@@ -52,8 +51,7 @@
    @RequiresPermissions("system:ctrlLog:export")
    @Log(title = "控制日志", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(HttpServletResponse response, SysCtrlLog sysCtrlLog)
    {
    public void export(HttpServletResponse response, SysCtrlLog sysCtrlLog) {
        List<SysCtrlLog> list = sysCtrlLogService.selectSysCtrlLogList(sysCtrlLog);
        ExcelUtil<SysCtrlLog> util = new ExcelUtil<SysCtrlLog>(SysCtrlLog.class);
        util.exportExcel(response, list, "控制日志数据");
@@ -64,8 +62,7 @@
     */
    @RequiresPermissions("system:ctrlLog:query")
    @GetMapping(value = "/{logId}")
    public AjaxResult getInfo(@PathVariable("logId") Long logId)
    {
    public AjaxResult getInfo(@PathVariable("logId") Long logId) {
        return success(sysCtrlLogService.selectSysCtrlLogByLogId(logId));
    }
@@ -75,8 +72,7 @@
    @RequiresPermissions("system:ctrlLog:add")
    @Log(title = "控制日志", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult add(@RequestBody SysCtrlLog sysCtrlLog)
    {
    public AjaxResult add(@RequestBody SysCtrlLog sysCtrlLog) {
        return toAjax(sysCtrlLogService.insertSysCtrlLog(sysCtrlLog));
    }
@@ -86,8 +82,7 @@
    @RequiresPermissions("system:ctrlLog:edit")
    @Log(title = "控制日志", businessType = BusinessType.UPDATE)
    @PutMapping
    public AjaxResult edit(@RequestBody SysCtrlLog sysCtrlLog)
    {
    public AjaxResult edit(@RequestBody SysCtrlLog sysCtrlLog) {
        return toAjax(sysCtrlLogService.updateSysCtrlLog(sysCtrlLog));
    }
@@ -96,9 +91,8 @@
     */
    @RequiresPermissions("system:ctrlLog:remove")
    @Log(title = "控制日志", businessType = BusinessType.DELETE)
    @DeleteMapping("/{logIds}")
    public AjaxResult remove(@PathVariable Long[] logIds)
    {
    @DeleteMapping("/{logIds}")
    public AjaxResult remove(@PathVariable Long[] logIds) {
        return toAjax(sysCtrlLogService.deleteSysCtrlLogByLogIds(logIds));
    }
}
se-modules/se-system/src/main/java/com/se/system/domain/SysCtrlLog.java
@@ -3,15 +3,14 @@
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.se.common.core.annotation.Excel;
import com.se.common.core.web.domain.BaseEntity;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
/**
 * æŽ§åˆ¶æ—¥å¿—对象 sys_ctrl_log
 *
 *
 * @author se
 * @date 2024-11-22
 * @date 2024-12-13
 */
public class SysCtrlLog {
    private static final long serialVersionUID = 1L;
@@ -22,15 +21,21 @@
    private Long logId;
    /**
     * è¡¨ID
     */
    @Excel(name = "表ID")
    private Long tabId;
    /**
     * æ ‡é¢˜
     */
    @Excel(name = "标题")
    private String title;
    /**
     * ç±»åž‹
     * ç±»åž‹ï¼ˆn-正常,e-错误)
     */
    @Excel(name = "类型")
    @Excel(name = "类型", readConverterExp = "n=-正常,e-错误")
    private String type;
    /**
@@ -79,6 +84,7 @@
    /**
     * å¤‡æ³¨
     */
    @Excel(name = "备注")
    private String remark;
    public void setLogId(Long logId) {
@@ -87,6 +93,14 @@
    public Long getLogId() {
        return logId;
    }
    public void setTabId(Long tabId) {
        this.tabId = tabId;
    }
    public Long getTabId() {
        return tabId;
    }
    public void setTitle(String title) {
@@ -173,6 +187,7 @@
    public String toString() {
        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
                .append("logId", getLogId())
                .append("tabId", getTabId())
                .append("title", getTitle())
                .append("type", getType())
                .append("ip", getIp())
se-modules/se-system/src/main/java/com/se/system/service/WebSocketService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,88 @@
package com.se.system.service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.atomic.AtomicInteger;
@Component
@SuppressWarnings("ALL")
@ServerEndpoint(value = "/ws/query")
public class WebSocketService {
    @PostConstruct
    public void init() {
        System.out.println("websocket åŠ è½½å®Œæˆ");
    }
    private static final Logger log = LoggerFactory.getLogger(WebSocketService.class);
    private static final AtomicInteger ONLINE_COUNT = new AtomicInteger(0);
    private final static CopyOnWriteArraySet<Session> SESSION_SET = new CopyOnWriteArraySet<Session>();
    @OnOpen
    public void onOpen(Session session) {
        SESSION_SET.add(session);
        int cnt = ONLINE_COUNT.incrementAndGet();
        log.info("有连接加入,当前连接数为:{}", cnt);
        sendMessage(session, "连接成功");
    }
    @OnClose
    public void onClose(Session session) {
        SESSION_SET.remove(session);
        int cnt = ONLINE_COUNT.decrementAndGet();
        log.info("有连接关闭,当前连接数为:{}", cnt);
    }
    @OnMessage
    public void onMessage(String message, Session session) {
        log.info("来自客户端的消息:{}", message);
        sendMessage(session, "收到消息,消息内容:" + message);
    }
    @OnError
    public void onError(Session session, Throwable error) {
        log.error("发生错误:{},Session ID: {}", error.getMessage(), session.getId());
    }
    public static void sendMessage(Session session, String message) {
        try {
            session.getBasicRemote().sendText(String.format("%s", message));
        } catch (Exception ex) {
            log.error("发送消息出错:{}", ex.getMessage());
        }
    }
    public static void broadCastInfo(String message) throws IOException {
        for (Session session : SESSION_SET) {
            if (session.isOpen()) {
                sendMessage(session, message);
            }
        }
    }
    public static void sendMessage(String message, String sessionId) throws IOException {
        Session session = null;
        for (Session s : SESSION_SET) {
            if (s.getId().equals(sessionId)) {
                session = s;
                break;
            }
        }
        if (session != null) {
            sendMessage(session, message);
        } else {
            log.info("没有找到你指定ID的会话:{}", sessionId);
        }
    }
}
se-modules/se-system/src/main/java/com/se/system/service/impl/SysStatusCtrlServiceImpl.java
@@ -2,6 +2,7 @@
import java.util.List;
import com.se.common.core.utils.DateUtils;
import com.se.system.service.WebSocketService;
import com.se.system.utils.CaffeineUtils;
import com.se.system.utils.ConnectUtils;
import com.se.system.utils.StringUtils;
@@ -128,4 +129,9 @@
        sysStatusCtrlMapper.updates(list);
    }
    private void sendMsg(String json) throws Exception {
        //String json = JSONObject.toJSONStringWithDateFormat(jsonObject, "yyyy-MM-dd HH:mm:ss", SerializerFeature.WriteMapNullValue);
        WebSocketService.broadCastInfo(json);
    }
}
se-modules/se-system/src/main/resources/mapper/system/SysCtrlLogMapper.xml
@@ -1,11 +1,12 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.se.system.mapper.SysCtrlLogMapper">
    <resultMap type="SysCtrlLog" id="SysCtrlLogResult">
        <result property="logId"    column="log_id"    />
        <result property="tabId"    column="tab_id"    />
        <result property="title"    column="title"    />
        <result property="type"    column="type"    />
        <result property="ip"    column="ip"    />
@@ -19,12 +20,13 @@
    </resultMap>
    <sql id="selectSysCtrlLogVo">
        select log_id, title, type, ip, url, method, args, msg, oper, time, remark from sys_ctrl_log
        select log_id, tab_id, title, type, ip, url, method, args, msg, oper, time, remark from sys_ctrl_log
    </sql>
    <select id="selectSysCtrlLogList" parameterType="SysCtrlLog" resultMap="SysCtrlLogResult">
        <include refid="selectSysCtrlLogVo"/>
        <where>
        <where>
            <if test="tabId != null "> and tab_id = #{tabId}</if>
            <if test="title != null  and title != ''"> and title = #{title}</if>
            <if test="type != null  and type != ''"> and type = #{type}</if>
            <if test="ip != null  and ip != ''"> and ip = #{ip}</if>
@@ -36,7 +38,7 @@
            <if test="time != null "> and time = #{time}</if>
        </where>
    </select>
    <select id="selectSysCtrlLogByLogId" parameterType="Long" resultMap="SysCtrlLogResult">
        <include refid="selectSysCtrlLogVo"/>
        where log_id = #{logId}
@@ -45,6 +47,7 @@
    <insert id="insertSysCtrlLog" parameterType="SysCtrlLog" useGeneratedKeys="true" keyProperty="logId">
        insert into sys_ctrl_log
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="tabId != null">tab_id,</if>
            <if test="title != null and title != ''">title,</if>
            <if test="type != null">type,</if>
            <if test="ip != null">ip,</if>
@@ -55,8 +58,9 @@
            <if test="oper != null">oper,</if>
            <if test="time != null">time,</if>
            <if test="remark != null">remark,</if>
         </trim>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="tabId != null">#{tabId},</if>
            <if test="title != null and title != ''">#{title},</if>
            <if test="type != null">#{type},</if>
            <if test="ip != null">#{ip},</if>
@@ -67,12 +71,13 @@
            <if test="oper != null">#{oper},</if>
            <if test="time != null">#{time},</if>
            <if test="remark != null">#{remark},</if>
         </trim>
        </trim>
    </insert>
    <update id="updateSysCtrlLog" parameterType="SysCtrlLog">
        update sys_ctrl_log
        <trim prefix="SET" suffixOverrides=",">
            <if test="tabId != null">tab_id = #{tabId},</if>
            <if test="title != null and title != ''">title = #{title},</if>
            <if test="type != null">type = #{type},</if>
            <if test="ip != null">ip = #{ip},</if>
@@ -92,7 +97,7 @@
    </delete>
    <delete id="deleteSysCtrlLogByLogIds" parameterType="String">
        delete from sys_ctrl_log where log_id in
        delete from sys_ctrl_log where log_id in
        <foreach item="logId" collection="array" open="(" separator="," close=")">
            #{logId}
        </foreach>
˵Ã÷.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
--------------------------------------------------------