1. 本文环境

Maven:3.6.3 (Maven配置参考)

SpringBoot version:2.3.4.RELEASE

Docker version: 19.03.11 (Docker搭建参考)

JDK version:1.8.0_221 (JDK搭建参考)

dev tools:IDEA (IDEA破解参考)

环境说明:本地跟docker不在同一环境,docker为单独服务器。

2. 准备工作

通过 IDEA -> Spring Initializr 快速创建一个 SpringBoot 应用

填写项目名、选择 jdk 版本:

之后操作一路「蓝色按钮」默认即可。

创建后的项目 pom.xml 文件内容如下:

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.4.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>springboot-demo</artifactId><version>0.0.1-SNAPSHOT</version><name>springboot-demo</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version></properties><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><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>

3. Maven dockerfile 插件

将 SpringBoot 项目打包成 Docker 镜像,其主要通过 Maven plugin 插件来进行构建。

在之前都是通过 docker-maven-plugin 插件进行打包,而现在已经升级出现了新的插件:

dockerfile-maven-plugin

接下来我们就是通过这个 plugin 插件进行操作。

<plugin><groupId>com.spotify</groupId><artifactId>dockerfile-maven-plugin</artifactId><version>1.4.13</version><executions><execution><id>default</id><goals><goal>build</goal><goal>push</goal></goals></execution></executions><configuration><repository>${docker.image.prefix}/${project.artifactId}</repository><tag>${project.version}</tag><buildArgs><JAR_FILE>${project.build.finalName}.jar</JAR_FILE></buildArgs></configuration>
</plugin>

参数说明:

  • repository:指定Docker镜像的repo名字,要展示在docker images 中的。

  • tag:指定Docker镜像的tag,不指定tag默认为latest

  • buildArgs:指定一个或多个变量,传递给Dockerfile,在Dockerfile中通过ARG指令进行引用。JAR_FILE 指定 jar 文件名。

另外,可以在execution中同时指定build和push目标。当运行mvn package时,会自动执行build目标,构建Docker镜像。

DockerFile

DockerFile 文件需要放置在项目 pom.xm l同级目录下,内容大致如下:

FROM java:8
EXPOSE 8080
ARG JAR_FILE
ADD target/${JAR_FILE} /niceyoo.jar
ENTRYPOINT ["java", "-jar","/niceyoo.jar"]

参数说明:

  • FROM:基于java:8镜像构建
  • EXPOSE:监听8080端口
  • ARG:引用plugin中配置的 JAR_FILE 文件
  • ADD:将当前 target 目录下的 jar 放置在根目录下,命名为 niceyoo.jar,推荐使用绝对路径。
  • ENTRYPOINT:执行命令 java -jar /niceyoo.jar

当前完整的 pom.xml:

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.4.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>springboot-demo</artifactId><version>0.0.1-SNAPSHOT</version><name>springboot-demo</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version><docker.image.prefix>niceyoo</docker.image.prefix></properties><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><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><groupId>com.spotify</groupId><artifactId>dockerfile-maven-plugin</artifactId><version>1.4.13</version><executions><execution><id>default</id><goals><goal>build</goal><goal>push</goal></goals></execution></executions><configuration><repository>${docker.image.prefix}/${project.artifactId}</repository><tag>${project.version}</tag><buildArgs><JAR_FILE>${project.build.finalName}.jar</JAR_FILE></buildArgs></configuration></plugin></plugins></build></project>

项目截图:

4. 使用误区

docker-maven-plugin 和 dockerfile-maven-plugin 使用误区。

我们之前在使用 docker-maven-plugin 插件时,可以直接在本地就可以完成打包并推送镜像至远程仓库,即 SpringBoot项目构建 docker 镜像并推送到远程仓库:

<plugin><groupId>com.spotify</groupId><artifactId>docker-maven-plugin</artifactId><version>1.0.0</version><configuration><!--镜像名称--><imageName>10.211.55.4:5000/${project.artifactId}</imageName><!--指定dockerfile路径--><!--<dockerDirectory>${project.basedir}/src/main/resources</dockerDirectory>--><!--指定标签--><imageTags><imageTag>latest</imageTag></imageTags><!--远程仓库地址--><registryUrl>10.211.55.4:5000</registryUrl><pushImage>true</pushImage><!--基础镜像jdk1.8--><baseImage>java</baseImage><!--制作者提供本人信息--><maintainer>niceyoo apkdream@163.com</maintainer><!--切换到ROOT目录--><workdir>/ROOT</workdir><cmd>["java","-version"]</cmd><entryPoint>["java","-jar","${project.build.finalName}.jar"]</entryPoint><!--指定远程docker地址--><dockerHost>http://10.211.55.4:2375</dockerHost><!--这里是复制jar包到docker容器指定目录配置--><resources><resource><targetPath>/ROOT</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>

使用如上配置时,当执行 mvn package docker:build,即可完成打包至 docker 镜像中。

但是,Dockerfile 就不一样了,从我们开始编写 Dockerfile 文件 FROM 命令开始,我们就发现,这个必须依赖于Docker,但问题就是,假设我本地跟 Docker 并不在一台机器上,那么我是没法执行 dockerfile 的,如果在本地不安装 docker 环境下,是没法执行打包操作的,那么就可以将代码拉取到 Docker 所在服务器,执行打包操作。

5. 项目打包

项目代码结构:

执行 mvn clean package dockerfile:build -Dmaven.test.skip=true

执行 docker images 查看

至此,springboot 的镜像就制作完成了。

6. 创建镜像容器

上边的步骤镜像创建后,我们就可以直接来创建 springboot 容器来运行了。

docker run -d -p 8080:8080 10.211.55.4:5000/springboot-demo:0.0.1-SNAPSHOT
  • -d:表示在后台运行

  • -p:指定端口号,第一个8080为容器内部的端口号,第二个8080为外界访问的端口号,将容器内的8080端口号映射到外部的8080端口号

  • 10.211.55.4:5000/springboot-demo:0.0.1-SNAPSHOT:镜像名+版本号。

如果觉得镜像名称过长的话,可以重命名:

docker tag 镜像IMAGEID 新的名称:版本号

以 10.211.55.4:5000/springboot-demo 为例:

docker tag 1815d40a66ae demo:latest

如果版本号不加的话,默认为 latest

博客首发地址:https://www.cnblogs.com/niceyoo/p/13796792.html

SpringBoot打包成Docker镜像相关推荐

  1. Spring Boot学习总结(10)——SpringBoot打包成Docker镜像

    <build> <!--定义jar文件名,可以自定义--> <finalName>${project.name}-${project.version}</fi ...

  2. 一步步把一个SpringBoot应用打包成Docker镜像并运行

    (1) 首先要有一个可以工作的SpringBoot应用. 从Jerry的github上clone这个github repository到本地: cd进入项目文件夹内,使用命令行mvn spring-b ...

  3. docker eclipse打包_【Docker】Maven打包SpringBoot项目成Docker镜像并上传到Harbor仓库(Eclipse、STS、IDEA、Maven通用)...

    写在前面 最近,在研究如何使用Maven将SpringBoot项目打包成Docker镜像并发布到Harbor仓库,网上翻阅了很多博客和资料,发现大部分都是在复制粘贴别人的东西,没有经过实践的检验,根本 ...

  4. Maven项目打包成Docker镜像并启用

    SpringBoot项目打包成Docker镜像 1.将Maven项目打包成一个jar包. (先clean,再package) 2.创建一个docker文件夹,以及Dockerfile文件 mkdir ...

  5. 怎么把一个Java应用打包成Docker镜像

    怎么把Java应用打包成Docker镜像?对熟悉Docker的同学这应该是一个很简单的问题,把项目打包成JAR包然后在Dockerfile里用ADD命令把JAR文件放到镜像里,启动命令设置执行这个JA ...

  6. 将你的前端应用打包成docker镜像并部署到服务器?仅需一个脚本搞定

    1.前言 前段时间,自己搞了个阿里云的服务器.想自己在上面折腾,但是不想因为自己瞎折腾而污染了现有的环境.毕竟,现在的阿里云已经没有免费的快照服务了.要想还原的话,最简单的办法就是重新装系统.而一旦重 ...

  7. docker image name 更改_将前端应用打包成docker镜像并部署?仅需一个脚本就搞定

    1.前言 前段时间,自己搞了个阿里云的服务器.想自己在上面折腾,但是不想因为自己瞎折腾而污染了现有的环境.毕竟,现在的阿里云已经没有免费的快照服务了.要想还原的话,最简单的办法就是重新装系统.而一旦重 ...

  8. springboot jar 打包成docker 镜像并运行

    一.安装docker 并运行 详情见 CentOS-7 下在线安装docker 与卸载_cyw8998的专栏-CSDN博客 二.建springboot web工程端口定为10188,并打包成jar 三 ...

  9. 将现有的系统环境文件打包成Docker镜像文件

    一.现有A系统Centos7操作: 备注:A系统里最好不安装Docker,否则会报错 卸载不必要软件包 yum remove -y iwl* *firmware* --exclude=kernel-f ...

最新文章

  1. 谷歌官方版android,谷歌Android 11正式官方版
  2. C#精髓【月儿原创】第二讲 WMI完美秀出CPU编号厂商主频百分比等全部信息
  3. poi设置自动换行后显示不全_WPS表格:如何让数据超过单元格就自动换行并完全显示?...
  4. C语言文件读写(5)-文件位置相关
  5. 串口通讯你真的会了吗?不妨看看这些经验
  6. Java文件读写操作指定编码方式防乱码
  7. 【剑指offer】面试题12:矩阵中的路径(Java)
  8. Leetcode——最长递增子序列(leetcode 300)
  9. Akka源码分析-Actor创建
  10. mavean的依赖传递和排除依赖
  11. 解压tar.gz文件与tar.bz2文件
  12. 嵌入式linux基础学习全套精品视频教程
  13. ASP.NET学习 asp‘s one word
  14. 夏普利值:全排列边际效益的平均
  15. ORA-01045: user lacks CREATE SESSION privilege; logon denied
  16. 深入理解多线程(四)— Moniter的实现原理
  17. 【总目录】人工智能、机器学习、深度学习总结大全----目录.未完待续...
  18. 用python让excel飞起来(第7章 图表操作)
  19. SDL库及SDL_draw库的安装、SDL库的使用
  20. 《程序员的思维修炼--开发认知潜能》读书笔记

热门文章

  1. [html] 编写一个布局,让文字环绕在图片的周围
  2. 工作328:uni-两个页面对象传递
  3. [css] clear属性只对块级元素有效么?为何无法应用于行内元素?
  4. 前端学习(2610):vuex实现删除
  5. 前端学习(2554):第一个vue程序
  6. mybatis学习(11): sql server配置管理器请求失败或服务未及时响应
  7. 第六十期:玩了分布式这么久,你不会连Kafka都不清楚吧
  8. 5如何让进行项目管理
  9. 项目管理(1):备战pmp
  10. centos安装ipconfig和telnet命令