一、序言

​ 近几年,微服务已经成为Java主流的技术方向,随着微服务化的流行,应用容器化部署也是必不可少的。应用容器化用抽象的话来说就是:将应用程序部署到容器当中作为独立的应用程序部署单元运行,并作为实现高级别资源隔离的机制。常见的容器化技术就是docker,所以简单来说就是将微服务程序打包成镜像,在容器中运行,但这样做有一个关键问题,就是docker镜像越大,部署的效率越低,希望通过本文为你容器化部署提供效率。

二、 使用原始的方式构建一个docker镜像

我们先用原始的方式制作一个Spring boot应用程序镜像,体会一下目前流行的容器化部署方式。

1. 创建spring boot应用

我们编写一个简单的应用程序,只有一个hello的controller即可

如果你不想创建该项目,可以从这里看到源码

打开浏览器简单测试一下:

2. 打包

root@ubuntu:docker-image-demo$ mvn package

3.编写Dockerfile

#Dockerfile 这里我们选用 jre环境 减少镜像的体积
FROM openjdk:8-jre-alpine
#镜像内部创建一个app目录 用来存放jar包
RUN mkdir /app
#复制jar包 到app目录下
COPY target/docker-image-demo-0.0.1-SNAPSHOT.jar /app/app.jar
#暴露端口
EXPOSE 8080/tcp
#默认启动程序
ENTRYPOINT java -jar /app/app.jar

4. 创建镜像

#创建镜像
root@ubuntu:docker-image-demo$ docker build -t docker-image-demo:0.0.1 .#查询镜像
root@ubuntu:docker-image-demo$ docker images

5. 推送镜像到registry仓库

#将镜像推送到镜像仓库 这里我们选择阿里云的镜像仓库
#登录的步骤 请自行查阅阿里云镜像仓库root@ubuntu:docker-image-demo$ docker tag docker-image-demo:0.0.1 registry.cn-hangzhou.aliyuncs.com/jk1123/docker-jib-test:0.0.1#推送
root@ubuntu:docker-image-demo$ docker push registry.cn-hangzhou.aliyuncs.com/jk1123/docker-jib-test:0.0.1 

在阿里云仓库查看镜像

三、原始方式的不足

1. 需要编写Dockerfile

镜像的打包部署本身属于运维工作,但是需要开发人员的介入,解放应用开发人员的双手,不要将运维的工作引入到开发人员的工作流中

2. 制作镜像耗时

使用springboot的项目打包而成的jar包是一个fat jar(就是该jar中包含该应用程序需要一切依赖).导致docker镜像制作过程当中需要复制该jar到容器中

稍微大一点应用程序打成fat jar 高达一两百MB,其实最主要还是依赖的sprring全家桶的jar太多

3. 推送镜像到仓库和拉取镜像耗时

微服务的使用便于快速迭代服务,所以发版的频率十分频繁.每次推送镜像/拉取镜像十分耗时,因为每次发版我们的fat jar都会发生细微的改变.导致docker无法利用其缓存机制,每次都要拉取镜像中的fat jar 那层.导致推送和拉取十分消耗网络资源和时间

四、 使用Google jib工具

1. 简介

Jib 是谷歌公司推出的开源 Java 镜像构建工具,它可以将一个 Java 应用构建成 OCI 镜像或者是 Docker 镜像,目前最新的 Relaese 版本为 3.2.1

JIB 具有以下特点:

  1. Jib 使用 Java 开发,并作为 Maven 或 Gradle 的一部分运行.你不需要编写 Dockerfile 或 安装Docker 环境,甚至无需创建包含所有依赖的大 JAR 包,就可以构建出镜像,并将镜像推送到镜像仓库。因为 Jib 与 Java 构建过程紧密集成,所以它可以访问到打包应用程序所需的所有信息。在后续的容器构建期间,它将自动选择 Java 构建过的任何变体。

  2. JIB 构建出的应用镜像,具有分层结构, 利用镜像分层和注册表缓存来实现快速、增量的构建,提高构建镜像、推送镜像的性能,减少镜像存储空间。

  3. 幂等性,Jib 支持根据 Maven 和 Gradle 的构建元数据进行声明式的容器镜像构建,只要输入保持不变,就可以通过配置重复创建相同的镜像。

下图是官方给出的性能测试

2.使用

如此强大的工具使用起来相当的简单

2.1 导入插件依赖

<!-- pom文件中添加jib的插件-->
<plugin><groupId>com.google.cloud.tools</groupId><artifactId>jib-maven-plugin</artifactId><version>3.2.0</version>
</plugin>

2.2 配置插件

<plugin><groupId>com.google.cloud.tools</groupId><artifactId>jib-maven-plugin</artifactId><version>3.2.0</version><configuration><from><!--基础镜像名字--><image>openjdk:8-jre-alpine</image></from><to><image>registry.cn-hangzhou.aliyuncs.com/jk1123/docker-jib-test</image><tags><tag>0.0.2</tag></tags><!--<auth>--><!--<username>自己仓库的账号</username>--><!--<password>写自己的仓库密码</password>--><!--</auth>--><!--其实这里还是建议 使用maven-setting的配置方式 请参照https://github.com/GoogleContainerTools/jib/tree/master/jib-maven-plugin#authentication-methodshttps://maven.apache.org/guides/mini/guide-encryption.html--></to><container><!--指明主类--><mainClass>com.jk1123.docker.DockerImageDemoApplication</mainClass><creationTime>USE_CURRENT_TIMESTAMP</creationTime><jvmFlags><jvmFlag>-Dmy.property=example.value</jvmFlag><jvmFlag>-Xms512m</jvmFlag><jvmFlag>-Xmx2048m</jvmFlag></jvmFlags><ports><port>8080</port></ports><labels><org.label-schema.schema-version>1.0</org.label-schema.schema-version><org.label-schema.name>docker-image-test</org.label-schema.name><org.label-schema.vendor>jk1123</org.label-schema.vendor><org.label-schema.license>GPLv2</org.label-schema.license><org.label-schema.build-date>${maven.build.timestamp}</org.label-schema.build-date><org.opencontainers.image.title>docker-image-test Image</org.opencontainers.image.title><org.opencontainers.image.vendor>jk1123</org.opencontainers.image.vendor><org.opencontainers.image.licenses>GPL-2.0-only</org.opencontainers.image.licenses><org.opencontainers.image.created>${maven.build.timestamp}</org.opencontainers.image.created></labels></container><allowInsecureRegistries>true</allowInsecureRegistries></configuration><executions><execution><phase>package</phase><goals><!-- 本地构建这个--><!--<goal>dockerBuild</goal>--><!-- 远程构建是这个--><goal>build</goal></goals></execution></executions>
</plugin>

2.3.执行构建

root@ubuntu:docker-image-demo$ mvn package jib:build

五、 JIB原理分析

1. docker镜像缓存

docker的镜像是由一层层构成的

如上头所示,我们如果采用原始方式打包镜像,镜像分层如图.在这种情况下,如果我们的代码有变化,就会重新制作一个springboot的fat jar,这个jar中即时只有一行代码改变了,生成的新的jar也与原来的文件也变化,docker制作镜像的时候 该层发生了变化就需要重新制作,而一个fat jar非常的大,无法利用镜像的缓存功能.

2. jib构建镜像分层

Jib 在编译 springboot应用的时候考虑到的docker镜像的缓存功能,能利用缓存尽量的利用镜像的缓存.

通过分析我们会发现如下规律:

1.应用代码是最容易发生变化的,但是代码文件实际占用并不是太高(相对于引入jar包大小而言)

2.应用的配置文件也容易发生变化,但是变化频率相对于代码要低一些

3.应用依赖的其他的公共子模块也容易发生变化,但是变化频率相对于代码要更低一些

4.应用依赖的一些快照jar包也容易发生变化,频率更低

5.应用依赖的常规jar,例如spring系列的jar包,变化频率不大,试想谁会天天换spring版本号呢

综上所述,jib的作者充分考虑到这些规律,将镜像分成好几层,充分利用的docker镜像缓存机制和资源的变化频率的特性,接下来我们来看看使用jib制作的镜像的层级关系图

首先我们先看看我们的项目结构

接下来我们来看看镜像的层级结构图




可见jib充分考虑和利用的docker镜像缓存的机制,来帮我们制作镜像.这样当我们的应用重新发版的时候,可以减少镜像的push和pull的速度。

注:

上图分析工具使用dive工具

关于dive工具的使用请参照这里:

github:https://github.com/wagoodman/dive

gitee:https://gitee.com/mirrors/Dive

六、 结束语

通过如上的分析,相信大家对jib插件有个清晰的认知:

jib就是根据应用的不同资源的变化频率和docker镜像的缓存机制,充分利用docker镜像的分层机制.提高镜像的制作和发布性能.

最后,希望各位读者早日用上jib来打包您的应用,减少镜像的体积,减少打包消耗,减少传输消耗,畅享绿色生活!!!

Java教程:如何使用Jib插件容器化SpringBoot应用?相关推荐

  1. java 提高性能的 容器库_容器隔离性带来的问题--容器化Java应用比虚机启动速度慢...

    引发的问题 同等配置下,虚机中的java 服务的启动速度,要比容器快很多(将近两倍) 实测数据 在同是1c1g的虚机和容器中,虚机启动时间大概在1min20s,容器启动时间大概在2min40s. 排查 ...

  2. java实现镜像系统_谷歌开源Java镜像构建工具Jib

    容器的出现让Java开发人员比以往任何时候都更接近"编写一次,到处运行"的工作流程,但要对Java应用程序进行容器化并非易事:你必须编写Dockerfile,以root身份运行Do ...

  3. Google 正式开源 Jib ,帮助 Java 应用快速容器化

    Google 本周宣布开源一款新的 Java 工具 Jib ,旨在让开发者使用他们熟悉的工具更轻松地将 Java 应用程序容器化. 在7月9日发布的博客文章中,Google 软件工程师 Appu Go ...

  4. Docker学习总结(36)——利用Google开源Java容器化工具Jib构建镜像

    一.前言 容器的出现让Java开发人员比以往任何时候都更接近"编写一次,到处运行"的工作流程,但要对Java应用程序进行容器化并非易事:你必须编写Dockerfile,以root身 ...

  5. 谷歌助力,快速实现 Java 应用容器化

    原文地址:梁桂钊的博客 博客地址:http://blog.720ui.com 欢迎关注公众号:「服务端思维」.一群同频者,一起成长,一起精进,打破认知的局限性. Google 在 2018 年下旬开源 ...

  6. Docker容器化技术教程,24小时快速入门

    Docker介绍 Docker简介和安装 Docker是什么 为什么使用Docker 和普通虚拟机的对比 打包.分发.部署 小结 Docker部署的优势 Docker通常用来做什么 重要概念:镜像.容 ...

  7. 第148天学习打卡(Kubernetes kubeadm init 成功部署 部署网络插件 部署容器化应用)

    继续安装 c3j9i2htclj6thlta6Z ~]# clear [root@iZ2vc3j9i2htclj6thlta6Z ~]# systemctl stop firewalld [root@ ...

  8. jquery 图片裁剪 java_[Java教程]5 款最新的 jQuery 图片裁剪插件

    [Java教程]5 款最新的 jQuery 图片裁剪插件 0 2015-05-18 16:00:20 这篇文章主要介绍最新的 5 款 jQuery 图片裁剪插件,可以帮助你轻松的实现你网站需要的图像裁 ...

  9. Docker最全教程——Redis容器化以及排行榜实战(十三)

    Docker最全教程--Redis容器化以及排行榜实战(十三) 原文:Docker最全教程--Redis容器化以及排行榜实战(十三) 前言 容器教程的路还很长,笔者尽量根据实践来不断地完善.由于在编写 ...

  10. Docker最全教程——数据库容器化之持久保存数据(十一)

    Docker最全教程--数据库容器化之持久保存数据(十一) 原文:Docker最全教程--数据库容器化之持久保存数据(十一) 上一节我们讲述了SQL Server容器化实践(注意,SQL Server ...

最新文章

  1. 图片管理之更新SKU表数据
  2. 中使用mysql连接失败_如何在命令行下使用 MySQL 连接数据库不用每次都输入密码?...
  3. 框架 路由地址_Django框架的使用
  4. (译+原)std::shared_ptr及std::unique_ptr使用数组
  5. 同名字的数值求和插入行_中望CAD2021:支持表格和字段插入公式,提高数据处理效率...
  6. springboot公共模块打包_解决SpringBoot多模块发布时99%的问题?
  7. 在开发环境中,自己搭建一个ssl环境(小例子)
  8. 计算机房安全等级标准,电子计算机房的分级标准
  9. Criteria和DetachedCriteria区别应用
  10. 内存、时间复杂度、CPU/GPU以及运行时间
  11. DeepMind研究科学家:NLP基准测试的现在、过去和未来
  12. Unity脚本的生命周期
  13. 图说: 量子物理学的主要内容
  14. 改进left函数,截取varchar需要的字符串长度
  15. 匿名发脉脉的拼多多员工,是如何被发现的?背后真相令人发指...
  16. 关于链接出现 unauthenticated user 用户问题研究
  17. 总结Git下载及其操作
  18. 虚拟机无法在更新服务器,今win10更新导致VMware workstation pro无法打开的解决方法...
  19. 【永磁同步电机转速环ADRC电流环ADRC双环无传感器控制】
  20. 严格执行8小时工作制、双休,会怎样?

热门文章

  1. 安卓电视/平板玩街机游戏
  2. 提高睡眠质量的好物有哪些?五款助眠好物推荐
  3. 区块链技术如何让租房市场回归理性?
  4. 教你免费白嫖各大知名互联网公司的「文字转语音、语音转文字」服务!
  5. 纯css画一个月亮的天气图标
  6. LTE 中的CQI,PMI,RI上报机制
  7. 19款探岳刷隐藏教程_19款探岳怎么选,小编在此支你几招 拿起小本本记住了
  8. 使用Ruby搭建Redis 集群
  9. 彻底搞清楚library cache lock的成因和解决方法(转)
  10. Spring框架基础(中)