使用 Docker 部署 Spring Boot 專案,帶勁!!

Java技術棧發表於2020-11-25

上一篇:年輕人的第一個 Docker 應用

Docker 一次構建、處處執行及快速啟停的特性,在微服務架構中有著舉足輕重的地位,具體的概念性的東西就不介紹了,不懂的點選這裡閱讀 Docker 基礎教程。

本篇棧長主要介紹下如何通過 IntelliJ IDEA、Maven 來操作 Docker 部署 Spring Boot 專案,這也是我們 Java 程式設計師最關心的開發實戰。

一、Maven 外掛配置

首先在 Maven pom.xml 配置檔案中加入 Docker 的 Maven 外掛。

我看網上很多人還在用 docker-maven-plugin 外掛:

<properties>
    <docker.image.prefix>docker</docker.image.prefix>
</properties>

<build>
    <plugins>
        <plugin>
            <groupId>com.spotify</groupId>
            <artifactId>docker-maven-plugin</artifactId>
            <version>1.2.2</version>
            <configuration>
                <imageName>${docker.image.prefix}/${project.artifactId}</imageName>
                <dockerDirectory>src/main/docker</dockerDirectory>
                <resources>
                    <resource>
                        <targetPath>/</targetPath>
                        <directory>${project.build.directory}</directory>
                        <include>${project.build.finalName}.jar</include>
                    </resource>
                </resources>
            </configuration>
        </plugin>
    </plugins>
</build>

你們還在用這個外掛嗎?

棧長從官方倉庫看到,這個外掛官方已經不維護了:

所以這個外掛我就不推薦大家使用了,而是推薦官方的另外一個外掛:dockerfile-maven

<build>
    <plugins>
        <plugin>
            <groupId>com.spotify</groupId>
            <artifactId>dockerfile-maven-plugin</artifactId>
            <version>1.4.13</version>
            <executions>
                <execution>
                    <id>default</id>
                    <goals>
                        <goal>build</goal>
                        <goal>push</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <repository>javastack/${project.name}</repository>
                <tag>${project.version}</tag>
                <buildArgs>
                    <JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
                </buildArgs>
                <dockerfile>src/main/docker/Dockerfile</dockerfile>
            </configuration>
        </plugin>
    </plugins>
</build>

這個外掛使用簡單,功能更強大。

新外掛地址:

https://github.com/spotify/dockerfile-maven

最新版外掛的環境要求:

  • JDK 7+

  • Apache Maven 3.5.2+

這個外掛的牛逼之處在於:

1、從外掛名稱就可以知道,這個外掛是基於 Dockerfile 檔案進行構建 Docker 專案的,專注 Dockerfile 檔案,所以需要一個 Dockerfile 檔案,Dockerfile 也是構建 Docker 專案的基石。

2、把 Docker 的構建過程整合到了 Maven 的構建過程之中,如果使用預設的配置,使用 mvn package 命令就能打包成一個 Docker 映象,使用 mvn deploy 命令就能推送到 Docker 倉庫。

3、使我們的構建目標更明確,如我們先使用 mvn dockerfile:build 然後再 mvn dockerfile:tag,然後再 mvn dockerfile:push,也可以滿足同時構建再推送的場景,如: mvn dockerfile:build dockerfile:push,這都沒問題的。

4、與 Maven 構建整合,我們可以在一個專案中依賴另外一個專案的 Docker 映象,Maven 將以正確的順序構建專案。當我們執行涉及多個服務的整合測試用例時,這很有用的。

二、Docker 配置

Dockerfile 是建立 Docker 映象的基本配置檔案,本身是一個文字檔案。

外掛預設載入位置為專案所在根目錄,因為我在上面的 Maven 外掛配置中指明瞭路徑。所以,在 src/main/docker/ 目錄下新增一個 Dockerfile 檔案:

# 新增 Java 8 映象來源
FROM java:8

# 新增引數
ARG JAR_FILE

# 新增 Spring Boot 包
ADD target/${JAR_FILE} app.jar

# 執行啟動命令
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

值得說一下的是,上面的 JAR_FILE 引數就是從 Docker Maven 外掛中指定的構建引數,這也是這個外掛的強大之處,可以翻到文章上面去看一下。

具體的 Dockerfile 檔案細節比較多,這裡就不展開詳細介紹了,後面我再開一篇單獨介紹,關注公眾號Java技術棧第一時間推送。

三、新增測試介面

新增一個測試介面,以便後面部署測試。

package cn.javastack.springboot.docker;

import org.springframework.boot.Banner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 微信公眾號:Java技術棧
 */
@RestController
@SpringBootApplication
public class DockerApplication {

    public static void main(String[] args) {
        SpringApplication.run(DockerApplication.class);
    }

    @GetMapping("/docker/hello")
    public String helloDocker() {
        return "hello docker";
    }

}

Spring Boot 基礎性的知識和搭建過程就不介紹了,不熟悉的可以關注公眾號Java技術棧,在後臺回覆關鍵字 "boot" 閱讀我之前寫的系列教程。

所有 Spring Boot 教程實戰原始碼在下面個倉庫:

https://github.com/javastacks/spring-boot-best-practice

本篇所有實戰原始碼到時也會全部同步到上面,大家 Star 一下吧!

四、構建 Docker 映象

配置了 Maven 外掛和 Dockerfile 檔案後就可以開始構建 Docker 映象了。

上面也說了,Docker 構建過程已經整合到了 Maven 的構建過程之中,那麼可以直接使用 mvn package 就可以同時打包和構建 Docker 映象了。

在 IDEA 中可以直接點選外掛對應的命令執行:

外掛會根據 Dockerfile 檔案構建,檔案中有多少條命令,就分為幾個步驟構建,如果沒問題就會構建成功。

五、IDEA 怎麼操作 Docker?

一旦我們建立了 Dockerfile 檔案,IDEA 就會自動識別並提示我們建立 Docker 連線,當然,我們也可以調出 Services 皮膚進行手動建立。

開啟 IDEA 中的 Services 皮膚:

然後點選 Add service > Docker Connection 來新增一個 Docker 連線:

建立完後會自動連線上,點選展開會顯示 Docker 本地所有映象和容器:

如上圖所示,就是我們剛構建的映象。

六、建立並執行容器

右擊上面的映象,選擇 "Create Container" 選單來建立並執行一個容器。

填寫相應的執行引數,再點選執行按鈕,容器即開始執行。

然後在 Build Log 和 Log 皮膚中可以看到容器執行日誌和應用程式執行日誌:

專案在 Docker 中執行起來了,然後再訪問下上面寫的測試介面:

http://localhost:8080/docker/hello

OK,到這裡就部署並執行成功了。

七、總結

本文棧長使用 IntelliJ IDEA、Maven 用 Docker 部署了一個 Spring Boot 專案,雖然只是一個簡單的示例,但同時為了配合寫文章,全程硬是肝了幾個小時。

本文只是一個簡單的示例,所以過程並不複雜,想要構建更加複雜的應用,我們需要學習 Dockerfile 檔案的編寫,這個下期再分享吧,關注公眾號Java技術棧第一時間推送,不要走開。

如果只是執行一個 Spring Boot 應用確實沒有必要用到 Docker,本文也是為了演示而上了 Docker。

但在實際工作中,Docker 就很有用了,Docker 一次將應用程式碼、JDK、環境變數、配置檔案、以及其他配置資訊都打包到一個映象裡面了,一次構建,處處執行,所以再也不用擔心環境和配置問題了,開發測試運維都爽死。

好了,本文就到這裡了,後續棧長還會帶來更多 Docker 實用性的教程,比如 Docker 私庫的搭建及其他實用的玩法等,關注公眾號Java技術棧第一時間推送。

本文所有實戰原始碼已上傳到這個倉庫:

https://github.com/javastacks/spring-boot-best-practice

覺得不錯,在看、分享轉發一下,寫文章不易,需要你們的鼓勵,感謝各位老鐵們!

版權申明:本文系公眾號 "Java技術棧" 原創,原創實屬不易,轉載、引用本文內容請註明出處,禁止抄襲、洗稿,請自重,尊重他人勞動成果和智慧財產權。

近期熱文推薦:

1.Java 15 正式釋出, 14 個新特性,重新整理你的認知!!

2.終於靠開源專案弄到 IntelliJ IDEA 啟用碼了,真香!

3.我用 Java 8 寫了一段邏輯,同事直呼看不懂,你試試看。。

4.吊打 Tomcat ,Undertow 效能很炸!!

5.《Java開發手冊(嵩山版)》最新發布,速速下載!

覺得不錯,別忘了隨手點贊+轉發哦!

相關文章