谷歌助力,快速實現 Java 應用容器化

Google 在 2018 年下旬開源了一款新的 Java 工具 Jib,可以輕鬆地將 Java 應用程序容器化。通過 Jib,我們不需要編寫 Dockerfile 或安裝 Docker,通過集成到 Maven 或 Gradle 插件,就可以立即將 Java 應用程序容器化。

一、什麼是 Jib

Jib 是一個快速而簡單的容器鏡像構建工具,它作為 Maven 或 Gradle 的一部分運行,不需要編寫 Dockerfile 或運行 Docker 守護進程。它從 Maven 或 Gradle 中構建我們的 Docker 鏡像, 並只將發生變更的層(而不是整個應用程序)推送到註冊表來節省寶貴的構建時間。現在,我們對 Docker 構建流程和 Jib 構建流程進行對比。Docker 構建流程,如下所示。

谷歌助力,快速實現 Java 應用容器化

Jib 構建流程,則是這樣的。

谷歌助力,快速實現 Java 應用容器化

二、實戰出真知

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

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

<image>registry.cn-hangzhou.aliyuncs.com/lianggzone/jib-helloworld:v1/<image>

<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 命令進行自動化構建,它會從 <from> 拉取鏡像,並把生成的鏡像上傳到 設置的地址。這裡,筆者還通過 ` 設置了一些 JVM 參數。

/<from>

mvn compile jib:build

此外,如果”登錄失敗,未授權”,需要通過 docker login 登錄鑑權一下。此外,更好的做法是,你可以考慮在Maven 中放置憑據。

<settings>
...
<servers>
...
<server>
registry.cn-hangzhou.aliyuncs.com
<username>你的阿里雲賬號/<username>
<password>你的阿里雲密碼/<password>
/<server>
/<servers>
/<settings>

最後,執行完成後,我們可以在阿里雲鏡像倉庫獲取鏡像。

谷歌助力,快速實現 Java 應用容器化

大功告成,現在,我們來驗證一把。我們通過 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

執行結果,如下所示。

谷歌助力,快速實現 Java 應用容器化

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 文件。


<project> 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>

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

<image>registry.cn-hangzhou.aliyuncs.com/lianggzone/jib-springboot:v1/<image>

<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 命令進行自動化構建。執行完成後,我們可以在阿里雲鏡像倉庫獲取鏡像。

谷歌助力,快速實現 Java 應用容器化

現在,我們再來驗證一把。我們通過 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

執行結果,如下所示。

谷歌助力,快速實現 Java 應用容器化

現在,我們訪問 http://localhost:8080/blog ,我們可以正常調用 API 接口了。

谷歌助力,快速實現 Java 應用容器化

3. 構建一個 WAR 工程

Jib 還支持 WAR 項目。如果 Maven 項目使用 war-packaging 類型,Jib 將默認使用 distroless Jetty 作為基礎鏡像來部署項目。要使用不同的基礎鏡像,我們可以自定義 <container><approot> , <container> <entrypoint> 和 <container> <args> 。以下是使用 Tomcat 鏡像的案例。/<args>/<container>/<entrypoint>/<container>/<approot>/<container>

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

歡迎工作一到五年的Java工程師朋友們加入Java程序員開發: 721575865

群內提供免費的Java架構學習資料(裡面有高可用、高併發、高性能及分佈式、Jvm性能調優、Spring源碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)合理利用自己每一分每一秒的時間來學習提升自己,不要再用"沒有時間“來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代!


分享到:


相關文章: