當前位置:
首頁 > 知識 > SpringBoot | 第十四章:基於 Docker 的簡單部署

SpringBoot | 第十四章:基於 Docker 的簡單部署

(點擊

上方公眾號

,可快速關注)




來源:oKong ,


blog.lqdev.cn/2018/07/27/springboot/chapter-fourteen/




前言



講解了單元測試,本章節講講應用的部署吧。總體而言,在進行自動化部署時,基本都會用上Jenkins+Maven+Docker進行部署。本章節主要講解使用Maven+Docker進行SpringBoot應用的部署知識。




題外話:對於Docker,本人也是去年才第一次聽說的,當時也沒有進行過相關了解。然後年初的時候,本著學習的心態,購置了一台阿里雲的ECS伺服器,之後的相關實踐,都是在這台伺服器上進行的。這周末要是不需要加班,可能會先出個Docker入門教程,因為還閑置了一台伺服器,剛好可以把自己當作初學者,再重新來一遍,加深下印象,做下筆記。




Docker




關於Docker,百度百科是這麼說的:Docker,是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後發布到任何流行的 Linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何介面(類似 iPhone 的 app),更重要的是容器性能開銷極低。



題外話:本人覺得,每個開發者都應該了解下Docker,畢竟我們不是專業的運維,如果一直在倒騰一些環境的安裝,也是蠻枯燥乏味的。使用了Docker可以減少很多的不必要,可以直接上手部署各式各樣的環境了。真的很Nice呀!




安裝jdk8鏡像




安裝命令為:





docker pull openjdk:8-jdk-alpine




安裝成功後,查看鏡像,表明已經安裝成功了,當然也可先不安裝,因為後續是基於此鏡像進行編寫Dockerfile的,所以這裡先下載了。







大家可在:https://hub.docker.com/搜索,並選擇自己想要的對應鏡像文件。






maven插件推送方式




基於此方式時,是本地利用maven的docker插件進行編譯,同時推送到遠程的docker伺服器中。所以事先需要遠程的Docker服務開啟遠程訪問許可權。本例演示的Docker版本為(docker -v 命令):




Docker version 1.13.1, build 774336d/1.13.1




這裡說明下開啟的方式(基於阿里雲的Linux系統):



1. 修改/etc/docker/daemon.json文件,加入hosts配置即可。


如:





{


  "hosts":["tcp://0.0.0.0:2375","unix:///var/run/docker.sock"]


}




2. 重新載入配置文件,並重啟docker





systemctl daemon-reload


systemctl restart docker



3. 驗證,直接訪問:





curl 127.0.0.1:2375/info




返回記錄即可說明已經生效。






也可以直接瀏覽器訪問:http://伺服器IP:2375/info, 效果是一樣的(這裡隱去了阿里雲伺服器的地址)。







接下來正式開始編寫示例。




0.創建一個web演示應用(這裡大家可自行創建,或者直接下載本章節示例)







工程結構:







1.加入打包插件docker maven的pom依賴。





<build>


        <plugins>


            <!-- springboot打包 -->


            <plugin>


                <groupId>org.springframework.boot</groupId>


                <artifactId>spring-boot-maven-plugin</artifactId>


            </plugin>


             


            <plugin>


                <groupId>com.spotify</groupId>


                <artifactId>docker-maven-plugin</artifactId>


                <version>0.4.9</version>


                <configuration>


                   <!-- 鏡像名稱  -->


                   <imageName>lqdev.cn/demo</imageName>


                   <!-- docker遠程伺服器地址 -->


                   <dockerHost>http://伺服器IP:2375</dockerHost>


                   <!-- Dockerfile文件存放目錄 -->


                   <dockerDirectory>src/main/docker</dockerDirectory>


                   <resources>


                    <resource>


                        <directory>${project.build.directory}</directory>


                        <include>${project.build.finalName}.jar</include>


                    </resource>


                </resources>


                </configuration>


            </plugin>


        </plugins>


    </build>




2.編寫Dockerfile,注意大小寫,後面的file是不大寫開頭的。





# Dockerfile


# 基於的鏡像


FROM openjdk:8-jdk-alpine


 


VOLUME /opt/tmp


 


ADD chapter-14-0.0.1-SNAPSHOT.jar app.jar


 


# -Djava.security.egd=file:/dev/./urandom 可解決tomcat可能啟動慢的問題


# 具體可查看:https://www.cnblogs.com/mightyvincent/p/7685310.html


ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]


 


# 對外埠


EXPOSE 8080


 


3.編碼運行。





mvn clean package docker:build -Dmaven.test.skip=true







注意:這裡若出現了編譯異常,常見的就是500: HTTP 500 Internal Server Error了。造成這種的情況一般是鏡像名稱不符合命名規範:限制為字母數字 [a-zA-Z0-9],和標點符號 [.-_],及/和:(「:」一般上用來區分版本的,如lqdev.cn/demo:v1),或者Dockerfile文件未找到之類的,若出錯了大家可重點看下這兩個地方。




網友反饋:有些環境會出現如下錯誤





Caused by: com.spotify.docker.client.exceptions.DockerException: manifest for openjdk:8-jdk-alphine not found




出現此錯誤時,可考慮換一個鏡像,如jboss/base-jdk:8(此鏡像比較大,原來選擇openjdk:8-jdk-alphine也是出於大小考慮。),或者使用自製鏡像。




4.查看遠程鏡像





docker images







5.運行鏡像,查看應用是否正常啟動。





docker run -d -p 8080:8080 lqdev.cn/my-springboot-images







查看日誌或者直接瀏覽器訪問:http:伺服器地址:8080/,即可。





有返回預期的數據,部署成功!




基於已有鏡像,運行jar




基於有時候沒有開啟遠程服務,也可把jar上傳至伺服器,然後編寫腳本進行運行,這裡簡單示例下,正常部署時,正常是通過jenkins打包,然後編寫打包後事件,運行腳本即可。




編寫運行鏡像腳本:





docker run -d -p 1234:8080 -v /opt/docker/chapter-14-0.0.1-SNAPSHOT.jar:/usr/chapter-14-0.0.1-SNAPSHOT.jar --name SpringbootByJar openjdk:8-jdk-alpine java -jar /usr/chapter-14-0.0.1-SNAPSHOT.jar







其實就是把jar拷貝從宿主中拷貝到容器中,然後運行java命令進行啟動。和原來的運行jar方式是一樣的。




運行後訪問:http://伺服器地址:1234 即可查看效果,驗證是否部署成功了。







總結




本章節主要是講解了利用Maven的Docker打包工具進行應用構建同時推送到遠程倉庫及已有jar的情況下,直接在容器中運行jar。其實原理都是一樣的,都是把jar放入到容器中,然後利用java命令進行運行應用。本章節,若是對docker不熟悉可能會有點懵,因為好多命令都沒有具體說明,(┬_┬),大家可查閱相關資料,對Docker有了解後在進行嘗試。周末看看,有時間會寫幾章關乎Docker入門及基本使用的教程的,當然這些教程都是個人見解了,但至少應該能讓新手有個了解~




最後




目前互聯網上很多大佬都有SpringBoot系列教程,如有雷同,請多多包涵了。本文是作者在電腦前一字一句敲的,每一步都是實踐的。若文中有所錯誤之處,還望提出,謝謝。




系列






  • SpringBoot | 第一章:第一個 SpringBoot 應用



  • SpringBoot | 第二章:lombok 介紹及簡單使用



  • SpringBoot | 第三章:springboot 配置詳解



  • SpringBoot | 第四章:日誌管理



  • SpringBoot | 第五章:多環境配置



  • SpringBoot | 第六章:常用註解介紹及簡單使用



  • SpringBoot | 第七章:過濾器、監聽器、攔截器



  • SpringBoot | 第八章:統一異常、數據校驗處理



  • SpringBoot | 第九章:Mybatis-plus 的集成和使用



  • SpringBoot | 第十章:Swagger 2 的集成和使用



  • SpringBoot | 第十一章:Redis 的集成和簡單使用



  • SpringBoot | 第十二章:RabbitMQ 的集成和使用



  • SpringBoot | 第十三章:測試相關 ( 單元測試、性能測試 )




【關於投稿】




如果大家有原創好文投稿,請直接給公號發送留言。




① 留言格式:


【投稿】+《 文章標題》+ 文章鏈接

② 示例:


【投稿】《不要自稱是程序員,我十多年的 IT 職場總結》:http://blog.jobbole.com/94148/

③ 最後請附上您的個人簡介哈~






看完本文有收穫?請轉發分享給更多人


關注「ImportNew」,提升Java技能


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 ImportNew 的精彩文章:

SpringBoot | 第三章:springboot 配置詳解
誤刪除 dev 下特殊文件怎麼辦

TAG:ImportNew |