前言
不知道各位小伙伴在生产环境都是怎么部署 Spring Boot 的,打成 jar 直接一键运行?打成 war 扔到 Tomcat 容器中运行?容器化部署应该是目前的主流方案。
不同于传统的单体应用,微服务由于服务数量众多,在部署的时候出问题的可能性更大,这个时候,结合 Docker 来部署,就可以很好的解决这个问题,这也是目前使用较多的方案之一。
将 Spring Boot 项目打包到 Docker 容器中部署,有很多不同的方法,今天主要来和大家聊一聊如何将 Spring Boot 项目一键打包到远程 Docker 容器,然后通过运行一个镜像的方式来启动一个 Spring Boot 项目。
至于其他的 Spring Boot 结合 Docker 的用法,大家不要着急,后续的文章,松哥会和大家慢慢的一一道来。
1. 准备工作
1.1 准备docker
我这里以 CentOS7 为例来给大家演示。
首先需要在 CentOS7 上安装好 Docker,这个安装方式网上很多,我就不多说了
Docker 安装成功之后,我们首先需要修改 Docker 配置,开启允许远程访问 Docker 的功能,开启方式很简单,修改/usr/lib/systemd/system/docker.service
文件,加入如下内容:
-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
如下图:
配置完成后,保存退出,然后重启 Docker:
1. systemctl daemon-reload
2. service docker restart
Docker 重启成功之后,Docker 的准备工作就算是 OK 了
1.2 准备IDEA
IDEA 上的准备工作,主要是安装一个 Docker 插件,点击 File->Settings->Plugins->Browse Repositories 如下:
点击右边绿色的 Install 按钮,完成安装,安装完成之后需要重启一下 IDEA。
IDEA 重启成功之后,我们依次打开 File->Settings->Build,Execution,Deployment->Docker ,然后配置一下 Docker 的远程连接地址:
配置一下 Docker 的地址,配置完成后,可以看到下面有一个 Connection successful 提示,这个表示 Docker 已经连接上了。
如此之后,我们的准备工作就算是 OK 了。
2. 准备项目
接下来我们来创建一个简单的 Spring Boot 项目(只需要引入spring-boot-starter-web依赖即可),项目创建成功之后,我们再创建一个普通的 DockerController,用来做测试,如下:
@RestController
public class DockerController {
@GetMapping("/test")
public String testDocker(){
return "hello docker";
}
}
3.配置 Dockerfile
接下来,在项目的根目录下,我创建一个 Dockerfile ,作为我镜像的构建文件,具体位置如下图:
文件内容如下:
# Spring Boot 项目的运行依赖 Java 环境,所以我自己的镜像基于 Java 镜像来构建。
FROM hub.c.163.com/library/java:latest
# 由于 Spring Boot 运行时需要 tmp 目录,这里数据卷配置一个 /tmp 目录出来
VOLUME /tmp
# 将本地 target 目录中打包好的 .jar 文件复制一份新的 到 /app.jar。
ADD target/springboot-docker-0.0.1-SNAPSHOT.jar app.jar
# 最后就是配置一下启动命令,由于我打包的 jar 已经成为 app.jar 了,所以启动命令也是启动 app.jar。
ENTRYPOINT ["java","-jar","/app.jar"]
4. 配置 Maven 插件
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<configuration>
<!--指定远程 docker api地址-->
<dockerHost>http://192.168.44.132:2375</dockerHost>
<!-- 镜像名称 -->
<imageName>${docker.image.prefix}/${project.artifactId}</imageName>
<!-- 镜像版本 -->
<imageTags>
<imageTag>${project.version}</imageTag>
</imageTags>
<!-- 指定 Dockerfile 路径-->
<dockerDirectory>${project.basedir}</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<!--用于指定需要复制的根目录,${project.build.directory}表示target目录-->
<directory>${project.build.directory}</directory>
<!--用于指定需要复制的文件。${project.build.finalName}.jar指的是打包后的jar包文件。-->
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>