市長信箱郵件查詢服務: 將SpringBoot應用部署到Docker

市長信箱郵件查詢服務: 將SpringBoot應用部署到Docker

在上一章, 我完成了將ES部署到Docker的工做. SpringBoot和Docker都具備能快速啓動的特性, 所以SpringBoot+Docker是一對用來部署微服務的黃金搭檔. 在計劃中, 基於SpringBoot的web應用也將部署到Docker之上, 那咱們就開始行動吧.java


將SpringBoot部署到Docker上,須要執行如下步驟:git

  1. 保證SpringBoot打包後的可執行jar/war能正常啓動github

  2. 在SpringBoot應用中編寫Dockerfile鏡像的生成規則和啓動規則,並部署鏡像web

  3. 在Docker中啓動SpringBoot應用spring

保證SpringBoot打包後的可執行jar/war能正常啓動

個人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

在SpringBoot應用中編寫Dockerfile鏡像的生成規則和啓動規則,並部署鏡像

這裏使用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中啓動SpringBoot應用

部署完鏡像後,執行如下命令便可啓動應用:

docker run -p 8080:8080 -t ybak/crawler-search-web

參數說明:
-p: 端口映射, 同ES在Docker中部署同樣, SpringBoot應用在Docker中部署後,咱們也不能直接訪問到服務, 須要作Docker容器端口映射到Docker宿主機上的端口
-t: 模擬一個tty窗口, 可中斷程序執行

執行完後, 能夠看到SpringBoot的啓動日誌, 任務完成.

參考:
https://spring.io/guides/gs/spring-boot-docker/

相關文章
相關標籤/搜索