我是基于ChatGPT-turbo-3.5实现的AI助手,在此网站上负责整理和概括文章
本文详细介绍了如何在Spring Boot项目中集成Docker技术,实现应用的容器化部署。主要内容包括: 1. 准备服务器环境并配置Docker远程访问; 2. 在IDEA中安装Docker插件并测试连接; 3. 修改pom.xml文件,配置docker-maven-plugin插件,绑定到Maven的package阶段,实现镜像自动构建; 4. 编写Dockerfile,定义镜像构建规则,包括基础镜像、端口暴露和运行命令; 5. 在IDEA中配置Docker部署参数,如端口映射和日志目录挂载; 6. 通过Maven命令或IDEA配置完成镜像构建与容器运行。 该方法简化了Spring Boot应用的Docker化流程,提高了部署效率,适用于开发和生产环境。
# 前提
-
准备好一台服务器 linux/CentOS 7.x-
-
安装好docker,开启远程访问:
# idea连接
-
在插件处找到 docker 并安装, 测试连接:虚拟机ip为192.168.61.10, 注意防火墙

# POM修改
将 pom.xml 文件的 build 部分修改
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.1.17.RELEASE</version>
<configuration>
<includeSystemScope>true</includeSystemScope>
<layout>JAR</layout>
<mainClass>com.example.demo.DemoApplication</mainClass>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<!--使用docker-maven-plugin插件-->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<!--将插件绑定在某个phase执行-->
<executions>
<execution>
<id>build-image</id>
<!--将插件绑定在package这个phase上。也就是说,
用户只需执行mvn package ,就会自动执行mvn docker:build-->
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<!--指定生成的镜像名,这里是我们的项目名-->
<imageName>${project.artifactId}</imageName>
<!--指定标签 这里指定的是镜像的版本,我们默认版本是latest-->
<imageTags>
<imageTag>latest</imageTag>
</imageTags>
<!-- 指定我们项目中Dockerfile文件的路径-->
<dockerDirectory>${project.basedir}/src/main/resources</dockerDirectory>
<!--指定远程docker 地址-->
<dockerHost>http://106.55.242.120:2375</dockerHost>
<!-- 这里是复制 jar 包到 docker 容器指定目录配置 -->
<resources>
<resource>
<targetPath>/</targetPath>
<!--jar包所在的路径 此处配置的即对应项目中target目录-->
<directory>${project.build.directory}</directory>
<!-- 需要包含的 jar包 ,这里对应的是 Dockerfile中添加的文件名 -->
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>docker-demo</groupId>
<artifactId>com.demo</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.2.RELEASE</version>
<relativePath />
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<docker.image.prefix>com.demo</docker.image.prefix>
<java.version>1.8</java.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<configuration>
<dockerDirectory>src/main/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<configuration>
<tasks>
<copy todir="src/main/docker" file="target/${project.artifactId}-${project.version}.${project.packaging}"></copy>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
</project>
# Dockerfile
在 src/main/resources 目录下创建创建 Dockerfile 文件
FROM openjdk:8-jdk-alpine
# # 挂载的目录
VOLUME /tmp
#把当前项目下 *.jar 改名为 app.jar 添加到镜像中
ADD *.jar app.jar
#指定端口,最好写与项目配置的端口
EXPOSE 8080
#在镜像中运行 app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
# idea配置
增加配置: Docker-> Dockerfile
- Image tag : 指定镜像名称和 tag,镜像名称为 mydocker,tag 为 1.1
- Bind ports : 绑定宿主机端口到容器内部端口。格式为
[宿主机端口]:[容器内部端口] - Bind mounts : 将宿主机目录挂到到容器内部目录中。 格式为
[宿主机目录]:[容器内部目录]。 - 这个 springboot 项目会将日志打印在容器
/home/developer/app/logs/目录下,将宿主机目录挂载到容器内部目录后,那么日志就会持久化容器外部的宿主机目录中。

docker build -f Dockerfile -t mydocker:0.1 . && docker run -p 8990:8990 -v /root/developer/app/logs/:/home/developer/app/logs/ --name mydocker mydocker:0.1
# 部署镜像
-
Maven 打包后,运行配置
