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技術棧第一時間推送。
本文所有實戰源碼已上傳到這個倉庫:
覺得不錯,在看、分享轉發一下,寫文章不易,需要你們的鼓勵,感謝各位老鐵們!