在上一章, 我完成了将ES部署到Docker的工做. SpringBoot和Docker都具备能快速启动的特性, 所以SpringBoot+Docker是一对用来部署微服务的黄金搭档. 在计划中, 基于SpringBoot的web应用也将部署到Docker之上, 那咱们就开始行动吧.java
将SpringBoot部署到Docker上,须要执行如下步骤:git
保证SpringBoot打包后的可执行jar/war能正常启动github
在SpringBoot应用中编写Dockerfile镜像的生成规则和启动规则,并部署镜像web
在Docker中启动SpringBoot应用spring
个人crawler-search-web工程默认打包出来的war文件, 直接使用java -jar的命令来启动的话会报错. 由于war包还不是一个可执行jar/war. 要让SpringBoot工程打出的包成为一个可执行jar/war,须要使用spring-boot-maven-plugin插件, 对包的内容进行修改,才能成为可执行的jar.要使用此插件, 只需在pom.xml添加如下内容:docker
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin>
验证SpringBoot能做为可执行jar正常启动:shell
mvn clean install java -jar target/crawler-search-web-1.0-SNAPSHOT.war
执行java -jar命令后, 若是控制台没有异常, 那说明新打的war包能够做为一个可执行war部署到docker了.oracle
多模块的SpringBoot没法启动,提示"No qualifying bean of type ..."dom
多是SpringBoot的bug(版本1.3.5): 经过自动扫描方式构建的bean, 若是没有处于启动类所在的包下面, 会没法构建.
好比个人服务类:MailService 所在的包:org.ybak.crawler.persistence.service 就没有在启动类WebApplication所在的包:org.ybak.crawler.web 下面, 启动时就会报错.
解决办法是将WebApplication移动到org.ybak.crawler包下面.maven
这里使用docker-maven-plugin来进行镜像的生成规则和启动规则的设置,并经过这个插件将镜像部署到本地.docker-maven-plugin的配置以下:
<plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>0.4.10</version> <configuration> <imageName>${docker.image.prefix}/${project.artifactId}</imageName> <baseImage>frolvlad/alpine-oraclejdk8:slim</baseImage> <cmd>sh -c 'touch /${project.build.finalName}.war'</cmd> <entryPoint>["java","-Djava.security.egd=file:/dev/./urandom","-jar","/${project.build.finalName}.war"]</entryPoint> <resources> <resource> <targetPath>/</targetPath> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.war</include> </resource> </resources> </configuration> </plugin>
参数说明:
imageName: 生成的Docker镜像名称
baseImage: 同Dockerfile的FROM参数
cmd: 同Dockerfile的RUN参数
entryPoint: 同Dockerfile的ENTRYPOINT参数
resources: 生成docker镜像的资源文件
docker-maven-plugin也支持引入Dockerfile的方式进行镜像配置.这样的方式配置灵活性更高.具体方式能够参见官方文档.
配置完后, 执行:
mvn package docker:build
便可部署镜像.
部署完镜像后,执行如下命令便可启动应用:
docker run -p 8080:8080 -t ybak/crawler-search-web
参数说明:
-p: 端口映射, 同ES在Docker中部署同样, SpringBoot应用在Docker中部署后,咱们也不能直接访问到服务, 须要作Docker容器端口映射到Docker宿主机上的端口
-t: 模拟一个tty窗口, 可中断程序执行
执行完后, 能够看到SpringBoot的启动日志, 任务完成.