在Intellij Idea中使用Docker執行spring-boot應用

在Intellij Idea中使用Docker執行spring-boot應用

有關於在Intellij Idea中使用Docker的文章有很多,但大都是以下的方式

    1. 使用web應用(war包)進行部署的

    2. 在同一個專案下使用Dockerfile

    3. 配置pom.xml將jar檔案到報道Dockerfile目錄下

但實際專案中

    1. 更多的是使用jar包

    2. 希望現有專案能更方便的進行Docker部署,但又不想在原有專案上進行改動

所以,本文基於實際情況,進行一次探索,看看是否可以滿足以上的要求

——————————————–我是分割線—————————————————-

執行環境

Docker for Windows (Windows 10)

第一步:在Intellij Idea中安裝Docker Plugin

這步在很多文章中都有介紹,此處不詳細說明,附圖一張,設定路徑為 File->settings

第二步:構想應用模式

基於“希望現有專案能更方便的進行Docker部署,但又不想在原有專案上進行改動”,我們需要建立2個專案,

一個Springboot專案,我們暫時命名為“spring-boot-maker”,

一個Docker專案,暫時命名為“docker-maker”。

spring-boot-maker專案進行自己的應用開發,不涉及任何docker相關的內容

docker-maker專案,將spring-boot-maker專案做成docker映象(image),並以docker的方式啟動執行。

兩個專案是互相獨立的,無法互相訪問到。

第三步:建立springboot專案

建立springboot專案spring-boot-maker

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         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>docker</groupId>
<artifactId>spring-boot-maker</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.10.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

注意:<build>塊必須要寫,不然打包出的jar無法執行

SpringBootMakerApplication.java (啟動類,很簡單的一個)

package docker.spring.boot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringBootMakerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootMakerApplication.class, args);
}
}

SpringBootMakerController.java (controller類)

package docker.spring.boot.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping(value = "/spring/boot")
public class SpringBootMakerController {
@RequestMapping(value = "/hello/{name}", method = RequestMethod.GET)
@ResponseBody
    public String hello(@PathVariable String name) {
return "hello "   name;
}
}

專案建立完畢,我們啟動,並在瀏覽器中試驗一下,確保應用可以訪問。

第四步:建立Docker專案

spring-boot專案是一個maven專案,而Docker專案就是一個目錄。

我們在專案下建立目錄spring-boot-maker,以表明這是建立給spring-boot-maker專案的。

在spring-boot-maker目錄下建立檔案Dockerfile

由於Dockerfile中的ADD和COPY命令只支援相對路徑,所以無法使用絕對路徑進行操作。

而修改spring-boot-maker專案中的pom.xml檔案,將jar檔案直接打包到Dockerfile所在目錄下,不符合我們”不修改原專案“的初衷。

所以思路是:將spring-boot-maker專案編譯好後打包,將打好包的jar檔案Copy到Dockerfile所在目錄,這些由bat(批處理)檔案執行,Dockerfile執行建立映象(image)的操作。

docker.run.bat

cd /d D:\SourceCode\workspace\test-for-docker\spring-boot-maker
call mvn clean package -U -DskipTests
cd /d %~dp0
del *.jar
copy D:\SourceCode\workspace\test-for-docker\spring-boot-maker\target\spring-boot-maker-*.jar spring-boot-maker-*.jar
ren spring-boot-maker-*.jar spring-boot-maker.jar
docker build -t spring-boot-maker .
docker run -d -p 8080:8080 --name spring-boot-maker spring-boot-maker

Dockerfile

# From java image, version : 8
FROM java:8
# 掛載app目錄
VOLUME /app
# COPY or ADD to image
COPY spring-boot-maker.jar app.jar
RUN bash -c "touch /app.jar"
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

直接執行bat檔案,啟動容器成功。

在瀏覽器中訪問,成功。

以上我們成功的實現了預想中的要求,在不影響原有應用的基礎上完成了Docker化改造。

git地址: https://github.com/SimonZhang1980/docker4springboot