1.背景
随着微服务拆分开来,伴随着服务数量变多涉及到管理问题。比如很多常见的管理界面。Nacos的管理界面。熔断限流的管理界面。以及docker的管理等。所以一个专门管理各种运维的微服务是必要的。
2.明确功能
1.解决docker管理的痛点。比如说启动容器。关闭容器等。直接使用命令行操作的话略显麻烦。对于java boy来说能用java解决就不用命令行了。我们选用docker -java来完成相关来操作java。然后前端管理页面选用iframe嵌套各个微服务提供的包。比如 nacos 提供的包。嵌套进入后台管理系统来完成
还是用到了dockerfile 打包镜像。当时使用sentinel-dashboard的时候使用的是java命令行启动的。将其打包。然后放入docker容器一起管理。
3.操作步骤
3.1 添加依赖
<dependency>
<groupId>com.github.docker-java</groupId>
<artifactId>docker-java</artifactId>
<version>3.2.5</version>
</dependency>
<dependency>
<groupId>com.github.docker-java</groupId>
<artifactId>docker-java-transport-okhttp</artifactId>
<version>3.2.5</version>
</dependency>
3.2 工具类
操作docker的需要这两个依赖。然后添加工具类
package com.rose.util;
import com.github.dockerjava.api.DockerClient;
import com.github.dockerjava.api.command.LoadImageCmd;
import com.github.dockerjava.api.command.PullImageCmd;
import com.github.dockerjava.api.model.*;
import com.github.dockerjava.core.DockerClientBuilder;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
/**
* @author rose
* @create 2022/11/5
*/
public class DockerProtocol{
public DockerClient connectDocker(){
DockerClient dockerClient = DockerClientBuilder.getInstance("tcp://192.168.56.20:2375").build();
Info info = dockerClient.infoCmd().exec();
return dockerClient;
}
//开始容器
public void startContainer(DockerClient client,String containerId){
client.startContainerCmd(containerId).exec();
}
//停止容器
public void stopContainer(DockerClient client,String containerId){
client.stopContainerCmd(containerId).exec();
}
//加载镜像
public LoadImageCmd loadImage(DockerClient client, String filePath){
LoadImageCmd loadImageCmd = null;
try {
loadImageCmd = client.loadImageCmd(new FileInputStream(filePath));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return loadImageCmd;
}
/**
* repository 镜像名称:tag名称
**/
public PullImageCmd pullImage(DockerClient client, String repository){
PullImageCmd pullImageCmd = client.pullImageCmd(repository);
return pullImageCmd;
}
//删除镜像
public void removeImage(DockerClient client,String imageId){
client.removeImageCmd(imageId).exec();
}
public static void main(String[] args) {
DockerProtocol docker = new DockerProtocol();
DockerClient dockerClient = docker.connectDocker();
docker.startContainer(dockerClient,"21e7d7460196");
// docker.startContainer(dockerClient,"38dc3681aa87");
// docker.stopContainer(dockerClient,"38dc3681aa87");
}
}
这里面防止了一些常用的工具类。还有就是为了更好的与web继承。需要引入springboot 依赖。
有一个依赖需要注意一下。
<dependency>
<groupId>com.rose.yan</groupId>
<artifactId>common</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
<exclusions>
<exclusion>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
</exclusion>
<exclusion>
<groupId>javax.ws.rs</groupId>
<artifactId>jsr311-api</artifactId>
</exclusion>
</exclusions>
</dependency>
我的项目是这个common包里面包含了很多的服务发现服务注册和熔断限流等功能。但是其中一个包有冲突。需要将javax.ws.rs这个排除掉。否则web端调用的时候会出现调用不通的问题。
3.3 controller层的调用方法
/**
* 启动容器.
* @return
*/
@GetMapping("/containerStart")
public GenericResponse containerStart(@RequestParam("type") String file) {
try {
DockerProtocol dockerProtocol = new DockerProtocol();
DockerClient dockerClient = dockerProtocol.connectDocker();
if(ContainerId.RABBITMQ.equals(file)){
dockerProtocol.startContainer(dockerClient, ContainerId.RABBIT_ID);
}
if(ContainerId.REDIS.equals(file)){
dockerProtocol.startContainer(dockerClient, ContainerId.REDIS_ID);
}
return GenericResponse.response(ServiceError.NORMAL);
}catch(Exception e){
return GenericResponse.response(ServiceError.DevopsError);
}
}
4. dockerfile 构建镜像
每次本地启用sentinel 太过于麻烦。所以采用docker镜像管理 更方便的使用。
4.1 第一步 自己构建docker镜像
#java 版本
FROM java:8
##挂载的docker卷
VOLUME /tmp
#前者是要操作的jar包 后者自定义jar包名
ADD *.jar sentinel-dashboard.jar
#定义时区参数
ENV TZ=Asia/Shanghai
#设置时区
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo '$TZ' > /etc/timezone
#配置启动命令,-D表示设置JVM参数
ENTRYPOINT ["java","-jar","-Dserver.port=8858","-Dcsp.sentinel.dashboard.server=172.18.181.35:8858","-Dproject.name=sentinel-dashboard","/sentinel-dashboard.jar"]
4.2 在目录下面输入命令
docker build -t saas/collectcode/sentinel-dashboard .(镜像名称自行定义)
4.3启动镜像
docker run --name collectcode_sentinel --restart=always --privileged=true -p 8858:8858 -d saas/collectcode/sentinel-dashboard
访问端口