1. 程式人生 > >將Spring boot應用打包成映象放到docker中執行

將Spring boot應用打包成映象放到docker中執行

學習docker,需要把專案打包成映象,所以第一步首先得把專案打成war包,這樣才能丟上去。

打包成war

這一步在傳統java web專案中看起來非常簡單一步,但是Spring boot卻有小許不同。

增加SpringBootServletInitializer子類

因為在Spring boot專案中,沒有用到web.xml,但是tomcat執行war包時候,會去找web.xml,而初始化servlet,所以需要建立一個SpringBootServletInitializer的子類,並讓這個類去載入Spring Boot啟動類(注意:有兩個類,而不是把啟動類改為這個類)
如下所示專案結構:
這裡寫圖片描述

看啟動類:

@Controller
@EnableAutoConfiguration
public class SampleController {
    @RequestMapping("/")
    @ResponseBody
    String home() {
        return "Hello World!";
    }

    public static void main(String[] args) throws Exception {
        SpringApplication.run(SampleController.class, args);
    }
}

再看SpringBootServletInitializer類:

@SpringBootApplication
public class Application extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(SampleController.class);
    }
}

但是注意pom.xml中,需要加入下面兩個dependency:

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <!-- 移除嵌入式tomcat外掛 -->
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>

接下來,在專案根目錄下執行mvn clean package ,接著去target目錄下找到這個war包,放到tomcat的webapps下面就好了。

注意不要有web.xml

但是我的實際專案這樣做的時候就出問題了,專案啟動沒報錯,但是啟動不起來,去log下面找的時候發現它還載入了一個檔案,web.xml,因為我是從傳統spring mvc專案遷移到spring boot專案,所以還保留這web.xml,這就很尷尬了。

這一步的helloworld專案可以下載:

打包docker映象

接下來就是製作自己的docker映象,把helloworld:0.0.0.1.war拷貝出來,並且新建一個Dockerfile。
Dockerfile是以下簡單內容:

FROM tomcat
COPY ./helloWorld-1.0-SNAPSHOT.war  /usr/local/tomcat/webapps/

第一句是指你製作的這個映象基於哪個映象(繼承)自哪個映象,一般我們做自己的映象,最好是用官方提供已經做好的映象,在其基礎上去製作我們自己映象。
第二句是把這個war包,拷貝到docker的tomcat的webapps下面(由tomcat映象決定)

以上兩句
可以這樣想,我們執行一個war包,就是要把它放到webapps下面,而如果一切都是我們自己完成的話,還需要把一個tomcat加進來,而通過FROM tomcat,可以假象為docker就是一個系統,我們把定義好的規則和檔案交給他,他幫我們執行就好。

接下來,可以通過以下命令檢視本機所有的映象:

docker image ls

然後執行以下命令:

docker run -p 8989:8080 helloworld:0.0.0.1

而看到以下內容:
這裡寫圖片描述

至此,已經和docker說了聲hello~