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 準備工作
-
安裝Docker:請根據你的操作系統,參考Docker官方文檔進行安裝。
-
打包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章的源碼