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;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

普朗克的小铁拳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值