詳解docker部署SpringBoot及如何替換jar包

關於docker的安裝和使用,可以看看之前這兩篇文章。Docker從安裝部署到Hello WorldDocker容器的使用和連接。這篇文章主要介紹如何在docker上部署springboot項目。關於如何創建springboot項目可以看看這篇文章SpringBoot入門教程(一)詳解intellij idea搭建SpringBoot

本文主要介紹docker部署springboot的三種方式,分別是:入門方式、jar包替換部署的方式和腳本部署方式,一步步來手把手教程。注意這三種方式的命名是我自創非官方的。

v工程目錄

詳解docker部署SpringBoot及如何替換jar包

vDockerfile文件

創建Dockerfile文件,後面會用到。

# Docker image for springboot file run
# VERSION 0.0.1
# Author: toutou
# 基礎鏡像使用java
FROM java:8
# VOLUME 指定了臨時文件目錄爲/tmp。
# 其效果是在主機 /var/lib/docker 目錄下創建了一個臨時文件,並鏈接到容器的/tmp
# VOLUME /tmp
# 將jar包添加到容器中並更名爲app.jar
ADD learn-web-0.0.1-SNAPSHOT.jar app.jar
# 運行jar包
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-jar","/app.jar"]
###聲明啓動端口號
#EXPOSE 8301

v文件部署

在服務器新建/data/docker/hellolearn文件夾(文件路徑可自定義),將maven打包好的jar包和上文中創建的Dockerfile文件複製到服務器新建的文件夾(/data/docker/hellolearn)。

詳解docker部署SpringBoot及如何替換jar包

v生成鏡像

docker build -t hellolearn .

docker build -t 鏡像名稱:標籤 Dockerfile的相對位置,點號代表當前目錄,不寫tag默認是latest。

詳解docker部署SpringBoot及如何替換jar包

v啓動容器

docker run -d -p 8301:8301 --name hellolearn hellolearn

docker start hellolearn

-d參數是讓容器後臺運行;--name爲指定容器的名稱;-p 是做端口映射,此時將服務器中的8301(冒號前的端口)端口映射到容器中的8301(冒號後的端口)端口(application.properties配置的是8301)

v訪問WEB

詳解docker部署SpringBoot及如何替換jar包

vjar包映射部署

按照上文的步驟已足可以輕鬆應對docker部署springboot的全流程。但是這樣在啓動容器後,每次需更新jar包時,都得重新制作鏡像,再重新制作容器。流程及其繁瑣,效率極低。那如何在不更新鏡像或者容器的前提下直接更新jar包完成部署呢?

5.1 更新Dockerfile

# Docker image for springboot file run
# VERSION 0.0.1
# Author: toutou
# 基礎鏡像使用java
FROM java:8
EXPOSE 8301
ENTRYPOINT ["java","-jar","/data/learn-web-0.0.1-SNAPSHOT.jar"]

最後一行 ENTRYPOINT ["java","-jar","/data/learn-web-0.0.1-SNAPSHOT.jar"] 會運行容器裏/data目錄下的learn-web-0.0.1-SNAPSHOT.jar文件。

5.2 使用docker build命令構建鏡像

docker build -t hellolearn .

5.3 創建&啓動容器

docker run --name hellolearn -it -v /data/docker/newhellolearn/package:/data -d -p 8301:8301 hellolearn

-v 宿主機目錄關聯容器目錄。這樣宿主機的/data/docker/newhellolearn/package目錄就與docker的/data目錄進行映射。

這樣的話,當jar包發生變動時,直接更新宿主機的/data/docker/newhellolearn/package目錄下的jar包即可,更新jar包之後需要將容器重啓一下。

v腳本部署

通過jar包部署方式引起一個問題,若jar包名字發生變化,比如版本號變化(learn-web-0.0.1-SNAPSHOT.jar-->>learn-web-1.0.1-SNAPSHOT.jar)。需要怎麼處理呢?下面就介紹第三種通過腳本部署的方式。

6.1 創建hellolearn.sh文件

java -jar /data/learn-web-0.0.1-SNAPSHOT.jar

將hellolearn.sh上傳到/data/docker/hellolearn/scriptdeploy/package,這個文件夾路徑可以自定義,記住這個文件夾路徑,後面還會用到。

6.2 添加腳本執行權限

chmod +x hellolearn.sh

6.3 創建Dockerfile

# Docker image for springboot file run
# VERSION 0.0.1
# Author: toutou
# 基礎鏡像使用java
FROM java:8
EXPOSE 8301
CMD ["sh","-c","/data/hellolearn.sh"]

CMD ["sh","-c","/data/hellolearn.sh"] 表示在容器啓動時啓動6.1中創建的hellolearn.sh腳本。

注意最後一條命令上文中都是ENTRYPOINT,在腳本部署中改成了CMD,至於ENTRYPOINT和CMD的具體區別感興趣的可以瞭解一下

6.4 上傳jar包

將jar包放入hellolearn.sh的同一個文件夾目錄,即/data/docker/hellolearn/scriptdeploy/package,創建容器時再將該目錄(宿主機目錄)與容器的/data目錄進行映射。。

6.5 文件目錄結構圖

詳解docker部署SpringBoot及如何替換jar包

這裏的目錄結構不知道大家暈不暈,上傳一張我這宿主機的目錄結構圖,一目瞭然。

6.6 創建鏡像

docker build -t hellolearn-script .

末尾的點號代表當前目錄,所以生成鏡像的命令需要在Dockerfile所在的目錄執行。

6.7 創建&啓動容器

docker run --name hellolearn-script -it -v /data/docker/hellolearn/scriptdeploy/package:/data -d -p 8302:8301 hellolearn-script

docker start hellolearn-script

將宿主機的/data/docker/hellolearn/scriptdeploy/package目錄與容器的/data目錄映射關聯。這樣的話,當jar包發生變動時,直接更新宿主機目錄下的jar包即可。即使jar包名字發生變化,也需要再更新一下hellolearn.sh腳本。更新之後重啓容器。

6.8 web測試效果

詳解docker部署SpringBoot及如何替換jar包

v查看docker日誌

docker logs [OPTIONS] CONTAINER ID

OPTIONS說明:

-f : 跟蹤日誌輸出
--since :顯示某個開始時間的所有日誌
-t : 顯示時間戳
--tail :僅列出最新N條容器日誌

7.1 查看指定時間後的日誌,只顯示最後100行:

docker logs -f -t --since="2020-10-01" --tail=100 CONTAINER ID

7.2 查個指定時間區段的日誌

docker logs -t --since="2020-10-01T19:00:00" --until "2020-10-01T19:00:00" CONTAINER ID

7.3 查看指定時間後面的日誌:

docker logs -t --since="2020-10-01T19:00:00" CONTAINER ID

7.4 查看最近5分鐘的日誌:

docker logs --since 5m CONTAINER ID

7.5 通過 exec 命令對指定的容器執行 bash:

docker exec hellolearn -it /bin/bash 或者 docker exec -it hellolearn bash

7.6 查看docker IP

docker inspect --format='{{.NetworkSettings.IPAddress}}' hellolearn

v遇到的問題

問題描述:Error response from daemon: driver failed programming external connectivity on endpoint flamboyant_leavitt (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 8301 -j DNAT --to-destination 172.17.0.2:8301 ! -i docker0: iptables: No chain/target/match by that name.

解決方案:重啓docker。 systemctl restart docker

具體問題相關信息詳見Error response from daemon: driver failed programming external connectivity on endpoint mysql3308 (

v源碼地址

https://github.com/toutouge/javademosecond/tree/master/hellolearn


作  者:請叫我頭頭哥
出  處:http://www.cnblogs.com/toutou/
關於作者:專注於基礎平臺的項目開發。如有問題或建議,請多多賜教!
版權聲明:本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接。
特此聲明:所有評論和私信都會在第一時間回覆。也歡迎園子的大大們指正錯誤,共同進步。或者直接私信
聲援博主:如果您覺得文章對您有幫助,可以點擊文章右下角推薦一下。您的鼓勵是作者堅持原創和持續寫作的最大動力!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章