将Spring boot应用打包成镜像放到docker中运行
学习docker,需要把项目打包成镜像,所以第一步首先得把项目打成war包,这样才能丢上去。打包成war这一步在传统java web项目中看起来非常简单一步,但是Spring boot却有小许不同。增加SpringBootServletInitializer子类因为在Spring boot项目中,没有用到web.xml,但是tomcat运行war包时候,会去找web.xml,而初始化servlet
学习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
此时终端会提示,正常情况下,就可以通过访问
http://localhost:8989/helloWorld-1.0-SNAPSHOT/
而看到以下内容:
至此,已经和docker说了声hello~
完整项目文件可以从csdn下载:
https://download.csdn.net/download/anla_/10349316
更多推荐
所有评论(0)