Docker前后端管理帮助文档(1)
一、配置文件
1.错误拦截
1.1 控制登入权限
获取HttpServletRequest 请求,返回HttpServletResponse
public class LoginHandlerInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Object loginUser = request.getSession().getAttribute("loginUser");
if(loginUser==null){
request.setAttribute("msg","没有权限,请登陆");
request.getRequestDispatcher("/index.html").forward(request,response);
return false;
}else {
return true;
}
}
}
1.2 重命名视图
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("index");
registry.addViewController("/index.html").setViewName("index");
registry.addViewController("/main.html").setViewName("dashboard");
}
@Bean
public LocaleResolver localeResolver(){
return new MyLocaleResolver();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginHandlerInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/index.html","/","/user/login","/css/*","/img/*","/js/*");
}
}
二、后端设计
2.1 Docker获取服务器本地的镜像
public Collection<String> getImages(){
ResponseEntity<String> resp = restTemplate.getForEntity("http://localhost:2375/images/json", String.class);
JSONArray jsons = JSONArray.parseArray(resp.getBody());
for (int i = 0; i < jsons.size(); i++) {
JSONObject obj = jsons.getJSONObject(i);
JSONArray img = obj.getJSONArray("RepoTags");
String image = (String)img.get(0);
res.add(image);
}
return res;
}
2.2 新建Container
public void createContainer(ContainerCreate containerCreate){
int availableCpus =hostMapper.queryCpusByServerIp(containerCreate.getServerIp());
String cpus = makeRandom(0, availableCpus, containerCreate.getCpus());
String createJsonString = "{ \"Hostname\": \"\", \"Domainname\": \"\", \"privileged\":true,\"OpenStdin\":true,\"User\": \"\",\"Tty\": true, \"Image\":\"%s\",\"HostConfig\": {\"CpusetCpus\":\"%s\",\"Memory\":%d}}";
createJsonString = String.format(createJsonString, containerCreate.getImage(), cpus, containerCreate.getMemory());
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity httpEntity = new HttpEntity(createJsonString,headers);
String url =String.format("http://%s:2375/containers/create?name=",containerCreate.getServerIp())+containerCreate.getName();
ResponseEntity<String> strbody = restTemplate.postForEntity(url,httpEntity,String.class);
JSONObject createResponse = (JSONObject)JSONObject.parse(strbody.getBody());
String id = (String)createResponse.get("Id");
String resultId = id.substring(0,12);
String networkConnectJsonString = "{\"Container\": \"%s\",\"EndpointConfig\": {\"IPAMConfig\": {\"IPv4Address\": \"%s\"}}}";
networkConnectJsonString = String.format(networkConnectJsonString,resultId,containerCreate.getIp());
HttpEntity networkhttpEntity = new HttpEntity(networkConnectJsonString,headers);
String networkUrl =String.format("http://%s:2375/networks/myNet/connect",containerCreate.getServerIp());
ResponseEntity<String> networkBody = restTemplate.postForEntity(networkUrl,networkhttpEntity,String.class);
}
2.2.1 makeRandom
功能:makeRandom从x-y中的数中随机找出num个不同的数,返回给integer的动态数组中
public String makeRandom(int x, int y, int num) {
//创建一个integer的动态数组
ArrayList<Integer> a = new ArrayList<Integer>();
int index = 0;
//往数组里面逐一加取到不重复的元素
while(index < num)
{
//产生x-y的随机数
Random r = new Random();
int temp = r.nextInt(y-x)+x ;
//设置是否重复的标记变量为false
boolean flag = false;
for(int i =0; i<index;i++)
{
if(temp == a.get(i))
{
flag = true;
break;
}
}
if(flag==false)
{
a.add(temp);
index++;
}
}
Collections.sort(a);
return StringUtils.join(a, ",");
}
2.3 新建停止删除容器
public void startContainer(String serverIp,String name){
String url =String.format("http://%s:2375/containers/%s/start",serverIp,name);
ResponseEntity<String> resp = restTemplate.getForEntity(url, String.class);
JSONObject json = (JSONObject)JSONArray.parse(resp.getBody());
}
public void stopContainer(String serverIp,String name){
String url =String.format("http://%s:2375/containers/%s/stop",serverIp,name);
ResponseEntity<String> resp = restTemplate.getForEntity(url, String.class);
JSONObject json = (JSONObject)JSONArray.parse(resp.getBody());
}
public int deleteContainer(String serverIp,String name){
String url = String.format("http://%s:2375/containers/%s",serverIp,name);
ResponseEntity<String > response = restTemplate.exchange(url, HttpMethod.DELETE, null, String .class, new HashMap<>());
//解析返回的数据
int status = response.getStatusCodeValue();
return status;
}
2.4 Http session获取
public static HttpSession getSession(){
//获取到ServletRequestAttributes 里面有
ServletRequestAttributes attrs = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
//获取到Request对象
HttpServletRequest request = attrs.getRequest();
//获取到Session对象
HttpSession session = request.getSession();
//获取到Response对象
//HttpServletResponse response = attrs.getResponse();
return session;
}
2.5 获取当前用户的容器列表
model可返回给前端的模型,前端可以直接获取到model里面的Key,value
public String list(Model model){
HttpSession session = HttpUtil.getSession();//获取seesion全局数据
List<ContainerCreate> allContainer = containerCreateMapper.queryContainerList((String)session.getAttribute("loginUser"));
model.addAttribute("allContainer",allContainer);
return "container/list";
}
2.6 获取容器状态
public Status getStatus(String serverIp,String name){
String url = String.format("http://%s:2375/containers/%s/stats?stream=false",serverIp, name);
ResponseEntity<String> resp = restTemplate.getForEntity(url, String.class);
JSONObject json = (JSONObject) JSONObject.parse(resp.getBody());
long total_usage =Long.parseLong(json.getJSONObject("cpu_stats").getJSONObject("cpu_usage").get("total_usage").toString());
long pre_total_usage =Long.parseLong(json.getJSONObject("precpu_stats").getJSONObject("cpu_usage").get("total_usage").toString());
long cpu_delta = total_usage-pre_total_usage;
long system_cpu_usage = (long)json.getJSONObject("cpu_stats").get("system_cpu_usage");
long pre_system_cpu_usage = (long)json.getJSONObject("precpu_stats").get("system_cpu_usage");
long system_cpu_delata = system_cpu_usage-pre_system_cpu_usage;
// containerCreateMapper.
double percentCPU = (double) cpu_delta/system_cpu_delata*2*100;
long memory_usage =Long.parseLong(json.getJSONObject("memory_stats").get("usage").toString());
long cache_usage = Long.parseLong(json.getJSONObject("memory_stats").getJSONObject("stats").get("cache").toString());
long available_memory =Long.parseLong(json.getJSONObject("memory_stats").get("limit").toString());
long used_memory = memory_usage-cache_usage;
double perncentMemory = (double)used_memory/available_memory*100;
Status status = new Status();
status.setPercentCpu(String.format("%.4f",percentCPU)+"%");
status.setPercentMemory(String.format("%.4f",perncentMemory)+"%");
return status;
}