天天看點

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

前言

講解了單元測試,本章節講講應用的部署吧。總體而言,在進行自動化部署時,基本都會用上

Jenkins

+

Maven

+

Docker

進行部署。本章節主要講解使用

Maven

+

Docker

進行

SpringBoot

應用的部署知識。

題外話:對于

Docker

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

  • Docker
  • 安裝jdk8鏡像
  • maven插件推送方式
  • 基于已有鏡像,運作jar
  • 總結
  • 最後
  • 老生常談

Docker

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

題外話:本人覺得,每個開發者都應該了解下

Docker

,畢竟我們不是專業的運維,如果一直在倒騰一些環境的安裝,也是蠻枯燥乏味的。使用了

Docker

可以減少很多的不必要,可以直接上手部署各式各樣的環境了。真的很Nice呀!

安裝jdk8鏡像

安裝指令為:

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

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

大家可在:https://hub.docker.com/搜尋,并選擇自己想要的對應鏡像檔案。

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

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"]
}
           
  1. 重新加載配置檔案,并重新開機docker
systemctl daemon-reload
systemctl restart docker
           

3.驗證,直接通路:

curl /info
           

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

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

也可以直接浏覽器通路:http://伺服器IP:2375/info, 效果是一樣的(這裡隐去了阿裡雲伺服器的位址)。

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

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

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

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

工程結構:

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

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:-jdk-alpine

VOLUME /opt/tmp

ADD chapter---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 
           

3.編碼運作。

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

注意:這裡若出現了編譯異常,常見的就是

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:-jdk-alphine not found
           

出現此錯誤時,可考慮換一個鏡像,如

jboss/base-jdk:8

(此鏡像比較大,原來選擇

openjdk:8-jdk-alphine

也是出于大小考慮。),或者使用自制鏡像。

4.檢視遠端鏡像

docker images
           
SpringBoot | 第十四章:基于Docker的簡單部署

5.運作鏡像,檢視應用是否正常啟動。

檢視日志或者直接浏覽器通路:http:伺服器位址:8080/,即可。

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

有傳回預期的資料,部署成功!

基于已有鏡像,運作jar

基于有時候沒有開啟遠端服務,也可把jar上傳至伺服器,然後編寫腳本進行運作,這裡簡單示例下,正常部署時,正常是通過

jenkins

打包,然後編寫打包後事件,運作腳本即可。

編寫運作鏡像腳本:

docker run -d -p : -v /opt/docker/chapter---SNAPSHOT.jar:/usr/chapter---SNAPSHOT.jar --name SpringbootByJar openjdk:-jdk-alpine java -jar /usr/chapter---SNAPSHOT.jar
           
SpringBoot | 第十四章:基于Docker的簡單部署

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

運作後通路:http://伺服器位址:1234 即可檢視效果,驗證是否部署成功了。

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

總結

本章節主要是講解了利用

Maven

Docker

打包工具進行應用建構同時推送到遠端倉庫及已有

jar

的情況下,直接在容器中運作jar。其實原理都是一樣的,都是把jar放入到容器中,然後利用

java

指令進行運作應用。本章節,若是對docker不熟悉可能會有點懵,因為好多指令都沒有具體說明,(┬_┬),大家可查閱相關資料,對

Docker

有了解後在進行嘗試。周末看看,有時間會寫幾章關乎

Docker

入門及基本使用的教程的,當然這些教程都是個人見解了,但至少應該能讓新手有個了解~

最後

目前網際網路上很多大佬都有

SpringBoot

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

老生常談

  • 個人QQ:

    499452441

  • 微信公衆号:

    lqdevOps

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

個人部落格:http://blog.lqdev.cn

原文位址:http://blog.lqdev.cn/2018/07/27/springboot/chapter-fourteen/

完整示例:chapter-14

繼續閱讀