本文主要讲解基于docker使用java代码去部署项目。
准备:
1、在需要自动化部署的机器上安装docker,并开启2375端口,(开启2375端口是为了供外部基于 客户端/服务器 的形式去访问,否则只能在当前机器上使用cmd去访问docker了)
2、docker安装的服务器上安装安全证书,可选。具体原因参考:https://blog.csdn.net/qq_34043421/article/details/80123339
我们为了方便操作docker服务器,采用了客户端服务器的形式访问docker。下面就来讲讲如何通过这种方式通过java代码远程部署我们的java项目。
我们首先需要引入用于连接docker的依赖库:
<dependency>
<groupId>com.github.docker-java</groupId>
<artifactId>docker-java</artifactId>
<version>3.2.1</version>
</dependency>
部署流程:
1、远程连接docker服务器,建立连接。这里是地址对应的是就是服务器端docker地址。
DockerClient dockerClient = DockerClientBuilder.getInstance("tcp://localhost:2375").build();
2、pull拉取远程镜像(因此,在此之前你需要先制作出一个镜像并push到仓库中)。需要注意的是,我们在pull时候不要重复去拉取,所以做了次判断。
final List<Image> images = dockerClient.listImagesCmd().exec();
final Optional<Image> tradeImgOp = images.stream()
.filter(img -> ArrayUtils.contains(img.getRepoTags(),
"你的镜像地址:版本号"))
.findFirst();
if(!tradeImgOp.isPresent()){
//镜像已经下载好了,不重新下载
//1.pull镜像地址
dockerClient.pullImageCmd("你的镜像地址")
.withTag("版本号")
.start()
.awaitCompletion();
}
3、创建镜像对应的容器,我们以springboot项目为例,我们在部署后希望挂载springboot对应的yaml文件和日志文件。
//3.启动docker容器,并与宿主机器挂载配置文件、日志文件
Ports portBindings = new Ports();
//映射8080端口
portBindings.bind(ExposedPort.tcp(8080), Ports.Binding.bindPort(8080));
checkContainer(dockerClient);
final CreateContainerResponse containerResponse = dockerClient.createContainerCmd(deployInfo.getImgUrl()+":"+deployInfo.getVersion())
.withHostConfig(new HostConfig().withPortBindings(portBindings)
.withBinds(new Bind("宿主机器配置文件目录",
new Volume("docker容器对应的配置文件目录")), new Bind("宿主机器日志文件目录",
new Volume("docker容器对应的日志文件目录"))))
.withName("hello")
.withExposedPorts(new ExposedPort(8080))
.exec();
/**
* 检查相应的容器是否已经有了,如果已经有了,先移除他再重新部署。
* @param dockerClient
*/
private void checkContainer(DockerClient dockerClient) {
final List<Container> containers = dockerClient.listContainersCmd().exec();
final Optional<Container> containerOp = containers.stream().filter(e -> ArrayUtils.contains(e.getNames(),"/" + "hello")).findFirst();
if(hTradeContainerOp.isPresent()){
final Container container = hTradeContainerOp.get();
if(container.getState().equals("running")){
//容器正在运行状态,停止他
dockerClient.stopContainerCmd("hello").exec();
}
//移除已有的容器
dockerClient.removeContainerCmd("hello").exec();
}
}
4、启动容器。
dockerClient.startContainerCmd(containerResponse.getId()).exec();
此时在浏览器,输入对应的接口地址,即可访问成功。
网友评论