Docker自动从Harbor下更新镜像

JAVA开发Docker容器下自动更新镜像仓库的工具

Docker自动从Harbor下更新镜像_第1张图片
前段时间在做一套分布式多租户系统,它包括控制平台和应用服务器两部分,应用服务器为企业客户服务,系统会为每家企业建立一个应用服务器实例,它存在于容器中,控制平台用于管理所有的应用服务器引流和访问控制(本文不是重点)。系统V1版发布后,运维将jar包打成镜像,再将镜像push 到harbor服务器中,应用服务器再从harbor服务器拉取镜像实例,放到docker容器运行,命令为:

    docker pull harbor.hyj.com/imes/imes:2.2.62            #拉取新版本镜像
	docker run -d -p 8888:8080 harbor.hyj.com/imes/imes:2.2.62	   		 #实例容器,并启动

当有新版本jar包发布后,需将原容器停掉,再另外新启一个容器

  docker pull harbor.hyj.com/imes/imes:2.2.62            #拉取新版本镜像
  docker ps            #查看所有运行容器信息
  docker stop containid           #停止运行容器
  docker rm containid           #删除已运行容器
  docker run -d -p 8888:8080 harbor.hyj.com/imes/imes:2.2.62   		 #重新拉取新版本容器镜像

规模变大

现假设镜像imes在docker下部署了N个容器实例,当镜像版本更新后,若要更新原有服务器容器,需对每个容器实例进行docker stop->docker rm->docker start的一系列操作,同时确保和原端口一致,并重复操作N次,原命令:

容器A:

docker stop container1A
docker rm container1A
docker run ....... 

容器2:

docker stop container1B
docker rm container1B
docker run ....... 

容器N

docker stop container1N
docker rm container1N
docker run ....... 

如此下去,运维工作非常麻烦

解决工具

为了节省运维的时间,以上过程可通过PubTool.jar一键提交,让计算机自己去完成替换N个容器的操作:
使用PubTool.jar的前提,linux系统下,服务器具备java环境
例如:imes应有服务镜像已部署容器如下:
在这里插入图片描述
现开发人员已对imes进行版本升级,升级到imes:2.2.62,需更新所有的容器服务器,输入如下命令:
java -jar PubTool.jar harbor.hyj.com/imes/imes:2.2.62
Docker自动从Harbor下更新镜像_第2张图片

实现源代码

发布工具类PubTool.java

public class PubTool {
    public static void main(String[] args) {
        String res=exeCmd("docker ps");
        String arr[]=res.split("\n");
        List dockerEntities=new ArrayList<>();
        for(int i=0;i",":")+" "+args[0]);
                System.out.println(res3);
            }
        }

    }
    public static String exeCmd(String commandStr) {

        String result = null;
        try {
            String[] cmd = new String[]{"/bin/sh", "-c",commandStr};
            Process ps = Runtime.getRuntime().exec(cmd);

            BufferedReader br = new BufferedReader(new InputStreamReader(ps.getInputStream()));
            StringBuffer sb = new StringBuffer();
            String line;
            while ((line = br.readLine()) != null) {
                //执行结果加上回车
                sb.append(line).append("\n");
            }
            result = sb.toString();


        } catch (Exception e) {
            e.printStackTrace();
        }

        return result;

    }

}

运行容器基本信息存储类DockerEntity

public class DockerEntity {
    String container ;
    String image;
    String command;
    String created;
    String status;
    String port;
    String names;

    public DockerEntity(String []arr){
        container=arr[0];
        image=arr[1];
        command=arr[2];
        created=arr[3];
        status=arr[4];
        port=arr[5];
        names=arr[6];
    }
    public String getContainer() {
        return container;
    }

    public void setContainer(String container) {
        this.container = container;
    }

    public String getImage() {
        return image;
    }

    public void setImage(String image) {
        this.image = image;
    }

    public String getCommand() {
        return command;
    }

    public void setCommand(String command) {
        this.command = command;
    }

    public String getCreated() {
        return created;
    }

    public void setCreated(String created) {
        this.created = created;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getPort() {
        return port;
    }

    public void setPort(String port) {
        this.port = port;
    }

    public String getNames() {
        return names;
    }

    public void setNames(String names) {
        this.names = names;
    }

    public static void main(String[] args) {
        System.out.println(":8886->8080".substring("sdadsads:8886->8080".indexOf(':')+1,10).replace("->",":"));
    }
}

如有疑问或建议,请联系我,QQ:2414941795

你可能感兴趣的:(Docker自动从Harbor下更新镜像)