Spring Boot2 系列教程(四十二)使用 Jib 部署 Spring Boot

  • 2019 年 12 月 21 日
  • 筆記

之前松哥和大家分享過一篇將 Spring Boot 項目部署到遠程 Docker 上的文章:

但是這種部署有一個問題,就是一個小小的 helloworld 構建成鏡像之後,竟然都有 660 MB+,這就有點過分了;而且這種方式步驟繁瑣,很多人看了頭大。

因此松哥今天想再和大家聊一聊另外一種方案 Jib,這是Google開源的一個容器化運行方案,使用它我們將 Spring Boot 進行容器化部署只要兩步:

  • 第一步配置 Maven Plugin
  • 第二步構建

我們一起來看看。

Jib

在之前那篇文章中,我們將 Spring Boot 項目進行容器化部署,要求開發人員要有一定的 Docker 技能作為支撐,然而在實際開發中,並非每個人都是 Docker 專家,或者說會用 Docker。

有鑒於此,Google 搞出來一個 Jib,使 Spring Boot 容器化部署變得更加簡便,開發人員可以不需要任何 Docker 相關的技能,就能將 Spring Boot 項目構建成 Docker 中的鏡像,而且還可以「順便」將鏡像 push 到 register 上,極大的簡化了部署過程。

Jib 使用 Java 開發,使用也非常簡單,可以作為 Maven 或者 Gradle 的插件直接集成到我們的項目中。它利用鏡像分層和註冊錶快取來實現快速、增量的構建。Jib 會自動讀取項目的構建配置,程式碼組織到不同的層(依賴項、資源、類)中,然後它只會重新構建和推送發生變更的層。在項目進行快速迭代時,Jib 只將發生變更的層推送到 registers 來縮短構建時間。

好了,大致了解了 Jib 之後,接下來我們來看看 Jib 要怎麼使用。

準備工作

Jib 可以直接將構建好的鏡像 push 到 registers 上,如果公司有自己的私有鏡像站的話,可以直接推送到私有鏡像站上,本文我就將構建好的鏡像推送到官方的 Docker Hub 上,因此需要大家提前準備一個 Docker Hub 的帳號,帳號大家可以直接去 Docker Hub 上面註冊(https://hub.docker.com/),大家要是對 Docker Hub 這些東西不了解,可以在公眾號後台回復 docker,獲取松哥自製的 Docker 教程。

牛刀小試

首先我們來創建一個 Spring Boot 工程,創建時只需要添加一個 Web 依賴即可:

項目創建成功後,添加一個 HelloController 用來做測試:

@RestController  public class HelloController {      @GetMapping("/hello")      public String hello() {          return "hello jib";      }  }

然後,在 pom.xml 中添加上 Jib 的插件,如下:

<plugin>      <groupId>com.google.cloud.tools</groupId>      <artifactId>jib-maven-plugin</artifactId>      <version>1.7.0</version>      <configuration>          <from>              <image>openjdk:alpine</image>          </from>          <to>              <image>docker.io/wongsung/dockerjib</image>              <tags>                  <tag>v1</tag>              </tags>              <auth>                  <username>wongsung</username>                  <password>你的密碼</password>              </auth>          </to>      </configuration>      <executions>          <execution>              <phase>package</phase>              <goals>                  <goal>build</goal>              </goals>          </execution>      </executions>  </plugin>

關於這段配置,我說如下幾點:

  1. 首先就是版本號的問題,我這裡使用的是 1.7.0 ,網上有的教程比較老,用的 0.x 的版本,老的版本在配置 Docker 認證的時候非常麻煩,所以版本這塊建議大家使用當前最新版。
  2. from 中的配置表示本鏡像構建所基於的根鏡像為 openjdk:alpine
  3. to 中的配置表示本鏡像構建完成後,要發布到哪裡去,如果是發布到私有鏡像站,就寫自己私有鏡像站的地址,如果是發布到 Docker Hub 上,就參考我這裡的寫法 docker.io/wongsung/dockerjib,其中 wongsung 表示你在 Docker Hub 上註冊的用戶名,dockerjib 表示你鏡像的名字,可以隨意取。
  4. tags 中配置的是自己鏡像的版本。
  5. auth 中配置你在 Docker Hub 上的用戶名/密碼。
  6. executions 節點中的就是常規配置了,我就不再多說了。

配置完成後,在命令行執行如下命令將當前下項目構建成一個 Docker 鏡像並 push 到 Docker Hub:

mvn compile jib:build

構建完成後,我們在 Docker Hub 上就能看到自己的鏡像了:

接下來,啟動 Docker ,在 Docker 中執行如下命令拉取鏡像下來並運行:

docker run -d --name mydockerjib -p 8080:8080 docker.io/wongsung/dockerjib:v1

啟動成功後,我們在瀏覽器中就可以直接訪問我們剛才的 Spring Boot 項目中的 hello 介面了:

是不是很方便?比我第一次給大家介紹的方案要方便很多。

注意

這種方式是將項目構建成鏡像後並 push 到 registers 上,這種構建方式不需要你本地安裝 Docker,如果你需要在本地運行鏡像,那當然需要 Docker,單純的構建是不需要 Docker 環境的。

本地構建

如果你電腦本地剛好安裝了 Docker ,有 Docker 環境,那麼也可以將項目構建成本地 Docker 的鏡像,

首先我們來查看一下本地鏡像:

可以看到只有 MySQL 鏡像,然後我們執行如下命令構建本地鏡像:

mvn compile jib:dockerBuild

看到如下構建日誌資訊表示構建成功:

構建完成後,我們再來看本地鏡像:

可以都看到,已經構建成功了,接下來啟動命令和上面一樣,我就不重複展示了。

結語

容器的出現,讓我們的 Java 程式比任何時候都接近「一次編寫,到處運行」,Spring Boot 容器化部署也是越來越方便,後面有空松哥再和大家聊聊結合 jenkins 的用法,好了,本文的案例我已經上傳到 GitHub:https://github.com/lenve/javaboy-code-samples,有問題歡迎留言討論。

1、Spring Boot2 系列教程(一)純 Java 搭建 SSM 項目

2、Spring Boot2 系列教程(二)創建 Spring Boot 項目的三種方式

3、Spring Boot2 系列教程(三)理解 spring-boot-starter-parent

4、Spring Boot2 系列教程(四)理解配置文件 application.properties !

5、Spring Boot2 系列教程(五)Spring Boot中的 yaml 配置

6、Spring Boot2 系列教程(六)自定義 Spring Boot 中的 starter

7、Spring Boot2 系列教程(七)理解自動化配置的原理

8、Spring Boot2 系列教程(八)Spring Boot 中配置 Https

9、Spring Boot2 系列教程(九)Spring Boot 整合 Thymeleaf

10、Spring Boot2 系列教程(十)Spring Boot 整合 Freemarker

11、Spring Boot2 系列教程(十一)Spring Boot 中的靜態資源配置

12、Spring Boot2 系列教程(十二)@ControllerAdvice 的三種使用場景

13、Spring Boot2 系列教程(十三)Spring Boot 中的全局異常處理

14、Spring Boot2 系列教程(十四)CORS 解決跨域問題

15、Spring Boot2 系列教程(十五)定義系統啟動任務的兩種方式

16、Spring Boot2 系列教程(十六)定時任務的兩種實現方式

17、Spring Boot2 系列教程(十七)SpringBoot 整合 Swagger2

18、Spring Boot2 系列教程(十八)Spring Boot 中自定義 SpringMVC 配置

19、Spring Boot2 系列教程(十九)Spring Boot 整合 JdbcTemplate

20、Spring Boot2 系列教程(二十)Spring Boot 整合JdbcTemplate 多數據源

21、Spring Boot2 系列教程(二十一)整合 MyBatis

22、Spring Boot2 系列教程(二十二)整合 MyBatis 多數據源

23、Spring Boot2 系列教程(二十三)理解 Spring Data Jpa

26、Spring Boot2 系列教程(二十六)Spring Boot 整合 Redis

27、Spring Boot2 系列教程(二十七)Nginx 極簡掃盲入門

28、Spring Boot2 系列教程(二十八)Spring Boot 整合 Session 共享

29、Spring Boot2 系列教程(二十九)Spring Boot 整合 Redis

30、Spring Boot2 系列教程(三十)Spring Boot 整合 Ehcache

31、Spring Boot2 系列教程(三十一)Spring Boot 構建 RESTful 風格應用

32、Spring Boot2 系列教程(三十二)Spring Boot 整合 Shiro

33、Spring Boot2 系列教程(三十三)整合 Spring Security

34、Spring Boot2 系列教程(三十四)Spring Security 添加驗證碼

35、Spring Boot2 系列教程(三十五)SpringSecurity 使用 JSON 格式登錄

36、Spring Boot2 系列教程(三十六)SpringSecurity 中角色繼承的坑

37、Spring Boot2 系列教程(三十七)Spring Security 整合 JWT

38、Spring Boot2 系列教程(三十八)Spring Security 非法請求直接返回 JSON

39、Spring Boot2 系列教程(三十九)Spring Boot 熱部署

40、Spring Boot2 系列教程(四十)Spring Boot 可執行 jar 分析

41、Spring Boot2 系列教程(四十一)部署 Spring Boot 到遠程 Docker 容器