第27章:服務部署與容器化

1. 課程引言

在前面的章節中,我們已經完成了電商項目核心服務的開發。然而,開發完成只是項目生命周期的一部分,如何將這些服務高效、可靠地部署到生產環境,是決定項目成敗的關鍵一步。本章將聚焦于服務的部署,重點介紹當前最主流的容器化技術——Docker,并探討如何使用Docker來打包、分發和運行我們的微服務。

2. 傳統部署方式的痛點

在容器化技術普及之前,應用部署通常直接在物理機或虛擬機上進行。這種方式存在諸多痛點:

  • 環境不一致:開發、測試、生產環境的配置(如操作系統、依賴庫版本)可能存在差異,導致“在我電腦上能跑”的問題頻發。
  • 資源隔離性差:多個應用在同一臺機器上運行時,可能會因資源競爭(CPU、內存)或依賴沖突而相互影響。
  • 部署效率低:應用的部署、遷移和擴容過程復雜且耗時,難以適應快速迭代的業務需求。
  • 運維成本高:需要投入大量精力來管理和維護服務器的運行環境。

3. Docker核心概念

Docker的出現革命性地解決了上述問題。它是一個開源的應用容器引擎,可以將應用及其所有依賴打包到一個輕量級、可移植的容器中,然后發布到任何流行的Linux或Windows操作系統的機器上,也可以實現虛擬化。

  • 鏡像 (Image):一個只讀的模板,包含了運行應用所需的一切:代碼、運行時、庫、環境變量和配置文件。鏡像是創建容器的基礎。
  • 容器 (Container):鏡像的運行實例。容器之間相互隔離,擁有自己的文件系統、網絡和進程空間。可以被啟動、停止、刪除。
  • 倉庫 (Repository):集中存放鏡像文件的地方。最著名的公共倉庫是Docker Hub,我們也可以搭建私有倉庫。

3.1 Dockerfile:定義你的應用環境

Dockerfile是一個文本文件,包含了一系列指令,用于自動化地構建一個Docker鏡像。通過Dockerfile,我們可以將應用環境的配置代碼化,實現環境的標準化和版本控制。

示例:為cloudmall-product服務編寫Dockerfile

# Dockerfile for cloudmall-product# 1. 指定基礎鏡像
# 使用一個包含Java 8運行環境的輕量級鏡像
FROM openjdk:8-jre-alpine# 2. 設置工作目錄
WORKDIR /app# 3. 將應用的jar包復制到容器中
# TARGET_DIR 和 JAR_NAME 是構建時的參數
ARG TARGET_DIR=target
ARG JAR_NAME=cloudmall-product-0.0.1-SNAPSHOT.jar
COPY ${TARGET_DIR}/${JAR_NAME} /app/app.jar# 4. 聲明容器對外暴露的端口
EXPOSE 8001# 5. 定義容器啟動時執行的命令
ENTRYPOINT ["java", "-jar", "/app/app.jar"]

4. Docker實戰:容器化商品服務

接下來,我們將以上述Dockerfile為例,演示如何將cloudmall-product服務打包成Docker鏡像并運行。

4.1 準備工作

  1. 安裝Docker:請根據你的操作系統,參考Docker官方文檔進行安裝。

  2. 打包Spring Boot應用:在項目根目錄執行Maven命令,將cloudmall-product模塊打包成jar文件。

    # 在cloudmall父工程目錄下執行
    mvn clean package -DskipTests -pl cloudmall-product -am
    

4.2 構建Docker鏡像

cloudmall-product模塊的根目錄下創建Dockerfile文件,并將上面的示例內容粘貼進去。然后執行以下命令構建鏡像:

# -t: 指定鏡像的名稱和標簽,格式為 <repository>:<tag>
# .: 指定Dockerfile所在的路徑為當前目錄
docker build -t cloudmall/product:v1.0 .

構建成功后,可以通過docker images命令查看本地的鏡像列表。

4.3 運行Docker容器

使用docker run命令來啟動一個容器:

# -d: 后臺運行容器
# -p: 端口映射,格式為 <宿主機端口>:<容器端口>
# --name: 指定容器的名稱
docker run -d -p 8001:8001 --name product-service cloudmall/product:v1.0

現在,商品服務就在Docker容器中運行起來了。我們可以通過訪問http://localhost:8001(或Docker宿主機的IP)來測試服務是否正常。

5. 使用Docker Compose編排多服務

在微服務架構中,一個應用通常由多個服務組成。手動管理每個服務的容器非常繁瑣。Docker Compose是一個用于定義和運行多容器Docker應用的工具。通過一個docker-compose.yml文件,我們可以配置應用的所有服務,然后使用一條命令即可啟動或停止所有服務。

示例:docker-compose.yml編排用戶和商品服務

version: '3.8'services:# 商品服務product-service:image: cloudmall/product:v1.0container_name: product-serviceports:- "8001:8001"networks:- cloudmall-net# 用戶服務 (假設也已打包成鏡像 cloudmall/user:v1.0)user-service:image: cloudmall/user:v1.0container_name: user-serviceports:- "8002:8002"networks:- cloudmall-net# ... 此處可以繼續定義Nacos, Redis, MySQL等其他依賴服務networks:cloudmall-net:driver: bridge

將上述內容保存為docker-compose.yml文件,然后在該文件所在目錄執行:

# 啟動所有服務
docker-compose up -d# 停止并移除所有服務
docker-compose down

6. 章節總結

本章我們從傳統部署的痛點出發,學習了容器化技術Docker的核心概念與巨大優勢。我們重點掌握了如何使用Dockerfile為Spring Boot應用構建標準化的運行環境,并成功將商品服務容器化。最后,我們了解了如何使用Docker Compose來簡化多服務應用的編排和管理。容器化是通向云原生和高效運維的必經之路,為后續學習Kubernetes等更高級的服務編排技術打下了堅實的基礎。

##7 資源下載

本章的示例代碼可以從以下鏈接下載:
微服務開發課程第16-26章的源碼

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/92042.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/92042.shtml
英文地址,請注明出處:http://en.pswp.cn/web/92042.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

力扣148:排序鏈表

力扣148:排序鏈表題目思路代碼題目 給你鏈表的頭結點 head &#xff0c;請將其按 升序 排列并返回 排序后的鏈表 。 思路 當我們第一眼看見這道題時心中其實是有思路的&#xff0c;我們不想這是個鏈表就當它是一個整型數組。那么自然而然就會想到各種各樣的排序方法&#xf…

基于k8s環境下的pulsar常用命令(下)

#作者&#xff1a;Unstopabler 文章目錄permissionSchemapermission pulsar的權限控制是在namespace級別的 kubectl exec pulsar-toolset-0 -n pulsar – bin/pulsar-admin namespaces grant-permission mytenant/mynamespace –actions produce,consume –role admin10 注…

2.4 組件通信

Props 和 Events&#xff08;父子組件通信&#xff09;Props&#xff1a;父組件向子組件傳遞數據使用 props。子組件通過聲明 props 來接收來自父組件的數據。<!-- 父組件 --> <template><ChildComponent :message"parentMessage" /> </templat…

PCL學習之路-基礎知識-(一)

文章目錄1.西門子S7系列PLC類型劃分(1).大型PLC&#xff1a;S7-400(2).中型PLC&#xff1a;S7-300(3).小型PLC&#xff1a;S7-200系列2.西門子S7外形結構(1).總覽&#xff1a;PLC的“器官”分工邏輯3.輸出電路(1).小型繼電器輸出形式(2).大功率晶體管/場效應管輸出形式(3).雙向…

leetcode654:最大二叉樹(遞歸與單調棧雙解法)

文章目錄一、 題目描述二、 核心思路&#xff1a;分而治之與遞歸構造三、代碼實現與深度解析四、 關鍵點與復雜度分析五、拓展解法單調棧解法兩種解法對比LeetCode 654. 最大二叉樹&#xff0c;【難度&#xff1a;中等&#xff1b;通過率&#xff1a;82.6%】&#xff0c;這道題…

Python 循環語法詳解

在編程中&#xff0c;循環是一種非常常見的控制結構。很多時候&#xff0c;我們需要重復做一些事情&#xff0c;比如遍歷列表、處理數據、嘗試直到成功等。這時候&#xff0c;就離不開循環了。Python 提供了兩種主要的循環結構&#xff1a;for 循環 和 while 循環。本篇文章會從…

一個小巧神奇的 USB數據線檢測儀

一個小巧的數據線檢測儀&#xff0c;檢測各種USB數據線是否損壞、通斷&#xff0c;TYPE_C、MICRO_B、蘋果線、燒錄線、網線都可檢測。嵌入式開發者的稱手工具。 這個是我個人制作的&#xff0c;SMT和連接器比較貴&#xff0c;特別是24PIN的C口連接器&#xff0c;我掛在黃色小魚…

37.【.NET8 實戰--孢子記賬--從單體到微服務--轉向微服務】--擴展功能--增加Github Action

在第二部分&#xff08;微服務基礎工具與技術&#xff09;中我們講解了GitHub Action的相關知識&#xff0c;那么在這一節中&#xff0c;我們將為已有的微服務增加GitHub Action的支持。 一、什么是GitHub Action 雖然前面已經介紹過GitHub Action的相關知識&#xff0c;但這里…

ROS2 通過 命令行 發布速度控制指令 控制 麥克娜姆輪

在 ROS2 中&#xff0c;要通過命令行發布速度控制指令來控制麥克娜姆輪機器人&#xff0c;你需要知道機器人所使用的速度控制話題和消息類型。通常麥克娜姆輪機器人使用geometry_msgs/Twist消息類型來接收速度指令。 以下是通過命令行發布速度控制指令的方法&#xff1a; 首先確…

多層Model更新多層ListView

一、總體架構QML (三層 ListView)└─ C 單例 DataCenter (QQmlContext 注冊)├─ L1Model (一級節點)│ └─ 內部持有 QList<L2Model*>│ └─ L2Model (二級節點)│ └─ 內部持有 QList<L3Model*>│ └─ L3Model (三級節…

Git基礎操作教程

本文目的是掌握Git基礎操作教程一、Git簡介Git&#xff1a;分布式版本控制系統&#xff0c;使用倉庫(Repository)來記錄文件的變化最流行的版本控制系統有兩種&#xff1a;集中式&#xff08;SVN&#xff09;、分布式&#xff08;Git&#xff09;二、Git操作1.創建倉庫倉庫(Rep…

Android 之 Kotlin

變量變量的聲明Kotlin使用var&#xff0c;val來聲明變量&#xff0c;注意&#xff1a;Kotlin不再需要;來結尾var 可變變量&#xff0c;對應java的非final變量var b 1val不可變變量&#xff0c;對應java的final變量val a 1兩種變量并未聲明類型&#xff0c;這是因為Kotlin存在…

Design Compiler:布圖規劃探索(ICC)

相關閱讀 Design Compilerhttps://blog.csdn.net/weixin_45791458/category_12738116.html?spm1001.2014.3001.5482 簡介 在Design Compiler Graphical中&#xff0c;可以用布圖規劃探索(Floorplan Exploration)功能&#xff0c;打開IC Compiler進行布圖規劃的創建、修改與分…

《藍牙低功耗音頻技術架構解析》

《2025GAS聲學大講堂—音頻產業創新技術公益講座》低功耗藍牙音頻系列專題LE Audio & Auracast?專題講座第1講將于8月7日周四19點開講&#xff0c;本次邀請了藍牙技術聯盟 技術與市場經理 魯公羽 演講&#xff0c;講座主題&#xff1a;《藍牙低功耗音頻技術架構解析》。&…

ubuntu apt安裝與dpkg安裝相互之間的關系

0. 問題解釋 在linux系統中&#xff0c;使用neofetch命令可以看到現在系統中使用dpkg, flatpak, snap安裝的包的數量&#xff0c;那么使用apt安裝的包被統計在什么位置了呢&#xff0c;使用apt的安裝流程和使用flatpak的安裝流程有什么關系和區別呢?1. apt 安裝的包在哪里&…

YooAsset源碼閱讀-Downloader篇

YooAsset源碼閱讀-Downloader 繼續 YooAsset 的 Downloader &#xff0c;本文將詳細介紹如何創建下載器相關代碼 CreateResourceDownloaderByAll 關鍵類 PlayModeImpl.csResourceDownloaderOperation.csDownloaderOperation.csBundleInfo.cs CreateResourceDownloaderByAll 方法…

豆包新模型與 PromptPilot 實操體驗測評,AI 輔助創作的新范式探索

摘要&#xff1a;在 AI 技術飛速發展的當下&#xff0c;各類大模型及輔助工具層出不窮&#xff0c;為開發者和創作者帶來了全新的體驗。2025 年 7 月 30 日廈門站的火山方舟線下 Meetup&#xff0c;為我們提供了近距離接觸豆包新模型與 PromptPilot 的機會。本次重點體驗了實驗…

深入探討AI在測試領域的三大核心應用:自動化測試框架、智能缺陷檢測和A/B測試優化,并通過代碼示例、流程圖和圖表詳細解析其實現原理和應用場景。

引言隨著人工智能技術的飛速發展&#xff0c;軟件測試領域正在經歷一場深刻的變革。AI技術不僅提高了測試效率&#xff0c;還增強了測試的準確性和覆蓋范圍。本文將深入探討AI在測試領域的三大核心應用&#xff1a;自動化測試框架、智能缺陷檢測和A/B測試優化&#xff0c;并通過…

音視頻學習筆記

0.vs應用其他庫配置1基礎 1.1視頻基礎 音視頻錄制原理音視頻播放原理圖像表示rgb圖像表示yuvhttps://blog.51cto.com/u_7335580/2059670 https://blog.51cto.com/cto521/1944224 https://blog.csdn.net/mandagod/article/details/78605586?locationNum7&fps1 視頻主要概念…

LLM隱藏層狀態: outputs.hidden_states 是 MLP Residual 還是 Layer Norm

outputs.hidden_states 是 MLP Residual 還是 Layer Norm outputs.hidden_states 既不是單純的 MLP Residual,也不是單純的 Layer Norm,而是每一層所有組件(包括 Layer Norm、注意力、MLP、殘差連接等)處理后的最終隱藏狀態。具體需結合 Transformer 層的結構理解: 1. T…