java实现Linux(centos) 中docker容器下命令交互的代码(配置向导)

开发需求: 因系统程序部署时,经常是拆分部署(多台机器) ,手工部署费时费力,且每次都要手工配置系统参数(系统提供配置向导)。

如下图所示:

1)进行main容器 -> 2)执行系统配置向导 -> 3)选择服务器模式 -> 4) 选择web控制台....然后进行具体的服务器IP设置。

为了解放双手,用java实现了Linux(centos) 下docker 应用程序的命令交互。

具体代码如下:

import java.io.*;

/**
 * @author by dujiajun
 * @date 2021/4/29.
 */
public class TestMain extends Thread{

    //进入docker main
    private static String [] cmds = {"docker","exec","-i","main","bash"};
    private Process pro;

    //初始化各机器IP信息
    private String role = "";
    private String webIp = "";
    private String redisIp = "";
    private String beanstalkdIp = "";
    private String pgIp = "";

    //main应用重启
    public static String [] cmdRestart = {"/bin/sh","-c","docker restart main"};

    public void cmdRun(String[] machines) throws Exception {
        //执行xx系统配置向导命令并生成进程
        //pro = Runtime.getRuntime().exec(cmds);
        ProcessBuilder pb = new ProcessBuilder(cmds);
       /* pb.inheritIO();
        pb.redirectErrorStream(true);*/
        pro = pb.start();
        System.out.println("执行前pro1:" + pro.isAlive());

        //解析machines信息
        if (machines.length > 0) {
            for (int i = 0; i < machines.length; i++) {
                int strEndIndex = machines[i].indexOf(":");
                String str = machines[i].substring(0, strEndIndex);
                String content = machines[i].substring(strEndIndex + 1);
                switch (str.trim()) {
                    case "role":
                        role = content;
                        break; //web服务器IP
                    case "webIp":
                        webIp = content;
                        break;  //redis服务器IP
                    case "redisIp":
                        redisIp = content;
                        break;  //redis服务器IP
                    case "beanstalkdIp":
                        beanstalkdIp = content;
                        break; //beanstalkd服务器IP
                    case "pgIp":
                        pgIp = content;
                        break; //beanstalkd服务器IP
                    default:
                        break;
                }
            }
        }

        new Thread() {
            public void run() {
                try (BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(pro.getOutputStream()))) {
                    if (role != null && role.equals("web-server")) {//系统web控制台
                        System.out.println("*********进入web控制台配置向导*********");
                        //系统配置向导命令集-web
                        String[] strCmdWeb = {
                                "python /opt/tools/skylar_cli/bin/skylar_cli.pyc",//系统配置向导
                                "server-type", //服务器模式
                                "web-server", //管理服务器:提供管理功能及应用功能
                                "allow-deploy-api-server 0", //设置是否允许部署应用服务器 1允许 0不允许
                                "cache-info " + redisIp + ":6379", //缓存服务器
                                "db-info " + pgIp + ":5432", //设置数据库信息
                                "queue-info " + beanstalkdIp + ":11300", //设置队列信息
                                "report-server-db-info " + pgIp + ":5432", //设置报表数据库
                                "sfmg-db-info " + pgIp + ":5432", //设置软件管家数据库
                                "web-server-port " + webIp + ":8080",//设置管理服务器端口
                                "commit",//提交
                                "exit"
                        };

                        //查看进程是否还存活
                        System.out.println("执行前pro2:" + pro.isAlive());
                        for (String strWeb : strCmdWeb) {
                            synchronized (bw) {
                                bw.write(strWeb.trim());
                                bw.newLine();
                                System.out.println("step: " + strWeb);
                                bw.wait(1000);
                            }
                        }

                        //查看进程是否还存活
                        System.out.println("pro3:" + pro.isAlive());
                        bw.flush();//缓存提交
                        System.out.println("缓存提交!");
                        bw.close();
                        System.out.println(" bw.close();");
                        System.out.println("web配置向导设置成功!");

                    } else if (role != null && role.equals("api-server")) {//系统app应用
                        //系统配置向导命令集-APP
                        System.out.println("*********进入APP服务器控制台配置向导*********");
                        String[] strCmdApp = {
                                "python /opt/tools/skylar_cli/bin/skylar_cli.pyc",//系统配置向导
                                "server-type", //服务器模式
                                "api-server", //APP服务器
                                "cache-info " + redisIp + ":6379", //缓存服务器
                                "db-info " + pgIp + ":5432", //设置数据库信息
                                "queue-info " + beanstalkdIp + ":11300", //设置队列信息
                                "web-server-info " + webIp + ":8080", //设置管理服务器端口
                                "commit",//提交配置
                                "exit"
                        };

                        for (String str : strCmdApp) {
                            synchronized (bw) {
                                bw.write(str.trim());
                                bw.newLine();
                                System.out.println("step: " + str);
                                bw.wait(1000);
                            }
                        }
                        //查看进程是否还存活
                        System.out.println("pro3:" + pro.isAlive());
                        bw.flush();//缓存提交
                        System.out.println("缓存提交!");
                        System.out.println("app配置向导设置成功!");
                        bw.close();

                    } else if (role != null && role.equals("log-analyze-server")) {//系统日志分析服务器
                        //系统配置向导命令集-log-analyze-server
                        System.out.println("*********进入日志分析服务器控制台配置向导*********");
                        String[] strCmdLog = {
                                "python /opt/tools/skylar_cli/bin/skylar_cli.pyc",//天擎配置向导
                                "server-type", //服务器模式
                                "log-analyze-server", //管理服务器:提供管理功能及应用功能
                                "cache-info " + redisIp + ":6379", //缓存服务器
                                "db-info " + pgIp + ":5432", //设置数据库信息
                                "queue-info " + beanstalkdIp + ":11300", //设置队列信息
                                "web-server-info " + webIp + ":8080", //设置管理服务器端口
                                "sfmg-db-info " + pgIp + ":5432", //设置软件管家数据库
                                "commit",//提交配置
                                "exit"

                        };

                        //顺序执行配置向导命令
                        for (String str : strCmdLog) {
                            synchronized (bw) {
                                bw.write(str.trim());
                                bw.newLine();
                                System.out.println("step: " + str);
                                bw.wait(1000);
                            }
                        }
                        //测试进程是否还存活
                        System.out.println("pro3:" + pro.isAlive());
                        bw.flush();//缓存提交
                        System.out.println("缓存提交!");
                        System.out.println("日志分析服务器配置向导设置成功!");
                        bw.close();
                    }

                } catch (IOException | InterruptedException e) {
                    //pro.destroyForcibly();
                    e.printStackTrace();
                    //pro.destroy();
                    System.out.println("e.getMessage(): " + e.getMessage());
                } finally {
                    try {
                        Process process = Runtime.getRuntime().exec(cmdRestart);//重启main
                        System.out.println("process.isAlive:" + process.isAlive());
                        System.out.println("重启main成功!");
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }.start();

        new Thread(){
            public void run(){
                BufferedReader br = new BufferedReader(new InputStreamReader(pro.getErrorStream()));
                String cmdout = "";
                try {
                    cmdout = br.readLine();
                    while(cmdout!= null&&(!cmdout.equals("exit"))){
                        System.out.println(cmdout);
                    }
                } catch (IOException e) {
                    //System.out.println("br:pro.destroy();");
                    //pro.destroy();
                    e.printStackTrace();
                    System.out.println("e.printStackTrace();");
                }
                try {
                    System.out.println(" br.close();");
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }.start();
        pro.waitFor();//进程等待
    }

    public static void main(String[] args) throws Exception {

        TestMain testMain = new TestMain();

        /*
        //测试用
        String[] machines ={
                "role:web-server",
                "webIp:xx.xx.xx.110",
                "redisIp:xx.xx.xx.211",
                "beanstalkdIp:xx.xx.xx.211",
                "pgIp:xx.xx.xx.212"
        };*/

        testMain.cmdRun(args);
       /* System.exit(0);
        System.out.println("System.exit(0);");*/
    }
}

特别注意:

 private static String [] cmds = {"docker","exec","-i","main","bash"};

一定要使用 docker exec -i main bash ,不要使用 -it ,否则会报错 cannot enable tty mode on non tty input。

Usage: docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

Run a command in a running container

  -i, --interactive=false    Keep STDIN open even if not attached
  -t, --tty=false            Allocate a pseudo-TTY

打成jar包,执行jar包:

终于看到久违的部署成功界面~

到此这篇关于java实现Linux(centos) 中docker容器下命令交互(配置向导)的文章就介绍到这了,更多相关docker容器命令交互内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 基于spring-boot和docker-java实现对docker容器的动态管理和监控功能[附完整源码下载]

    docker简介 Docker 是一个开源的应用容器引擎,和传统的虚拟机技术相比,Docker 容器性能开销极低,因此也广受开发者喜爱.随着基于docker的开发者越来越多,docker的镜像也原来越丰富,未来各种企业级的完整解决方案都可以直接通过下载镜像拿来即用.因此docker变得越来越重要. 本文目的 本文通过一个项目实例来介绍如果通过docker对外接口来实现对docker容器的管理和监控. 应用场景: 对服务器资源池通过docker进行统一管理,按需分配资源和创建容器,达到资源最大化利

  • Docker中Dockerfile之容器中运行MyEclipse搭建的JavaWeb项目

    这篇文章将讲述如何将上一篇文章中的Javaweb项目制作成Docker的镜像.小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 应用程序在Docker容器中运行和在物理机运行的原理是一样的,所以我们部署这个Javaweb项目到Docker中的步骤应该如下: 服务器支持(这里选择Centos7) 安装Java环境 安装Tomcat环境 将Tomcat根目录下的webapps/ROOT目录下的所有文件(夹)删除 将自己开发的web项目的WebRoot目录下的所有文件(夹)复

  • java实现Linux(centos) 中docker容器下命令交互的代码(配置向导)

    开发需求: 因系统程序部署时,经常是拆分部署(多台机器) ,手工部署费时费力,且每次都要手工配置系统参数(系统提供配置向导). 如下图所示: 1)进行main容器 -> 2)执行系统配置向导 -> 3)选择服务器模式 -> 4) 选择web控制台....然后进行具体的服务器IP设置. 为了解放双手,用java实现了Linux(centos) 下docker 应用程序的命令交互. 具体代码如下: import java.io.*; /** * @author by dujiajun * @

  • 阿里云Linux CentOS 7 Docker部署使用gogs搭建自己的git服务器

    一.前言 Git是目前优秀和流行的源代码管理工具.而GitHub是一个面向开源及私有软件项目的托管云平台,但开源免费,私有收费.而公司出于商业化等目的需要搭建自己的源代码托管服务器.通过网上了解Gogs是一款不错git管理系统,而且是国内开源项目,今天我们就使用Gogs基于阿里云Linux CentOS 7 Docker部署搭建自己的git服务器. Gogs介绍(官网):https://gogs.io/ 二.步骤 1.  购买一个阿里云服务器,系统选择Linux CentOS 7 2.  doc

  • docker容器下配置jupyter notebook的操作

    docker容器下配置jupyter notebook,主要是为了编写python代码,更具体点是做深度学习的开发. jupyter web形式最高效的使用方式就是部署在云上,不管是cpu云服务器还是gpu的云服务器,都能快速启动使用. 而docker的出现又方便了很多在部署使用上. - 安装 docker docker分为docker CE和docker EE,一般使用docker CE(社区版本). docker可以在Linux(ubuntu.centos).MacOS.Windows或者树

  • Docker容器下运行Nginx并实现反向代理

    目录 一.前言 二.运行Nginx容器 1.获取Nginx镜像 2.运行Nginx容器 三.运行ASP.NET Core应用程序 1.构建ASP.NET Core应用程序镜像 2.运行应用容器 三.设置反向代理 一.前言 我们知道,为了安全考虑,我们一般会设置反向代理,用来屏蔽应用程序真实的IP和端口号.在Linux系统上最常用的反向代理就是Nginx.本篇文章中,我们会通过Docker容器分别运行一个Nginx容器和一个ASP.NET Core应用程序的容器,然后设置反向代理. 二.运行Ngi

  • centos中NAT模式下静态IP连接外网

    使用linux虚拟机时,通常会用到yum命令来安装软件,然而这个命令需要连外网下载软件,用maven下载jar包也需要外网.虚拟机在内网可以互相ping通,然而ping不了外网,于是通过试验,终于找到了解决方案: 1.在物理机的cmd命令行中,使用ipconfig命令,查看IP配置,由图可知,物理机的子网IP是192.168.0.0,子网掩码是255.255.255.0,网关是192.168.0.1 C:\Users\huanongying>ipconfig 2.关闭将要配置IP的虚拟机,然后在

  • 分享8个基本的Docker容器管理命令

    前言: 在这篇文章中,我们将带你学习 8 个基本的 Docker 容器命令,它们操控着 Docker 容器的基本活动,例如 运行run. 列举list. 停止stop. 查看历史纪录logs. 删除delete 等等.文末福利! 利用这 8 个命令可以学习 Docker 容器的基本管理方式.这是一个为 Docker 初学者准备的,带有示范命令输出的指南. 在这篇文章中,我们将带你学习 8 个基本的 Docker 容器命令,它们操控着 Docker 容器的基本活动,例如 运行run. 列举list

  • 在Linux系统中如何使用ls命令按日期对文件进行排序

    ls命令用于列出目录内容,结果可以按几个条件排序,例如按日期,按字母顺序排列的文件名,修改时间,访问时间,版本和文件大小. 在本文中,我将向您展示如何使用Linux中的ls命令按日期对文件进行排序. 1)列出具有上次修改日期/时间的文件目录 要列出文件并在顶部显示最后修改的文件,我们将使用-lt选项和ls命令. [linuxidc@localhost www.linuxidc.com]$ ls -lt /run 输出如下: 总用量 60 -rw-rw-r--. 1 root utmp 1536

  • linux环境中常用的mysql命令介绍

    进入mysql命令: mysql -u+(用户名) -p+(密码 ) mysql语句命令后面一定要加":" 查询库名: show databases: 修改库: use 库名: 创建库: create database [if not exists][库名]; 查询创建库: show create database [库名]; 查询创建表: show create table [表名]: 查询表: desc [表名]: 查询当前所使用的库: select database(): 创建表

  • linux CentOS 系统php和mysql命令加入到环境变量中

    在Linux CentOS系统上安装完php和MySQL后,为了使用方便,需要将php和mysql命令加到系统命令中,如果在没有添加到环境变量之前,执行"php -v"命令查看当前php版本信息时时,则会提示命令不存在的错误,下面我们详细介绍一下在linux下将php和mysql加入到环境变量中的方法(假设php.mysql和apache分别安装在/phpstudy/server/php/./phpstudy/server/mysql/和/phpstudy/server/php/中).

  • 解决Docker容器下不能使用vim命令的问题

    在使用docker容器时,有时候里边没有安装vim,敲vim命令时提示说:vim: command not found,如图所示: 这时候就需要安装vim. 可是当你敲apt-get install vim命令时,提示: Reading package lists... Done        Building dependency tree               Reading state information... Done        E: Unable to locate pa

随机推荐