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

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

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

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

一、什么是 Jib

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

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

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

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

二、实战出真知

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.     } 

紧接着,我们再创建一个 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 的项目。现在,我们首先需要搭建一个工程,并创建一个启动类。

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

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

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

紧接着,我们再创建一个 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.  
  6.     <parent> 
  7.         <groupId>org.springframework.boot</groupId> 
  8.         <artifactId>spring-boot-starter-parent</artifactId> 
  9.         <version>2.1.2.RELEASE</version> 
  10.     </parent> 
  11.  
  12.     <groupId>com.lianggzone.sample.lib</groupId> 
  13.     <artifactId>springboot-samples</artifactId> 
  14.     <version>0.1</version> 
  15.     <packaging>jar</packaging> 
  16.     <name>springboot-samples</name> 
  17.  
  18.     <dependencies> 
  19.         <dependency> 
  20.             <groupId>org.springframework.boot</groupId> 
  21.             <artifactId>spring-boot-starter-web</artifactId> 
  22.         </dependency> 
  23.     </dependencies> 
  24.  
  25.     <properties> 
  26.         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
  27.         <jib-maven-plugin.version>1.0.2</jib-maven-plugin.version> 
  28.         <maven-compiler-plugin.version>3.8.0</maven-compiler-plugin.version> 
  29.     </properties> 
  30.  
  31.     <build> 
  32.         <plugins> 
  33.             <plugin> 
  34.                 <groupId>org.apache.maven.plugins</groupId> 
  35.                 <artifactId>maven-compiler-plugin</artifactId> 
  36.                 <version>${maven-compiler-plugin.version}</version> 
  37.                 <configuration> 
  38.                     <source>1.8</source> 
  39.                     <target>1.8</target> 
  40.                 </configuration> 
  41.             </plugin> 
  42.             <!-- Jib --> 
  43.             <plugin> 
  44.                 <groupId>com.google.cloud.tools</groupId> 
  45.                 <artifactId>jib-maven-plugin</artifactId> 
  46.                 <version>${jib-maven-plugin.version}</version> 
  47.                 <configuration> 
  48.                     <from> 
  49.                         <image>registry.cn-hangzhou.aliyuncs.com/lianggzone/oracle_java8</image> 
  50.                     </from> 
  51.                     <to> 
  52.                         <image>registry.cn-hangzhou.aliyuncs.com/lianggzone/jib-springboot:v1</image> 
  53.                     </to> 
  54.                     <container> 
  55.                         <jvmFlags> 
  56.                             <jvmFlag>-Xms512m</jvmFlag> 
  57.                             <jvmFlag>-Xdebug</jvmFlag> 
  58.                         </jvmFlags> 
  59.                     </container> 
  60.                 </configuration> 
  61.                 <executions> 
  62.                     <execution> 
  63.                         <phase>package</phase> 
  64.                         <goals> 
  65.                             <goal>build</goal> 
  66.                         </goals> 
  67.                     </execution> 
  68.                 </executions> 
  69.             </plugin> 
  70.         </plugins> 
  71.     </build> 
  72. </project> 

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

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

现在,我们再来验证一把。我们通过 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 

执行结果,如下所示。

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

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

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

3. 构建一个 WAR 工程

相关推荐