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个方法。
#1 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
。
#2 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
。
#3 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 镜像,也会报错,你可以试一下。
参考资料:
- jib-maven-plugin
https://github.com/GoogleContainerTools/jib/tree/master/jib-maven-plugin
- dockerfile-maven plugin
https://github.com/spotify/dockerfile-maven
本文翻译整理自:
https://medium.com/swlh/build-a-docker-image-using-maven-and-spring-boot-58147045a400
推荐阅读
SpringBoot 构建 Docker 镜像的 3 种方式的更多相关文章
- SpringBoot 构建 Docker 镜像的最佳 3 种方式
本文将介绍3种技术,通过 Maven 把 SpringBoot 应用构建成 Docker 镜像. (1)使用 spring-boot-maven-plugin 内置的 build-image. (2) ...
- 制作Docker镜像的两种方式
此文已由作者朱笑天授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 一.使用docker commit命令制作docker镜像 1. pull一个centos6.6的基础镜像, ...
- 构建Docker镜像两种方式的比较-Dockerfile方式和S2I方式
前言 写Dockerfile是构建Docker镜像最通常的方式,接触过Docker的童鞋多少了解一些.前段时间研究OpenShift(paas的一种),发现了另外一种构建Docker镜像的方式:S2I ...
- [转] 构建Docker镜像两种方式的比较-Dockerfile方式和S2I方式
原文地址:https://www.cnblogs.com/tianshifu/p/8127837.html 前言 写Dockerfile是构建Docker镜像最通常的方式,接触过Docker的童鞋多少 ...
- Java SpringBoot 项目构建 Docker 镜像调优实践
PS:已经在生产实践中验证,解决在生产环境下,网速带宽小,每次推拉镜像影响线上服务问题,按本文方式构建镜像,除了第一次拉取.推送.构建镜像慢,第二.三-次都是几百K大小传输,速度非常快,构建.打包.推 ...
- 多阶段构建Docker镜像
在Docker 17.05及更高的版本中支持支持一种全新的构建镜像模式:多阶段构建: 多阶段构建Docker镜像的最大好处是使构建出来的镜像变得更小: 目前常见的两个构建镜像的方式为: 1.直接使用某 ...
- Docker:使用Jenkins构建Docker镜像
Docker 彭东稳 1年前 (2016-12-27) 10709次浏览 已收录 0个评论 一.介绍Jenkins Jenkins是一个开源项目,提供了一种易于使用的持续集成系统,使开发者从 ...
- 精简Docker镜像的五种通用方法
http://dockone.io/article/8163 精简Docker镜像的好处很多,不仅可以节省存储空间和带宽,还能减少安全隐患.优化镜像大小的手段多种多样,因服务所使用的基础开发语言不同而 ...
- Maven插件构建Docker镜像
背景 微服务架构下,微服务在带来良好的设计和架构理念的同时,也带来了运维上的额外复杂性,尤其是在服务部署和服务监控上.单体应用是集中式的,就一个单体跑在一起,部署和管理的时候非常简单,而微服务是一个网 ...
随机推荐
- iOS开发MD5、SHA1
MD5: + (NSString *)md5:(NSString *)input { const char *cStr = [input UTF8String]; unsigned char dige ...
- GC总结
概述 GC(Garbage Collection),需要完成的3件事 哪些内存需要回收? 什么时候回收? 如何回收? 为什么需要了解GC和内存分配?更好的监控和调节 排查各种内存溢出,内存泄漏 避免G ...
- js中 addEventListener 和removeEventListener
js中添加事件监听本来是非常常见的事情,但是去除监听一般很少去干,最近项目中需要监听页面显示或者隐藏 代码如下 document.addEventListener(visibilitychange', ...
- BUUCTF Crypto
BUUCTF 几道crypto WP [AFCTF2018]Morse 简单的莫尔斯密码,最直观的莫尔斯密码是直接采用空格分割的点和划线,这题稍微绕了一下使用的是斜杠来划分 所以首先将斜杠全部替换为空 ...
- 服务器开发 Ubuntu
一.Ubuntu安装: 为什么用Ubuntu,作为服务器初学者开发,如果真的要买苹果系统电脑性价比不高,所以在window系统中安装Linux虚拟机是不二之选.为什么用Ubuntu不多说了,开始安装吧 ...
- hdl - HLS vs. Generator
https://mp.weixin.qq.com/s/n_4RKlOddr_p2S_wODvFbw 介绍硬件建模的各个层次,以及基于RTL进一步提高层次的方法. 1. 物理版图 直接画 ...
- JUC : 并发编程工具类的使用
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.JUC是什么 1.JUC定义 JUC,即java.util.concurrent 在并发编程中使用的 ...
- 数据库之 MySQL --- 数据处理 之 表操作、CRUD(六)
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一. 表操作 创建数据库CREATE DATABASE demo-- 删除数据库DROP DATABAS ...
- Java实现 LeetCode 109 有序链表转换二叉搜索树
109. 有序链表转换二叉搜索树 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. ...
- Java实现 LeetCode 94 二叉树的中序遍历
94. 二叉树的中序遍历 给定一个二叉树,返回它的中序 遍历. 示例: 输入: [1,null,2,3] 1 2 / 3 输出: [1,3,2] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? / ...