1. 程式人生 > >使用 Docker 部署 Spring Boot 專案,帶勁!!

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

上一篇:[年輕人的第一個 Docker 應用](https://mp.weixin.qq.com/s/k2ShhlAMplbwGap0eOUJuQ) Docker 一次構建、處處執行及快速啟停的特性,在微服務架構中有著舉足輕重的地位,具體的概念性的東西就不介紹了,不懂的點選[這裡](https://mp.weixin.qq.com/s/FOHTnaI3-xjIuKn_1OsVXg)閱讀 Docker 基礎教程。 本篇棧長主要介紹下如何通過 IntelliJ IDEA、Maven 來操作 Docker 部署 Spring Boot 專案,這也是我們 Java 程式設計師最關心的開發實戰。 ## 一、Maven 外掛配置 首先在 Maven pom.xml 配置檔案中加入 Docker 的 Maven 外掛。 我看網上很多人還在用 `docker-maven-plugin` 外掛: ``` ``` 你們還在用這個外掛嗎? 棧長從官方倉庫看到,這個外掛官方已經不維護了: ![](https://img2020.cnblogs.com/other/1218593/202011/1218593-20201125110759954-740132253.png) 所以這個外掛我就不推薦大家使用了,而是推薦官方的另外一個外掛:**dockerfile-maven**。 ``` ``` 這個外掛使用簡單,功能更強大。 **新外掛地址:** > 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 中可以直接點選外掛對應的命令執行: ![](https://img2020.cnblogs.com/other/1218593/202011/1218593-20201125110800421-130407749.png) ![](https://img2020.cnblogs.com/other/1218593/202011/1218593-20201125110800825-347122097.png) 外掛會根據 Dockerfile 檔案構建,檔案中有多少條命令,就分為幾個步驟構建,如果沒問題就會構建成功。 ## 五、IDEA 怎麼操作 Docker? 一旦我們建立了 Dockerfile 檔案,IDEA 就會自動識別並提示我們建立 Docker 連線,當然,我們也可以調出 Services 面板進行手動建立。 開啟 IDEA 中的 Services 面板: ![](https://img2020.cnblogs.com/other/1218593/202011/1218593-20201125110801095-1887163015.png) 然後點選 Add service > Docker Connection 來新增一個 Docker 連線: ![](https://img2020.cnblogs.com/other/1218593/202011/1218593-20201125110801460-585484170.png) 建立完後會自動連線上,點選展開會顯示 Docker 本地所有映象和容器: ![](https://img2020.cnblogs.com/other/1218593/202011/1218593-20201125110801885-460349200.png) 如上圖所示,就是我們剛構建的映象。 ## 六、建立並執行容器 右擊上面的映象,選擇 "Create Container" 選單來建立並執行一個容器。 ![](https://img2020.cnblogs.com/other/1218593/202011/1218593-20201125110802395-804908147.png) 填寫相應的執行引數,再點選執行按鈕,容器即開始執行。 然後在 Build Log 和 Log 面板中可以看到容器執行日誌和應用程式執行日誌: ![](https://img2020.cnblogs.com/other/1218593/202011/1218593-20201125110802893-1534958483.png) ![](https://img2020.cnblogs.com/other/1218593/202011/1218593-20201125110803642-553814867.png) 專案在 Docker 中執行起來了,然後再訪問下上面寫的測試介面: > http://localhost:8080/docker/hello ![](https://img2020.cnblogs.com/other/1218593/202011/1218593-20201125110804026-1355855209.png) 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 個新特性,重新整理你的認知!!](http://www.javastack.cn/article/2020/java15-released/) 2.[終於靠開源專案弄到 IntelliJ IDEA 啟用碼了,真香!](http://www.javastack.cn/article/2020/intellij-idea-by-open-source-project/) 3.[我用 Java 8 寫了一段邏輯,同事直呼看不懂,你試試看。。](http://www.javastack.cn/article/2020/java-8-optional-map-do-you-know/) 4.[吊打 Tomcat ,Undertow 效能很炸!!](http://www.javastack.cn/article/2020/undertow-introduce-with-spring-boot/) 5.[《Java開發手冊(嵩山版)》最新發布,速速下載!](http://www.javastack.cn/article/2020/alibaba-release-java-develop-rules-songshan/) 覺得不錯,別忘了隨手點贊+轉發哦!