SpringBoot 构建 Docker 镜像的最佳 3 种方式
本文将介绍3种技术,通过 Maven 把 SpringBoot 应用构建成 Docker 镜像。
(1)使用 spring-boot-maven-plugin 内置的 build-image.
(2)使用 Google 的 jib-maven-plugin。
(3)使用 dockerfle-maven-plugin。
Spring Boot 应用
为了方便实践,需要一个 Spring Boot 项目。
Demo 项目地址:
https://github.com/davelms/medium-articles/tree/master/spring-maven-docker
项目环境:
- Java 11
- Maven 3.6.3
使用 mvn package
可以正常构建 jar 包。
也可以正常运行:
java -jar target/demo-application-0.0.1-SNAPSHOT.jar
测试页面:
Demo 项目 OK 了,下面就开始实践构建镜像的3个方法。
一、Spring Boot maven 插件 的 build-image
Spring Boot 预装了自己的用于构建 Docker 镜像的插件,我们无需进行任何更改,因为它就在 pom.xml 中的 spring-boot-starter-parent。
你不需要写 Dockerfile,也不用操别的心,plugin 都帮你做了,例如 Spring 建议的安全、内存、性能等问题。
只需要简单的执行:
mvn spring-boot:build-image
执行完成后会看到成功提示信息:
运行容器测试:
docker run -p 9090:8080 -t demo-application:0.0.1-SNAPSHOT
注意:这里映射的本机端口是9090
。
二、jib-maven-plugin
Jib 是一个 Maven 和 Gradle 插件,用来创建 Docker 镜像。
这个插件有一个非常明显的特点:不需要本地安装 Docker,这对持续集成是非常方便的,Jib 可以直接推送到指定的 Docker 仓库。
Jib 同样也不需要写 Dockerfile。
使用起来也非常方便,不需要改代码,也可以不改动 pom.xml。
只需要执行:
mvn compile com.google.cloud.tools:jib-maven-plugin:2.3.0:dockerBuild
- mvn compile
是我们很熟悉的 maven 编译指令。
- com.google.cloud.tools:jib-maven-plugin:2.3.0
指定了使用 Jib 插件
- dockerBuild
是 Jib 插件的执行目标,dockerBuild
指定了 Jib 使用我们本地安装的 Docker。
执行完成后会看到成功提示信息:
启动容器测试:
docker run -p 9091:8080 -t demo-application:0.0.1-SNAPSHOT
注意:这里映射的本机端口是9091
。
三、dockerfile-maven-plugin
这个插件就需要我们写 Dockerfile 了,Domo 项目中已经准备好了。
Dockerfile 需要放在项目的根目录下,和 pom.xml 在一起。
然后,需要在 pom.xml 中添加一些配置,以便指定仓库、tag 标签,还有上面 Dockerfile 中定义的 JAR_FILE
。
执行 mvn package
时就会自动构建镜像了,执行完成后就会看到提示信息:
运行容器:
docker run -p 9092:8080 -t demo-application:0.0.1-SNAPSHOT
注意:映射的本机端口是 9092
。
小结
这3个里面最方便的是 SpringBoot 原生的方式,什么都不需要自己做,直接就能用。
最有特点的是 Jib,不需要你本地安装 Docker,可以直接推送到指定的仓库,而且使用起来也很简单。
看起来最麻烦的就是 dockerfile-maven-plugin 这个插件了,需要写 Dockerfile,还得添加配置,但是,实际上他是最好用的,因为前2个与网络环境有关系(你懂的),即使你配置了 Docker 镜像,也会报错,你可以试一下。
写在最后
欢迎大家关注我的公众号【风平浪静如码】,海量Java相关文章,学习资料都会在里面更新,整理的资料也会放在里面。
觉得写的还不错的就点个赞,加个关注呗!点关注,不迷路,持续更新!!!5
最新文章
- 在linux使用make编译ArduPilot for Pixhawk/PX4 ArduPilot 编译环境搭建
- ASP.NET应用中会话状态丢失及解决策略
- [Node.js] DSL in action
- Uva 11538 - Chess Queen
- 仿酷狗音乐播放器开发日志二十六 duilib在标题栏弹出菜单的方法
- POJ2773 - Happy 2006(欧拉函数)
- Clojure学习01:开始起步
- 共享AFHTTPSessionManager 单例好处浅析
- NYOJ--491--dfs(打表水过)--幸运三角形
- 【转载】WAI-ARIA无障碍网页应用属性完全展示
- Visionpro学习笔记 :QuickBuild-Based Application Run-Once Button
- python字符串编码理解(转载)
- 关于NOIP2018复赛若干巧合的声明
- 你必须知道的几种java容器(集合类)
- from collections import namedtuple 使用
- table 中 文字长度大于td宽度,导致文字换行 解决方案
- JS吧数字转成2进制 8进制16进制数据
- 用压测模拟并发、并发处理(synchronized,redis分布式锁)
- RealVNC
- Android开发之MdiaPlayer详解
热门文章
- JSON,数组根据字段分组
- 最近集训的图论(思路+实现)题目汇总(内容包含tarjan、分层图、拓扑、差分、奇怪的最短路):
- java9第5篇-Collection集合类的增强与优化
- 带你了解 MySQL Binlog 不为人知的秘密
- arcgis activeX 安全提示消除办法
- mac 搭建 Robot Framework
- 尝试从零开始构建我的商城 (一) :使用Abp vNext快速一个简单的商城项目
- git学习(十一) idea git pull 解决冲突
- AQS 自定义同步锁,挺难的!
- drf 认证校验及源码分析