原文地址:梁桂钊的博客

博客地址:http://blog.720ui.com

欢迎关注公众号:「服务端思维」。一群同频者,一起成长,一起精进,打破认知的局限性。

Google 在 2018 年下旬开源了一款新的 Java 工具 Jib,可以轻松地将 Java 应用程序容器化。通过 Jib,我们不需要编写 Dockerfile 或安装 Docker,通过集成到 Maven 或 Gradle 插件,就可以立即将 Java 应用程序容器化。

开源地址:https://github.com/GoogleContainerTools/jib

一、什么是 Jib

Jib 是一个快速而简单的容器镜像构建工具,它作为 Maven 或 Gradle 的一部分运行,不需要编写 Dockerfile 或运行 Docker 守护进程。它从 Maven 或 Gradle 中构建我们的 Docker 镜像, 并只将发生变更的层(而不是整个应用程序)推送到注册表来节省宝贵的构建时间。现在,我们对 Docker 构建流程和 Jib 构建流程进行对比。Docker 构建流程,如下所示。

Jib 构建流程,则是这样的。

二、实战出真知

1. 构建一个简单的 Java 工程

我们编写一个简单的 Java 类。

public class HelloWorld {public static void main(String[] args) {System.out.println("Hello World!");System.out.println("http://blog.720ui.com");}
}

紧接着,我们再创建一个 pom.xml 文件。

<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>com.lianggzone.sample.lib</groupId><artifactId>helloworld-samples</artifactId><version>0.1</version><packaging>jar</packaging><name>helloworld-samples</name><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><jib-maven-plugin.version>1.0.2</jib-maven-plugin.version><maven-compiler-plugin.version>3.8.0</maven-compiler-plugin.version></properties><dependencies></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>${maven-compiler-plugin.version}</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin><!-- Jib --><plugin><groupId>com.google.cloud.tools</groupId><artifactId>jib-maven-plugin</artifactId><version>${jib-maven-plugin.version}</version><configuration><from><image>registry.cn-hangzhou.aliyuncs.com/lianggzone/oracle_java8</image></from><to><image>registry.cn-hangzhou.aliyuncs.com/lianggzone/jib-helloworld:v1</image></to><container><jvmFlags><jvmFlag>-Xms512m</jvmFlag><jvmFlag>-Xdebug</jvmFlag></jvmFlags><mainClass>com.lianggzone.HelloWorld</mainClass></container></configuration><executions><execution><phase>package</phase><goals><goal>build</goal></goals></execution></executions></plugin></plugins></build>
</project>

由于默认访问谷歌的 gcr.io 仓库,而国内访问 gcr.io 不稳定会经常导致网络超时,所以笔者使用了国内的阿里云镜像服务,那么就不需要访问谷歌的仓库了。现在,我们执行 mvn compile jib:build 命令进行自动化构建,它会从 &lt;from&gt; 拉取镜像,并把生成的镜像上传到 &lt;to&gt; 设置的地址。这里,笔者还通过 <jvmFlags>` 设置了一些 JVM 参数。

mvn compile jib:build

此外,如果"登录失败,未授权",需要通过 docker login 登录鉴权一下。此外,更好的做法是,你可以考虑在Maven 中放置凭据。

<settings>...<servers>...<server><id>registry.cn-hangzhou.aliyuncs.com</id><username>你的阿里云账号</username><password>你的阿里云密码</password></server></servers>
</settings>

最后,执行完成后,我们可以在阿里云镜像仓库获取镜像。

大功告成,现在,我们来验证一把。我们通过 docker pull 拉取镜像,并运行。

docker pull registry.cn-hangzhou.aliyuncs.com/lianggzone/jib-helloworld:v1
docker run --name jib-helloworld -it registry.cn-hangzhou.aliyuncs.com/lianggzone/jib-helloworld:v1 /bin/bash

执行结果,如下所示。

2. 构建一个 SpringBoot 的可运行 Jar

我们来一个复杂一些的项目,构建一个 SpringBoot 的项目。关于 SpringBoot 的使用,可以阅读笔者之前的文章:http://blog.720ui.com/columns/springboot_all/。现在,我们首先需要搭建一个工程,并创建一个启动类。

@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

同时,需要一个 Web 的接口。

@RestController
public class WebController {@RequestMapping("/blog")public String index() {return "http://blog.720ui.com";}
}

紧接着,我们再创建一个 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 http://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.1.2.RELEASE</version></parent><groupId>com.lianggzone.sample.lib</groupId><artifactId>springboot-samples</artifactId><version>0.1</version><packaging>jar</packaging><name>springboot-samples</name><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><jib-maven-plugin.version>1.0.2</jib-maven-plugin.version><maven-compiler-plugin.version>3.8.0</maven-compiler-plugin.version></properties><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>${maven-compiler-plugin.version}</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin><!-- Jib --><plugin><groupId>com.google.cloud.tools</groupId><artifactId>jib-maven-plugin</artifactId><version>${jib-maven-plugin.version}</version><configuration><from><image>registry.cn-hangzhou.aliyuncs.com/lianggzone/oracle_java8</image></from><to><image>registry.cn-hangzhou.aliyuncs.com/lianggzone/jib-springboot:v1</image></to><container><jvmFlags><jvmFlag>-Xms512m</jvmFlag><jvmFlag>-Xdebug</jvmFlag></jvmFlags></container></configuration><executions><execution><phase>package</phase><goals><goal>build</goal></goals></execution></executions></plugin></plugins></build>
</project>

现在,我们执行 mvn compile jib:build 命令进行自动化构建。执行完成后,我们可以在阿里云镜像仓库获取镜像。

现在,我们再来验证一把。我们通过 docker pull 拉取镜像,并运行。

docker pull registry.cn-hangzhou.aliyuncs.com/lianggzone/jib-springboot:v1
docker run -p 8080:8080 --name jib-springboot -it registry.cn-hangzhou.aliyuncs.com/lianggzone/jib-springboot:v1 /bin/bash

执行结果,如下所示。

现在,我们访问 http://localhost:8080/blog ,我们可以正常调用 API 接口了。

3. 构建一个 WAR 工程

Jib 还支持 WAR 项目。如果 Maven 项目使用 war-packaging 类型,Jib 将默认使用 distroless Jetty 作为基础镜像来部署项目。要使用不同的基础镜像,我们可以自定义 &lt;container&gt;&lt;appRoot&gt;   , &lt;container&gt; &lt;entrypoint&gt; 和 &lt;container&gt; &lt;args&gt; 。以下是使用 Tomcat 镜像的案例。

<configuration><from><image>tomcat:8.5-jre8-alpine</image></from><container><appRoot>/usr/local/tomcat/webapps/ROOT</appRoot></container>
</configuration>

三、源码地址

源码地址:https://github.com/lianggzone/jib-samples

附:参考资料

(完,转载请注明作者及出处。)

写在末尾

【服务端思维】:我们一起聊聊服务端核心技术,探讨一线互联网的项目架构与实战经验。同时,拥有众多技术大牛的「后端圈」大家庭,期待你的加入,一群同频者,一起成长,一起精进,打破认知的局限性。

更多精彩文章,尽在「服务端思维」!

转载于:https://blog.51cto.com/10637625/2379227

谷歌助力,快速实现 Java 应用容器化相关推荐

  1. Java 应用容器化最佳实践

    公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你玩转 Linux ! 系统选择 关于最基础的底层镜像, 通常大多数我们只有三种选择: Alpine.Debian.CentOS; 这三者 ...

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

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

  3. 容器云原生DevOps学习笔记——第二期:如何快速高质量的应用容器化迁移

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

  4. 挖财的 Kubernetes 容器化之路

    挖财内部对容器化项目的代号为 K2 (乔戈里峰),乔戈里峰是世界第二高峰,但攀登极富挑战,寓意就是面对挑战,勇攀高峰:).项目从 2016 年 11 月到现在已经有三年的时间了,如今挖财内部测试环境早 ...

  5. 五分钟带你玩转Zabbix6.0容器化HA集群

    图片 蔡斯 | Zabbix开源社区签约专家 Zabbix资深玩家,SRE高级运维,架构师.精通服务组件监控.模板制作及告警治理. 擅长领域:Zabbix API定制化开发,对接企业蓝鲸,JMS保垒机 ...

  6. 谷歌大神为你解释Kubernetes, 微服务和容器化

    来自谷歌云平台(Google Cloud Platform)的开发者布道师 Ray Tsang 和 Bret McGowen 在 SpringOne2GX 大会上分享了谷歌的 Kubernetes 的 ...

  7. EDAS 4.0 助力企业一站式实现微服务架构转型与 K8s 容器化升级

    作者:安绍飞 审核&校对:营火 编辑&排版:雯燕 前言 近年来,企业的数字化随着互联网的普及发展越来越快,技术架构也是几经更迭,尤其是在线业务部分.最开始企业的需求就是将业务尽可能在线 ...

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

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

  9. 深入理解容器技术——聊聊服务容器化三大助力

    服务容器化三大助力 我们都知道,微服务的落地有众多需求,容器化技术是它的不二之选,容器化通过三大助力来实现了微服务落地的众多需求: 码头林立--各种软硬件平台层出不穷 容器化解决方案具有一个普适性,它 ...

最新文章

  1. (001) RN开发之Mac搭建开发环境
  2. jvm七:数组创建本质
  3. 【LeetCode从零单排】No.9 Palindrome Number
  4. 论面向组合子程序设计方法 之 重构2
  5. 4 交换机-fanout(订阅发布模式)
  6. java.io.IOException: Broken pipe 的异常处理
  7. qmediaplayer获取流类型_Java 流API
  8. mitmproxy https抓包的原理是什么?
  9. (第八章)左右外连接
  10. 如何强制子div为父div的高度的100%而不指定父级的高度?
  11. 微软 SQL Server 2016 SP1 开发者版入驻 Windows 容器
  12. 波司登杯2013微软office应用创意大赛烟台大学校园赛参赛历程
  13. 【javascript】字符串逆序输出
  14. win7查找计算机图片,win7电脑图片查看器丢失了的修复教程
  15. linux安装键盘鼠标失灵,在archlinux安装界面这卡住了,鼠标键盘失灵
  16. RocketMq_02_消息队列及角色
  17. Newcoder Wannafly13 B Jxy军训(费马小定理、分数在模意义下的值)
  18. python 黑魔法_Python “黑魔法” 之 Meta Classes
  19. c11计算机考试,2015年计算机二级考试C++备考练习试题及答案(6)
  20. CSP 202109-2 非零段划分

热门文章

  1. 预训练后性能反而变差,自训练要取代预训练了吗?
  2. Reddit高赞:机器学习领域「八宗罪」!同行评审变味,盲目崇拜盛行
  3. Gartner 「RPA市场竞争格局」:中国厂商首次进入国际视野
  4. 「AI初识境」为了围剿SGD大家这些年想过的那十几招
  5. 世界顶级摄影作品,构图的最高境界!
  6. 人工智能成热点,斯坦福华人女教授提出这观点,研究院因她成立!
  7. Python 的面向对象
  8. CTO集体怒吼:我到底要不要继续写代码(下篇)
  9. 关于TensorFlow你需要了解的9件事
  10. 作为产品经理,你需要了解的基本算法知识和实操