原文地址:梁桂钊的博客

博客地址: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 类。

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

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

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <groupId>com.lianggzone.sample.lib</groupId>
  5. <artifactId>helloworld-samples</artifactId>
  6. <version>0.1</version>
  7. <packaging>jar</packaging>
  8. <name>helloworld-samples</name>
  9. <properties>
  10. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  11. <jib-maven-plugin.version>1.0.2</jib-maven-plugin.version>
  12. <maven-compiler-plugin.version>3.8.0</maven-compiler-plugin.version>
  13. </properties>
  14. <dependencies>
  15. </dependencies>
  16. <build>
  17. <plugins>
  18. <plugin>
  19. <groupId>org.apache.maven.plugins</groupId>
  20. <artifactId>maven-compiler-plugin</artifactId>
  21. <version>${maven-compiler-plugin.version}</version>
  22. <configuration>
  23. <source>1.8</source>
  24. <target>1.8</target>
  25. </configuration>
  26. </plugin>
  27. <!-- Jib -->
  28. <plugin>
  29. <groupId>com.google.cloud.tools</groupId>
  30. <artifactId>jib-maven-plugin</artifactId>
  31. <version>${jib-maven-plugin.version}</version>
  32. <configuration>
  33. <from>
  34. <image>registry.cn-hangzhou.aliyuncs.com/lianggzone/oracle_java8</image>
  35. </from>
  36. <to>
  37. <image>registry.cn-hangzhou.aliyuncs.com/lianggzone/jib-helloworld:v1</image>
  38. </to>
  39. <container>
  40. <jvmFlags>
  41. <jvmFlag>-Xms512m</jvmFlag>
  42. <jvmFlag>-Xdebug</jvmFlag>
  43. </jvmFlags>
  44. <mainClass>com.lianggzone.HelloWorld</mainClass>
  45. </container>
  46. </configuration>
  47. <executions>
  48. <execution>
  49. <phase>package</phase>
  50. <goals>
  51. <goal>build</goal>
  52. </goals>
  53. </execution>
  54. </executions>
  55. </plugin>
  56. </plugins>
  57. </build>
  58. </project>

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

  1. mvn compile jib:build

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

  1. <settings>
  2. ...
  3. <servers>
  4. ...
  5. <server>
  6. <id>registry.cn-hangzhou.aliyuncs.com</id>
  7. <username>你的阿里云账号</username>
  8. <password>你的阿里云密码</password>
  9. </server>
  10. </servers>
  11. </settings>

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

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

  1. docker pull registry.cn-hangzhou.aliyuncs.com/lianggzone/jib-helloworld:v1
  2. 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/。现在,我们首先需要搭建一个工程,并创建一个启动类。

  1. @SpringBootApplication
  2. public class Application {
  3. public static void main(String[] args) {
  4. SpringApplication.run(Application.class, args);
  5. }
  6. }

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

  1. @RestController
  2. public class WebController {
  3. @RequestMapping("/blog")
  4. public String index() {
  5. return "http://blog.720ui.com";
  6. }
  7. }

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

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.1.2.RELEASE</version>
  9. </parent>
  10. <groupId>com.lianggzone.sample.lib</groupId>
  11. <artifactId>springboot-samples</artifactId>
  12. <version>0.1</version>
  13. <packaging>jar</packaging>
  14. <name>springboot-samples</name>
  15. <dependencies>
  16. <dependency>
  17. <groupId>org.springframework.boot</groupId>
  18. <artifactId>spring-boot-starter-web</artifactId>
  19. </dependency>
  20. </dependencies>
  21. <properties>
  22. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  23. <jib-maven-plugin.version>1.0.2</jib-maven-plugin.version>
  24. <maven-compiler-plugin.version>3.8.0</maven-compiler-plugin.version>
  25. </properties>
  26. <build>
  27. <plugins>
  28. <plugin>
  29. <groupId>org.apache.maven.plugins</groupId>
  30. <artifactId>maven-compiler-plugin</artifactId>
  31. <version>${maven-compiler-plugin.version}</version>
  32. <configuration>
  33. <source>1.8</source>
  34. <target>1.8</target>
  35. </configuration>
  36. </plugin>
  37. <!-- Jib -->
  38. <plugin>
  39. <groupId>com.google.cloud.tools</groupId>
  40. <artifactId>jib-maven-plugin</artifactId>
  41. <version>${jib-maven-plugin.version}</version>
  42. <configuration>
  43. <from>
  44. <image>registry.cn-hangzhou.aliyuncs.com/lianggzone/oracle_java8</image>
  45. </from>
  46. <to>
  47. <image>registry.cn-hangzhou.aliyuncs.com/lianggzone/jib-springboot:v1</image>
  48. </to>
  49. <container>
  50. <jvmFlags>
  51. <jvmFlag>-Xms512m</jvmFlag>
  52. <jvmFlag>-Xdebug</jvmFlag>
  53. </jvmFlags>
  54. </container>
  55. </configuration>
  56. <executions>
  57. <execution>
  58. <phase>package</phase>
  59. <goals>
  60. <goal>build</goal>
  61. </goals>
  62. </execution>
  63. </executions>
  64. </plugin>
  65. </plugins>
  66. </build>
  67. </project>

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

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

  1. docker pull registry.cn-hangzhou.aliyuncs.com/lianggzone/jib-springboot:v1
  2. 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 作为基础镜像来部署项目。要使用不同的基础镜像,我们可以自定义 <container><appRoot>   , <container> <entrypoint> 和 <container> <args> 。以下是使用 Tomcat 镜像的案例。

  1. <configuration>
  2. <from>
  3. <image>tomcat:8.5-jre8-alpine</image>
  4. </from>
  5. <container>
  6. <appRoot>/usr/local/tomcat/webapps/ROOT</appRoot>
  7. </container>
  8. </configuration>

三、源码地址

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

附:参考资料

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

写在末尾

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

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

谷歌助力,快速实现 Java 应用容器化的更多相关文章

  1. 利用Google开源Java容器化工具Jib构建镜像

    转载:https://blog.csdn.net/u012562943/article/details/80995373 一.前言 容器的出现让Java开发人员比以往任何时候都更接近“编写一次,到处运 ...

  2. 新一代Java程序员必学的Docker容器化技术基础篇

    Docker概述 **本人博客网站 **IT小神 www.itxiaoshen.com Docker文档官网 Docker是一个用于开发.发布和运行应用程序的开放平台.Docker使您能够将应用程序与 ...

  3. Java 服务 Docker 容器化最佳实践

    转载自:https://mp.weixin.qq.com/s/d2PFISYUy6X6ZAOGu0-Kig 1. 概述 当我们在容器中运行 Java 应用程序时,可能希望对其进行调整参数以充分利用资源 ...

  4. jmx_prometheus_javaagent+prometheus+alertmanager+grafana完成容器化java监控告警(二)

    一.拓扑图 二.收集数据 2.1前期准备 创建共享目录,即为了各节点都创建该目录,有两个文件,做数据共享 /home/target/prom-jvm-demo 1.下载文件 jmx_prometheu ...

  5. Coding-Job:从研发到生产的容器化融合实践

    大家好,我是来自 CODING 的全栈开发工程师,我有幸在 CODING 参与了 Coding-Job 这个容器化的编排平台的研发.大家对 CODING 可能比较了解, Coding.net 是一个一 ...

  6. JAVA同步容器和并发容器

    同步容器类 同步容器类的创建 在早期的JDK中,有两种现成的实现,Vector和Hashtable,可以直接new对象获取: 在JDK1.2中,引入了同步封装类,可以由Collections.sync ...

  7. Java集合容器简介

    Java集合容器主要有以下几类: 1,内置容器:数组 2,list容器:Vetor,Stack,ArrayList,LinkedList, CopyOnWriteArrayList(1.5),Attr ...

  8. java并发容器(Map、List、BlockingQueue)

    转发: 大海巨浪 Java库本身就有多种线程安全的容器和同步工具,其中同步容器包括两部分:一个是Vector和Hashtable.另外还有JDK1.2中加入的同步包装类,这些类都是由Collectio ...

  9. 微服务SpringCloud容器化案例

    前言 当我们在使用微服务的时候,那么有一个问题一定会困扰我们,那就是项目的测试和部署.因为在单体应用下,部署项目很简单,直接打包启动就可以了,而对于微服务来说,因为有各个组件的存在所以让测试和部署都变 ...

随机推荐

  1. CF #541 E. String Multiplication

    题意: 给定一系列字符串,每次都是后一个字符串和前面的融合,这个融合操作就是原来的串分成独立的,然后把新串插入到这些空格中.问最后,最长的相同连续的长度. 思路: 这道题可以贪心的来,我们压缩状态,记 ...

  2. P3355 骑士共存问题 二分建图 + 当前弧优化dinic

    P3355 骑士共存问题 题意: 也是一个棋盘,规则是“马”不能相互打到. 思路: 奇偶点分开,二分图建图,这道题要注意每个点可以跑八个方向,两边都可以跑,所以边 = 20 * n * n. 然后di ...

  3. 洛谷P1217回文质数-Prime Palindrome回溯

    P1217 [USACO1.5]回文质数 Prime Palindromes 题意:给定一个区间,输出其中的回文质数: 学习了洛谷大佬的回溯写法,感觉自己写回溯的能力不是很强: #include &l ...

  4. hihocoder #1617 : 方格取数(dp)

    题目链接:http://hihocoder.com/problemset/problem/1617 题解:一道递推的dp题.这题显然可以考虑两个人同时从起点出发这样就不会重复了设dp[step][i] ...

  5. hdu 1503 Advanced Fruits 最长公共子序列 *

    Advanced Fruits Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  6. MongoDb 快速翻页方法

    翻阅数据是MongoDB最常见的操作之一.一个典型的场景是需要在你的用户界面中显示你的结果.如果你是批量处理的数据,同样重要的是要让你的分页策略正确,以便你的数据处理可以规模化. 接下来,让我们通过一 ...

  7. Mysql InnoDB引擎下 事务的隔离级别

    mysql InnoDB 引擎下事物学习 建表user CREATE TABLE `user` ( `uid` bigint(20) unsigned NOT NULL AUTO_INCREMENT, ...

  8. Elasticsearch在Java中的增删改查

    public class ElasticAPI { private static RestClient restClient; static { restClient=RestClient.build ...

  9. windows update自启动解决方法

    win+r打开运行,输入services.msc打开服务面板 找到Windows update服务,将常规选项卡的启动类型改为禁用,然后选择恢复选项卡,将三个失败选项都改为无操作 win+r打开运行, ...

  10. [币严区块链]USDT钱包节点搭建

    USDT是基于BTC发的稳定币,它是比特币的一条侧链,说简单点,就是在比特币区块数据的不可篡改性与区块唯一性的基础上,再封装了一层.具体原理可网上查资料.总之理解一点:USDT的钱包节点就是BTC的钱 ...