將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~