JAVA开发Docker容器下自动更新镜像仓库的工具
前段时间在做一套分布式多租户系统,它包括控制平台和应用服务器两部分,应用服务器为企业客户服务,系统会为每家企业建立一个应用服务器实例,它存在于容器中,控制平台用于管理所有的应用服务器引流和访问控制(本文不是重点)。系统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
实现源代码
发布工具类PubTool.java
public class PubTool {
public static void main(String[] args) {
String res=exeCmd("docker ps");
String arr[]=res.split("\n");
List<DockerEntity> dockerEntities=new ArrayList<>();
for(int i=0;i<arr.length;i++) {
if(i==0)
continue;
String []runDockerinfo=arr[i].split(" ");
String dockerRealInfo[]=new String [8];
int temmindex=0;
for(int j=0;j<runDockerinfo.length;j++){
runDockerinfo[j]=runDockerinfo[j].replaceAll(" ","").replaceAll(" ","").replaceAll("\t","");
if(!runDockerinfo[j].equals(" ")&&!runDockerinfo[j].equals("")) {
dockerRealInfo[temmindex++] = runDockerinfo[j];
System.out.print(j + ": " + runDockerinfo[j] + " ;");
}
}
DockerEntity dockerEntity=new DockerEntity(dockerRealInfo);
dockerEntities.add(dockerEntity);
System.out.println("\nGet docker datas: "+dockerRealInfo[0]);
if(dockerEntity.getImage().contains("hyj")){
System.out.println("stop container "+dockerEntity.getContainer());
String res1=exeCmd("docker stop "+dockerEntity.getContainer());
System.out.println(res1);
System.out.println("rm container "+dockerEntity.getContainer());
String res2=exeCmd("docker rm "+dockerEntity.getContainer());
System.out.println(res2);
// docker run -d -p 8888:8080 harbor.hyj.com/imes/imes:2.2.61
System.out.println("start container ");
String portstr=dockerEntity.getPort();
portstr=portstr.substring(portstr.indexOf(':')+1,portstr.indexOf(':')+11);
String res3=exeCmd("docker run -d -p "+portstr.replaceAll("->",":")+" "+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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)