絲滑的打包部署,一套帶走

👉 這是一個或許對你有用的社群
🐱 一對一交流/面試小冊/簡歷最佳化/求職解惑,歡迎加入芋道快速開發平臺知識星球。下面是星球提供的部分資料:
👉這是一個或許對你有用的開源專案
國產 Star 破 10w+ 的開源專案,前端包括管理後臺 + 微信小程式,後端支援單體和微服務架構。
功能涵蓋 RBAC 許可權、SaaS 多租戶、資料許可權、商城、支付、工作流、大屏報表、微信公眾號、CRM 等等功能:
  • Boot 倉庫:https://gitee.com/zhijiantianya/ruoyi-vue-pro
  • Cloud 倉庫:https://gitee.com/zhijiantianya/yudao-cloud
  • 影片教程:https://doc.iocoder.cn
【國內首批】支援 JDK 21 + SpringBoot 3.2.2、JDK 8 + Spring Boot 2.7.18 雙版本 

一、背景

Docker打包部署方案
專案背景 :新專案的後端框架是剛起步,搭建的是一套微服務框架,基礎服務有閘道器 Gateway, Nacos 註冊中心,以及其他的微服務。現在需要弄個簡單且方便的,基於 Docker 的部署方式。
為什麼用 Docker :為了讓後端程式更容易打包部署和管理,所以用上了 Docker 容器化部署。比如用 Docker Swarm 或 K8s 來管理多個容器。
為什麼要提到 Windows :本地機器是 Windows 系統開發,透過 Windows + IDEA 將應用程式打成 Docker 映象,然後複製到 Linux 伺服器進行容器化部署。
  • 疑問1 :有同學可能會有疑問,Windows 還能跑 Docker 嗎???那必須的!
  • 疑問2 :如果專案的程式碼改了,是不是得重新打包 docker 映象?不需要,直接替換 docker volume 裡面的 JAR 包即可。
  • 疑問3:怎麼沒有用 Jenkins?新專案,新專案,牛奶和麵包都會有的。
基於 Spring Boot + MyBatis Plus + Vue & Element 實現的後臺管理系統 + 使用者小程式,支援 RBAC 動態許可權、多租戶、資料許可權、工作流、三方登入、支付、簡訊、商城等功能
  • 專案地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 影片教程:https://doc.iocoder.cn/video/

二、Windows 執行 Docker

2.1 原理

為了在 Windows 能夠打包 Docker 映象,就必須弄個可以執行 Docker 的環境。
Docker 依賴於已存在並執行的 Linux 核心環境。實質上是在已經執行的 Linux 下製造了一個隔離的檔案環境,因此它執行的效率幾乎等同於所部署的 Linux 主機。
如果其他系統想部署 Docker 就必須安裝一個虛擬 Linux 環境。

2.2 啟用 Hyper-V

Windows+虛擬機器+Docker
Windows 自帶的 Hyper-V 工具就是一款管理和建立虛擬機器的工具,要求:Windows 10 企業版、專業版或教育版。啟用 Hyper-V 如下所示:
啟用 Hyper-V
操作步驟:程式和功能->開啟或關閉 Windows 功能->選擇“Hyper-V”,然後單擊“確定
參考連結:

https://learn.microsoft.com/zh-cn/virtualization/hyper-v-on-windows/quick-start/

enable

-hyper-v

2.3 安裝 Docker for Windows

點選 官網下載地址,並下載 Windows 的版本,安裝就是一路點選 next 就好了。

官網下載地址:https://www.docker.com/products/docker-desktop/

安裝好之後,開啟 Windows 的Powershell 命令列視窗,執行 docker run hello-world。當看到 Hello from Docker!就表示安裝成功。
好了,現在我們開發環境擁有了執行 docker 容器,打包 docker 映象的能力。接下來我們來看下如何用 IDEA 開發工具來啟動 docker 容器和打包映象。
基於 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現的後臺管理系統 + 使用者小程式,支援 RBAC 動態許可權、多租戶、資料許可權、工作流、三方登入、支付、簡訊、商城等功能
  • 專案地址:https://github.com/YunaiV/yudao-cloud
  • 影片教程:https://doc.iocoder.cn/video/

三、IDEA 打包映象

IDEA 工具很強大,提供 Docker 相關的功能。
IDEA 打包 Docker 映象的方式主要分為這麼幾步:
  • 透過 Maven 工具將 SpringBoot 應用程式打成可執行的 JAR 包。
  • IDEA 執行指定的 Dockerfile 打包成 Docker 映象。
這裡我寫了一個簡單 SpringBoot 專案,定義了一個簡單的 Rest API 介面。
應用程式的埠為 9600。

server.port=9600

3.1 Maven Build JAR 包

Maven 打包的話這個我們都比較熟悉,直接執行 Maven 命令(mvn package)或者在 IDEA 上點選 Maven 相關按鈕即可。就會生成這樣一個包
operation-core-0.0.1-SNAPSHOT,我們可以把它的名字改短一點,就改為  operation.jar 吧

3.2 編寫 Dockerfile

Dockerfile 又是什麼呢?
它是一個用來構建映象的文字檔案,檔案內容就是一條條構建映象所需的指令和說明。
我們就到專案建立兩個 dockerfile 檔案吧,一個用作開發環境的,一個用作生產環境的。
如下所示:
# 拉取指定的映象檔案

FROM hub.c.163.com/library/java:latest

# MAINTAINER 指令允許你給將要製作的映象設定作者資訊

MAINTAINER wukong <[email protected]>

# 容器內建立一個 apps 目錄,用來掛載 jar 包

RUN mkdir -p /apps

# 將 passjavas-demo-1.0 jar 包複製到 /apps/passjava-demo.jar

ADD passjava-demo-1.0.jar /apps/passjava-demo.jar

# 設定時區

ENV TZ 

"Asia/Shanghai"
# 設定暴露的埠

EXPOSE 9600

#dockerfile中增加健康檢查,interval表示每個5分鐘檢查一次,timeout每次超過5秒鐘認定為失敗,retries失敗後輪詢3次認定為容器不健康,考慮重啟。
#HEALTHCHECK --interval=60s --timeout=5s --retries=6 \
#  CMD curl -f http://localhost:8989/health || exit 1
# 執行 Java 應用程式的命令

ENTRYPOINT [

"java"

,

"-jar"

,

"/apps/passjava-demo.jar"

]

3.3 配置和執行 Dockerfile

在 IDEA 裡面建立一個 執行配置,新增一個 Dockerfile 配置,如下所示:
開始執行這個配置後,IDEA 就會根據 dockerfile 裡面的配置自動拉取 Java JDK 映象檔案,這個過程會比較長,Java JDK 還是比較大的。
拉取之後,會一步步執行 dockerfile 裡面的命令,最後會啟動一個 docker 容器。

3.4 測試

我們來測試下 Java 程式是否正常執行。還是用 curl 命令訪問 Restful API。

curl http://localhost:9600/

test

咦?居然訪問不通,這是為啥??
我們來排查下。先看下容器日誌,執行命令 docker logs <容器id>,可以看到 Java 應用程式正常啟動,也沒有報錯日誌。
那說明可能是網路問題,比如容器的埠和我們本機的埠沒有對映。果不其然。這裡埠是否沒有對映的,如下圖所示。
那說明透過這種方式雖然能正常啟動程式,但是程式不能提供服務,那就換一種方式。上面的方式是透過 Dockerfile 建立了一個映象檔案,然後 IDEA 工具幫我們啟動了一個 Docker 容器,但是這種容器還缺少一些引數,比如埠對映沒有做。要不我們就自己來啟動一個容器看看?自己啟動就是透過 docker run 命令即可,不過也可以透過建立一個 IDEA container 配置來啟動一個容器。

3.5 IDEA 自定義容器

如下圖所示,自定義一個容器跑配置。因為上面的步驟我們已經建立了映象了,所以可以直接用這個映象即可。
話不多說,直接執行起來看下。
再來看下埠對映,這次就對映好了,完美!
再來測試下是否能訪問 API。還是用 curl 命令,返回結果如下,這次就成功了。

passjava,悟空聊架構

四、部署到伺服器

4.1 部署思路

不過這都是在我們本地玩的,如何把它弄到伺服器上呢??步驟如下:
  • 把映象儲存為一個壓縮包,上傳到伺服器,伺服器上用命令啟動容器。
  • 如果有程式碼修改,把專案重新打成 JAR 包上傳到掛載的目錄就可以了
如下圖,和文章最開始看到的圖相比,做了一些簡化,思路是一致的。

4.2 部署

先在本地把 docker 映象打成一個 tar 包。

docker save passjava-docker-demo-23.02 -o D:\passjava-demo.tar

然後把這個 tar 包複製到 Linux 伺服器。
將映象複製到伺服器
接著將 tar 載入為 docker 映象

docker load -i passjava-demo.tar

passjava-demo映象包
然後就可以透過命令來啟動容器了。命令裡面包含了掛載的目錄卷,埠對映,啟動方式等。

docker run --name passjava-demo -d \

-v /nfs-data/service:/nfs-data/service \

-v /nfs-data/service/apps:/apps \

-v /nfs-data/service/logs:/nfs-data/service/logs \

--restart=always \

-p 9600:9600 \

passjava-docker-demo-23.02

咦,啟動容器又報錯了,檢視日誌提示找不到 jar 包。
啟動報錯,找不到 jar 包
哦,想起來了,掛載上面的 apps 目錄後,容器會從容器裡面的 apps 目錄找 JAR 包,發現沒有這個 jar 包,當然報錯了呀!
執行命令
而這個 apps 目錄正好是和宿主伺服器的 /nfs-data/service/apps 目錄做了對映的,這個目錄沒有 jar 包,容器裡面的 apps 目錄也就沒有 jar 包。所以我們可以把 jar 包複製到這個目錄就好了。
等等,為什麼用 IDEA 啟動容器時沒有問題?因為當時沒有 IDEA 做目錄的對映。
啟動完成後,我們來測試下部署的服務是否正常。

歡迎加入我的知識星球,全面提升技術能力。
👉 加入方式,長按”或“掃描”下方二維碼噢
星球的內容包括:專案實戰、面試招聘、原始碼解析、學習路線。
文章有幫助的話,在看,轉發吧。
謝謝支援喲 (*^__^*)

相關文章