詳解docker部署SpringBoot及如何替換jar包
關於docker的安裝和使用,可以看看之前這兩篇文章。Docker從安裝部署到Hello World和Docker容器的使用和連線。這篇文章主要介紹如何在docker上部署springboot專案。關於如何建立springboot專案可以看看這篇文章SpringBoot入門教程(一)詳解intellij idea搭建SpringBoot
本文主要介紹docker部署springboot的三種方式,分別是:入門方式、jar包替換部署的方式和指令碼部署方式,一步步來手把手教程。注意這三種方式的命名是我自創非官方的。
v工程目錄
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)。
v生成映象
docker build -t hellolearn .
docker build -t 映象名稱:標籤 Dockerfile的相對位置,點號代表當前目錄,不寫tag預設是latest。
v啟動容器
docker run -d -p 8301:8301 --name hellolearn hellolearn
docker start hellolearn
-d引數是讓容器後臺執行;--name為指定容器的名稱;-p 是做埠對映,此時將伺服器中的8301(冒號前的埠)埠對映到容器中的8301(冒號後的埠)埠(application.properties配置的是8301)
v訪問WEB
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 檔案目錄結構圖
這裡的目錄結構不知道大家暈不暈,上傳一張我這宿主機的目錄結構圖,一目瞭然。
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測試效果
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/
關於作者:專注於基礎平臺的專案開發。如有問題或建議,請多多賜教!
版權宣告:本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連結。
特此宣告:所有評論和私信都會在第一時間回覆。也歡迎園子的大大們指正錯誤,共同進步。或者直接私信我
聲援博主:如果您覺得文章對您有幫助,可以點選文章右下角【推薦】一下。您的鼓勵是作者堅持原創和持續寫作的最大動力!