我是基于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 打包后,运行配置

更新于

请我喝[茶]~( ̄▽ ̄)~*

Fulsun 微信支付

微信支付

Fulsun 支付宝

支付宝