一键部署Spring Boot到远程Docker容器

在当今软件开发领域,应用程序的容器化部署已经成为一种流行的选择,Docker 提供了一个强大的容器化解决方案。

将 Spring Boot 项目打包到 Docker 容器中部署,有很多不同的方法,今天就和大家聊一聊如何将Spring Boot 项目一键打包到远程 Docker 容器,然后通过运行一个镜像的方式来启动一个 Spring Boot 项目

1. Docker安装

我这里使用的CentOS7安装Docker,之前以及介绍过了,这里就不详细介绍,大家可以自行去查看如何安装Docker

Docker 安装成功之后,需要修改 Docker 配置,开启允许远程访问 Docker 的功能,修改 /usr/lib/systemd/system/docker.service 文件,步骤如下:

  • 进入docker.service进行编辑
vim /usr/lib/systemd/system/docker.service
  • 添加以下内容
-H tcp://0.0.0.0:2375 
图片[1]-一键部署Spring Boot到远程Docker容器-不念博客
  • 配置完成,重启docker
systemctl daemon-reloadservice docker restart

Docker重启之后,Docker准备事情就完成了。

2. IDEA 准备

  • 在IDEA中安装Docker插件

File->Settings->Plugins

图片[2]-一键部署Spring Boot到远程Docker容器-不念博客

安装好Docker插件后,IDEA 重启

  • IDEA 配置Docker 远程连接

File->Settings->Build,Execution,Deployment->Docker 然后配置一下 Docker 的远程连接地址:

tcp://192.168.150.102:2375
图片[3]-一键部署Spring Boot到远程Docker容器-不念博客

配置完成后,会显示 Connection successful  表示链接Docker成功

3.项目准备

3.1. 创建Dockerfile

在项目根目录下创建Dockerfile,这是构建Docker镜像的文件,位置如下

图片[4]-一键部署Spring Boot到远程Docker容器-不念博客

Dockerfile内容如下:

FROM openjdk:11.0.12
VOLUME /tmp
ADD target/spring-boot-jasypt-demo-1.0-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

文件说明

  • FROM openjdk:11.0.12: 指定了基础镜像。在这里,使用的是 OpenJDK 11.0.12 镜像,它包含了 Java 运行时环境。
  • VOLUME /tmp: 这一行创建了一个卷(Volume)/tmp。在容器中,/tmp 将被用作临时目录,用于存储临时文件或其他需要持久化的数据
  • ADD target/spring-boot-jasypt-demo-1.0-SNAPSHOT.jar app.jar将构建好的 Spring Boot 可执行 JAR 文件复制到容器中,并将其重命名为 app.jar。target/spring-boot-jasypt-demo-1.0-SNAPSHOT.jar 是相对于 Dockerfile 的路径,确保该路径正确
  • ENTRYPOINT [“java”,”-jar”,”/app.jar”]: 设置容器启动时执行的默认命令。这里,使用 java -jar /app.jar 启动 Spring Boot 应用程序。这是运行 Spring Boot 应用程序的标准方式。

4.配置Docker-Maven插件

在pom.xml中配置插件,内容如下

<plugin>
    <groupId>com.spotify</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>1.2.2</version>
    <executions>
        <execution>
            <id>build-image</id>
            <phase>package</phase>
            <goals>
                <goal>build</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
<!--                    镜像地址-->
        <dockerHost>http://192.168.150.102:2375</dockerHost>
<!--                    镜像前缀-->
        <imageName>zbbmeta/${project.artifactId}</imageName>
        <imageTags>
<!--                        镜像版本-->
            <imageTag>${project.version}</imageTag>
        </imageTags>
        <forceTags>true</forceTags>
        <dockerDirectory>${project.basedir}</dockerDirectory>
        <resources>
            <resource>
                <targetPath>/</targetPath>
                <directory>${project.build.directory}</directory>
                <include>${project.build.finalName}.jar</include>
            </resource>
        </resources>
    </configuration>
</plugin>
  • execution节点: 配置当执行 mvn package 的时候,顺便也执行一下 docker:build
  • configuration节点: 配置 Docker 的主机地址,镜像的名称,镜像的 tags,其中 dockerDirectory 表示指定 Dockerfile 的位置。
  • resource节点: 配置一下 jar 的位置和名称即可。

5. 打包镜像

对项目使用package进行打包,镜像就可以上传到Docker服务器

图片[5]-一键部署Spring Boot到远程Docker容器-不念博客

打包第一次可能时间稍微久一点,因为Docker需要下载基础镜像openjdk:11.0.12

打包日志如下:

图片[6]-一键部署Spring Boot到远程Docker容器-不念博客

打包完成后,Docker服务器上就存在了项目镜像

图片[7]-一键部署Spring Boot到远程Docker容器-不念博客

6. 镜像运行

运行DOcker镜像方式存在两种方式

1、直接使用Docker命令在服务器上运行

docker run -d  --name   jasypt-demo  -p 8877:8877 zbbmeta/spring-boot-jasypt-demo:1.0-SNAPSHOT

2、IDED中运行Docker 我们之前安装了Docker插件,那么IDEA中就多了一个Docker选项

图片[8]-一键部署Spring Boot到远程Docker容器-不念博客

点击Docker下面的images,就可以显示,,服务器上存在的所有 Docker 镜像,如下:

图片[9]-一键部署Spring Boot到远程Docker容器-不念博客

选中我们要运行的镜像,右键单击,选中Create Container就可以创建出一个容器,如下图:

图片[10]-一键部署Spring Boot到远程Docker容器-不念博客

编写容器名称和绑定端口

图片[11]-一键部署Spring Boot到远程Docker容器-不念博客
图片[12]-一键部署Spring Boot到远程Docker容器-不念博客
图片[13]-一键部署Spring Boot到远程Docker容器-不念博客
  • 点击run运行容器
图片[14]-一键部署Spring Boot到远程Docker容器-不念博客
  • 显示结果
图片[15]-一键部署Spring Boot到远程Docker容器-不念博客

注意:有时候Create Container没有反应,我们需要取消Docker远程链接,然后重新链接

图片[16]-一键部署Spring Boot到远程Docker容器-不念博客

项目运行成功之后,在Postman输入远程服务器的地址http://192.168.150.102:8877/tutorial,就可以访问了

图片[17]-一键部署Spring Boot到远程Docker容器-不念博客
© 版权声明
THE END