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

前言

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

題外話:對於Docker,本人也是去年才第一次據說的,當時也沒有進行過相關了解。而後年初的時候,本着學習的心態,購置了一臺阿里雲的ECS服務器,以後的相關實踐,都是在這臺服務器上進行的。這週末要是不須要加班,可能會先出個Docker入門教程,由於還閒置了一臺服務器,恰好能夠把本身看成初學者,再從新來一遍,加深下印象,作下筆記。java

Docker

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

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

安裝jdk8鏡像

安裝命令爲:web

docker pull openjdk:8-jdk-alpine

安裝成功後,查看鏡像,代表已經安裝成功了,固然也可先不安裝,由於後續是基於此鏡像進行編寫Dockerfile的,因此這裏先下載了。spring

你們可在:https://hub.docker.com/搜索,並選擇本身想要的對應鏡像文件。docker

docker

maven插件推送方式

基於此方式時,是本地利用maven的docker插件進行編譯,同時推送到遠程的docker服務器中。因此事先須要遠程的Docker服務開啓遠程訪問權限。本例演示的Docker版本爲(docker -v 命令):json

Docker version 1.13.1, build 774336d/1.13.1瀏覽器

這裏說明下開啓的方式(基於阿里雲的Linux系統):tomcat

  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 127.0.0.1:2375/info

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

也能夠直接瀏覽器訪問:http://服務器IP:2375/info, 效果是同樣的(這裏隱去了阿里雲服務器的地址)。

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

0.建立一個web演示應用**(這裏你們可自行建立,或者直接下載本章節示例)**

demo應用

工程結構:

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 便可查看效果,驗證是否部署成功了。

瀏覽器查看

總結

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

最後

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

老生常談

  • 我的QQ:499452441
  • 微信公衆號:lqdevOps

公衆號

我的博客:http://blog.lqdev.cn

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

完整示例:chapter-14

相關文章
相關標籤/搜索