学习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

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐