隨著微服務架構的普及,容器化技術已成為不可或缺的佈署方案。本文將深入探討如何利用 Docker 將微服務封裝成映像,並推播到私有註冊中心,最後佈署至目標環境。同時,我們也會探討 Docker Compose 在簡化多容器應用程式開發流程中的關鍵作用,以及如何結合 MongoDB 和 Azure Storage 等工具實作微服務的資料管理。最後,我們將以一個 Node.js 專案的 Docker 佈署為例,完整展示整個流程。
微服務容器化與佈署
封裝微服務
為了將微服務佈署到雲端或其他環境,我們需要將其封裝成一個 Docker 映像。這個過程涉及將微服務的程式碼、依賴函式庫和組態檔案封裝成一個單一的檔案,然後使用 Docker 建立一個映像。
# 使用官方的 Python 基礎映像
FROM python:3.9-slim
# 設定工作目錄
WORKDIR /app
# 複製需求檔案
COPY requirements.txt.
# 安裝依賴函式庫
RUN pip install -r requirements.txt
# 複製微服務程式碼
COPY..
# 暴露連線埠
EXPOSE 8000
# 執行命令
CMD ["python", "app.py"]
上傳映像
一旦我們建立了 Docker 映像,就可以將其上傳到私有的容器註冊中心。這樣,我們就可以從任何地方存取和佈署微服務。
docker push myregistry/myimage:latest
佈署微服務
現在,我們可以使用 Docker 執行命令來啟動微服務容器。
docker run -p 8000:8000 myregistry/myimage:latest
內容解密:
在上面的例子中,我們使用 Dockerfile 來定義微服務的映像。Dockerfile 是一個文字檔,包含了一系列的指令,告訴 Docker 如何建立映像。其中,FROM
指令指定了基礎映像,WORKDIR
指令設定了工作目錄,COPY
指令複製了需求檔案和微服務程式碼,RUN
指令安裝了依賴函式庫,EXPOSE
指令暴露了連線埠,CMD
指令指定了執行命令。
圖表翻譯:
graph LR A[封裝微服務] --> B[建立 Docker 映像] B --> C[上傳映像] C --> D[佈署微服務] D --> E[啟動容器]
圖表翻譯:
在上面的圖表中,我們展示了微服務容器化和佈署的流程。首先,我們封裝微服務成 Docker 映像,然後上傳映像到私有的容器註冊中心。接下來,我們佈署微服務到容器中,最後啟動容器。這個流程使我們可以輕鬆地佈署和管理微服務。
私有容器註冊與開發環境
在軟體開發過程中,尤其是在使用Docker容器化技術時,瞭解私有容器註冊(Private Container Registry)和開發環境(Development Environment)的重要性是非常關鍵的。這兩個概念不僅能夠提升開發效率,也能夠確保軟體的安全性和可靠性。
私有容器註冊
私有容器註冊是指一個用於儲存和管理Docker映象(Docker Image)的私有倉函式庫。與公共容器註冊(如Docker Hub)不同,私有容器註冊允許開發團隊在自己的伺服器上儲存和管理映象,這樣可以更好地控制存取許可權和安全性。
使用私有容器註冊的優點包括:
- 安全性:透過將映象儲存在私有伺服器上,可以更好地控制誰可以存取和下載映象,從而減少了安全風險。
- 可靠性:私有容器註冊可以確保映象的可靠性和一致性,因為開發團隊可以完全控制映象的版本和更新。
- 效率:私有容器註冊可以提高開發效率,因為開發人員可以快速地儲存和分享映象,而不需要依賴公共註冊。
開發環境
開發環境是指軟體開發過程中使用的所有工具、軟體和硬體的集合。一個良好的開發環境應該能夠提供高效、安全和可靠的開發體驗。
在使用Docker容器化技術時,開發環境通常包括以下幾個部分:
- Docker引擎:用於建立和管理Docker容器的軟體。
- 私有容器註冊:用於儲存和管理Docker映象的私有倉函式庫。
- 開發工具:如IDE、編譯器和除錯器等,用於編寫、測試和除錯軟體的工具。
- 版本控制系統:如Git等,用於管理軟體版本和變更的系統。
示例
假設我們有一個開發團隊,正在使用Docker容器化技術開發一個Web應用。團隊成員可以使用私有容器註冊來儲存和管理Docker映象,並使用Docker引擎來建立和管理Docker容器。
flowchart TD A[開發人員] -->|推播映象|> B[私有容器註冊] B -->|儲存映象|> C[映像檔倉函式庫] C -->|下載映象|> D[開發環境] D -->|建立容器|> E[Docker引擎] E -->|啟動容器|> F[Web應用]
在這個示例中,開發人員可以將Docker映象推播到私有容器註冊,然後在開發環境中下載和啟動映象,從而建立和啟動Web應用。
內容解密:
- 私有容器註冊是指一個用於儲存和管理Docker映象的私有倉函式庫。
- 開發環境是指軟體開發過程中使用的所有工具、軟體和硬體的集合。
- 使用私有容器註冊和Docker容器化技術可以提高開發效率和安全性。
圖表翻譯:
- 圖表展示了開發人員如何使用私有容器註冊和Docker引擎來建立和管理Docker容器。
- 圖表中,開發人員將Docker映象推播到私有容器註冊,然後在開發環境中下載和啟動映象,從而建立和啟動Web應用。
使用Docker進行Node.js專案佈署
Docker是一種容器化技術,允許開發人員封裝、釋出和執行應用程式,而無需考慮底層基礎設施。以下是使用Docker進行Node.js專案佈署的步驟:
步驟1:建立Dockerfile
首先,需要建立一個Dockerfile,該檔案包含了構建Docker映像的指令。以下是Node.js專案的Dockerfile範例:
FROM node:14
WORKDIR /app
COPY package*.json./
RUN npm install
COPY..
RUN npm run build
EXPOSE 3000
CMD [ "npm", "start" ]
這個Dockerfile使用官方的Node.js 14映像,設定工作目錄,複製package.json檔案,安裝依賴項,複製應用程式程式碼,構建應用程式,暴露3000連線埠,並設定啟動命令。
步驟2:構建Docker映像
接下來,需要構建Docker映像。可以使用以下命令:
docker build -t my-node-app.
這個命令會構建一個名為my-node-app的Docker映像。
步驟3:執行Docker容器
構建好Docker映像後,可以使用以下命令執行Docker容器:
docker run -d -p 3000:3000 my-node-app
這個命令會執行一個名為my-node-app的Docker容器,將主機的3000連線埠對映到容器的3000連線埠。
步驟4:檢視容器日誌
如果需要檢視容器的日誌,可以使用以下命令:
docker logs -f <container-id>
這個命令會顯示容器的日誌。
Docker命令回顧
以下是Docker的一些常用命令:
docker --version
: 檢查Docker版本docker container list
: 列出正在執行的容器docker container list -a
: 列出所有容器(包括停止的)docker image list
: 列出本地映像docker build -t <tag> --file <docker-file>.
: 根據Dockerfile構建映像docker run -d -p <host-port>:<container-port> -e <name>=<value> <tag>
: 執行容器docker logs <container-id>
: 檢視容器日誌
Mermaid圖表
graph LR A[Dockerfile] -->|構建|> B[Docker映像] B -->|執行|> C[Docker容器] C -->|暴露連線埠|> D[主機] D -->|對映連線埠|> C
圖表翻譯:
這個Mermaid圖表展示了Dockerfile、Docker映像、Docker容器和主機之間的關係。首先,根據Dockerfile構建Docker映像,然後執行Docker容器,容器暴露連線埠,主機對映連線埠到容器。
使用 Docker 建立和發布微服務
Docker 是一個用於封裝、發布和執行容器的工具。容器是一種虛擬化的伺服器,可以用於佈署微服務。在本章中,我們將探討如何使用 Docker 建立和發布一個單一的微服務。
Docker 基礎概念
- 容器(Container):是一種虛擬化的伺服器,可以用於佈署微服務。
- 映像(Image):是一個容器的快照,可以用於建立新的容器。
- 容器註冊中心(Container Registry):是一個用於儲存和管理映像的倉函式庫,可以用於佈署微服務到 Kubernetes 叢集。
- Dockerfile:是一個用於建立映像的指令碼,指定了微服務的程式碼和資產。
Docker 命令
docker build
:用於從 Dockerfile 建立映像。docker run
:用於從映像啟動容器。docker push
:用於將映像發布到容器註冊中心。docker tag
:用於為映像增加標籤,以便將其發布到容器註冊中心。
Docker Hub
Docker Hub 提供了許多免費的映像,可以用於佈署自己的伺服器。在本章中,我們嘗試使用 MongoDB 映像,並將在未來章節中繼續使用。
建立和發布微服務
- 建立一個 Dockerfile,指定微服務的程式碼和資產。
- 使用
docker build
命令從 Dockerfile 建立映像。 - 使用
docker run
命令從映像啟動容器。 - 使用
docker tag
命令為映像增加標籤,以便將其發布到容器註冊中心。 - 使用
docker push
命令將映像發布到容器註冊中心。
內容解密:
上述過程涉及多個 Docker 命令,包括 docker build
、docker run
、docker push
和 docker tag
。每個命令都有其特定的功能,例如建立映像、啟動容器、發布映像和增加標籤。瞭解這些命令的作用和使用方法是使用 Docker 的關鍵。
圖表翻譯:
graph LR A[Dockerfile] -->|建立映像|> B[映像] B -->|啟動容器|> C[容器] C -->|增加標籤|> D[標籤] D -->|發布映像|> E[容器註冊中心]
上述圖表展示了使用 Docker 建立和發布微服務的過程,包括建立 Dockerfile、建立映像、啟動容器、增加標籤和發布映像。每個步驟都對應著一個特定的 Docker 命令,例如 docker build
、docker run
、docker tag
和 docker push
。
微服務的資料管理
當構建任何應用程式時,我們通常需要處理資料、檔案和有時兩者。微服務也不例外。我們需要一個資料函式庫來儲存由玄貓生成和更新的動態資料,並需要一個地方來儲存由玄貓提供的資產。
在本章中,我們將向FlixTube示例應用程式增加檔案儲存和資料函式庫。首先,我們將增加檔案儲存,以便FlixTube具有儲存影片的位置。我們希望在應用程式中為串流媒體和影片儲存建立不同的責任區域。這意味著我們需要向應用程式增加另一個微服務,在本章中,我們將建立我們的第二個微服務。
本章涵蓋以下內容:
- 使用Docker Compose構建和執行微服務應用程式以進行開發和測試
- 向應用程式增加檔案儲存
- 向應用程式增加資料函式庫
然後,我們將增加一個資料函式庫來記錄每個影片的元資料。目前,這只是影片路徑,但這只是為了將資料函式庫放在適合的地方,因為一旦我們有了它,我們就可以繼續使用它來儲存所有微服務的正在進行的資料。
透過玄貓,我們正在採取一項重要步驟。在第2章中,我們構建了我們的第一個微服務;在第3章中,我們使用Docker將我們的第一個微服務例項化到一個容器中。在本章中,我們將應用程式擴充套件到主機多個容器,這意味著我們需要一個新工具!
4.1 新工具
本章介紹了兩種儲存微服務資料的方法:檔案儲存和資料函式庫。通常,有很多方法可以做到這一點,還有很多工具可以選擇。您為每個專案選擇的工具將是最適合該專案、您的團隊、您的公司和您的客戶的工具。
就像書中的任何示例一樣,我需要做出選擇,因此從本章開始,我們將使用MongoDB作為我們的資料函式庫,使用Azure Storage作為我們的檔案儲存。我們還將升級我們的開發環境,以便同時執行多個容器。我們可以使用Docker的構建和執行命令來做到這一點,就像你在前一章學到的那樣,但是我們最終會不得不為每個容器重複執行這些命令。這不是一個大問題,當你只與幾個容器合作時,但它不會擴充套件到一個更大的應用程式。想象一下,用這種方式執行10個微服務需要多少努力!因此,我們需要一個更好的方式來管理多個微服務在開發期間。為此,本章介紹了Docker Compose。表4.1列出了您將在本章學習的新工具。
表4.1 本章介紹的工具
工具 | 版本 | 目的 |
---|---|---|
Docker Compose | 隨Docker附帶 | Docker Compose隨Docker附帶(在第3章安裝)並允許我們組態、構建、執行和管理多個容器同時。它對開發很有用,但我們不會在生產中使用它。 |
Azure Storage | Azure Storage是一種雲端儲存檔案的服務。我們可以透過Azure門戶、API或命令列管理資產。我們透過Azure門戶上傳影片,然後使用Node.js Azure Storage SDK讀取它。 | |
@azure/storage-blob | 12.15.0 | 我們使用此npm包從Azure Storage使用JavaScript檢索檔案。 |
MongoDB | 7.0.0 | MongoDB是一種流行的NoSQL型別資料函式庫。它輕量級、易於設定和使用,並且對於微服務很方便。 |
mongodb | 6.0.0 | MongoDB的Node.js驅動程式是一個npm包,我們使用它從JavaScript與資料函式庫互動。 |
4.3 使用Docker Compose開發微服務
4.2 取得程式碼
要遵循本章的內容,您需要下載程式碼或使用Git克隆倉函式庫:
git clone <倉函式庫URL>
如需安裝和使用Git的幫助,請參閱第2章。如果您遇到程式碼問題,請在GitHub上對倉函式庫提出問題。
4.3 使用 Docker Compose 開發微服務
在前一章的結尾,我們建立了一個單一的微服務,並在容器中執行於我們的開發電腦上。我們可以使用網頁瀏覽器進行測試。圖 4.1 展示了我們目前的情況。 然而,微服務應用程式如果只包含一個微服務,那就不是真正的微服務應用程式!現在是擴充套件我們的應用程式、增加更多容器、並將其轉變為多個微服務的時候。為了開發和測試我們的微服務應用程式,我們將開始使用 Docker Compose。 在本章中,我們將擴充套件到多個容器,因為我們想增加一個資料函式庫(這是一個容器,但我們不將其視為微服務),並增加一個新的微服務來處理我們的檔案儲存(這是另一個容器)。假設我們從一個容器開始(我們的視訊串流微服務),現在我們將有三個容器,如圖 4.2 所示。 要建立、執行和管理我們不斷增長的應用程式,我們可以使用 Docker 來建立和執行每個容器。但是,這在開發過程中會很快變得繁瑣,因為我們需要在工作日中多次停止和重新啟動我們的應用程式。隨著應用程式的不斷增長,這種情況只會更加糟糕,因為我們會繼續向應用程式中增加容器。因此,我們需要一個更好的工具。
4.3.1 為什麼使用 Docker Compose?
在開發過程中,管理多個容器可能會很麻煩;在第 6 章和第 7 章中,您將學習如何使用 Kubernetes 來管理生產環境中的容器。然而,Kubernetes 是一個大型且複雜的系統,旨在在多臺電腦的叢集上執行。雖然我們可以使用 Docker Desktop 中包含的 Kubernetes 的本地版本,但它對資源的需求很高(試著在筆記型電腦上執行它以檢視效能不佳),且不太方便使用,特別是在我們同時工作於多個專案時。 我們將在第 6 章中討論 Kubernetes,您將學習如何在開發和生產環境中使用它。所以請不要擔心,您沒有錯過任何東西,我們很快就會討論到 Kubernetes。目前,我們可以使用 Docker Compose 來「模擬」Kubernetes 在我們的開發電腦上,它比直接跳入 Kubernetes 更容易、更直接。此外,Docker Compose 現在已經與 Docker 一起安裝,而不是單獨安裝。 為什麼使用 Docker Compose?與 Docker 允許我們建立、執行和管理單一微服務一樣,Docker Compose 提供了一種方便的方式來建立、執行和管理開發中的多個微服務。在開發和測試過程中,我們必須經常啟動和重新啟動整個應用程式,這最終將包含許多微服務。在每次小幅度的開發之後,我們還必須測試程式碼的變更。我們可以透過以下方法實作這一點:
- 開啟多個終端機(每個微服務一個),然後使用 Node.js 或其他技術堆積堆疊單獨執行每個微服務(如第 2 章所述)
- 使用 Docker 單獨建立和執行每個容器(如第 3 章所述) 每種方法都是一個重要的里程碑,幫助我們構建微服務應用程式,我們經常會回到這些方法。
graph LR A[開發電腦] --> B[Docker 執行時] B --> C[視訊串流微服務] C --> D[檔案儲存微服務] D --> E[資料函式庫]
圖表翻譯:
此圖表描述了開發電腦上的 Docker 執行時環境,其中包含視訊串流微服務、檔案儲存微服務和資料函式庫。每個微服務都在自己的容器中執行,Docker Compose 可以幫助管理和協調這些容器。
內容解密:
在本文中,我們介紹了 Docker Compose 的概念及其在開發多個微服務方面的重要性。Docker Compose 提供了一種方便的方式來建立、執行和管理多個微服務,使其成為構建複雜微服務應用程式的理想工具。透過使用 Docker Compose,我們可以輕鬆地管理多個容器,減少手動組態和管理的需求,並提高開發效率。
微服務開發與Docker Compose
在微服務架構中,管理多個服務的執行和協調是一個挑戰。雖然Docker提供了一種輕量級的容器化解決方案,但當應用程式變得更加複雜時,僅使用Docker可能不足以滿足需求。這就是Docker Compose的用武之地。
什麼是Docker Compose?
Docker Compose是一種開源工具,允許您定義和執行多容器的Docker應用程式。它透過一個單一的組態檔案(docker-compose.yml)來管理多個服務的建立、啟動和停止。
建立Docker Compose檔案
要使用Docker Compose,您需要建立一個docker-compose.yml檔案。這個檔案定義了您的應用程式的結構,包括每個服務的映像、連線埠和依賴關係。
version: '3'
services:
web:
build:.
ports:
- "80:80"
depends_on:
- db
db:
image: postgres
environment:
- POSTGRES_USER=myuser
- POSTGRES_PASSWORD=mypassword
啟動應用程式
建立了docker-compose.yml檔案後,您可以使用docker compose up
命令啟動您的應用程式。這個命令會根據您的組態檔案建立和啟動所有服務。
docker compose up --build
微服務應用程式的優勢
使用Docker Compose管理微服務應用程式有幾個優勢:
- 簡化複雜性:Docker Compose簡化了多容器應用程式的管理,讓您可以專注於開發而不是基礎設施。
- 提高生產力:透過自動化服務的建立和啟動,您可以更快速地迭代和測試您的應用程式。
- 易於擴充套件:Docker Compose使得水平擴充套件您的應用程式變得更加容易,您可以根據需要增加或刪除服務例項。
圖表翻譯:
graph LR A[Docker Compose] -->|定義|> B[docker-compose.yml] B -->|建立|> C[服務例項] C -->|啟動|> D[應用程式] D -->|管理|> E[多容器]
上述Mermaid圖表展示了Docker Compose如何透過docker-compose.yml檔案定義和建立服務例項,從而啟動和管理整個微服務應用程式。
使用Docker Compose構建微服務應用
在開始使用Docker Compose建立多容器應用之前,讓我們先從一個簡單的單容器應用開始,進行一些實驗以熟悉Docker Compose。然後,我們將增加更多容器到混合中。
建立Docker Compose檔案
首先,我們需要將微服務的Dockerfile和程式碼移到一個新的子目錄中。在本例中,我們將其命名為video-streaming
,以匹配微服務的名稱。這是因為我們現在正在構建一個將來會有多個微服務的應用程式,因此我們必須將每個微服務放在其自己的子目錄中。我們的約定是,每個子目錄都以其對應的微服務命名。
接下來,讓我們建立Docker Compose檔案,名為docker-compose.yaml
。由於它不屬於任何單個微服務,因此它位於微服務應用程式的根目錄中。以下是我們的第一個Docker Compose檔案:
version: '3'
services:
video-streaming:
解釋Docker Compose檔案
在這個檔案中,我們定義了一個名為video-streaming
的服務。這個服務對應於我們在章節2中建立的video-streaming
微服務。
目錄結構
以下是示例1專案的目錄結構:
README.MD
video-streaming/
Dockerfile
package-lock.json
package.json
src/
index.js
videos/
SampleVideo_1280x720_1mb.mp4
docker-compose.yml
在這個目錄結構中,video-streaming
子目錄包含了微服務的Dockerfile和程式碼,而docker-compose.yml
檔案則位於根目錄中。
使用Docker Compose啟動應用
要啟動應用,我們可以執行以下命令:
docker-compose up
這將啟動video-streaming
微服務,並使其可透過網路存取。
內容解密:
在上面的命令中,docker-compose up
用於啟動Docker Compose定義的所有服務。在本例中,只有一個名為video-streaming
的服務。當我們執行這個命令時,Docker Compose將建立一個名為video-streaming
的容器,並啟動微服務。
圖表翻譯:
以下是Docker Compose檔案和容器之間的關係圖:
flowchart TD A[Docker Compose檔案] --> B[容器建立] B --> C[容器啟動] C --> D[微服務啟動]
在這個圖表中,Docker Compose檔案定義了容器的建立和啟動過程。當我們執行docker-compose up
命令時,Docker Compose將建立一個容器,並啟動微服務。
使用Docker Compose建立視訊串流微服務
簡介
在本文中,我們將使用Docker Compose建立一個視訊串流微服務。這個微服務將使用Docker Compose file格式,版本3,來定義和啟動容器。
Docker Compose檔案
以下是Docker Compose檔案的內容:
version: '3'
services:
video-streaming:
image: video-streaming
build:
context:./video-streaming
dockerfile: Dockerfile
container_name: video-streaming
ports:
- "4000:80"
environment:
- PORT=80
restart: "no"
這個檔案定義了一個名為video-streaming
的微服務,該微服務使用video-streaming
映像檔,並在./video-streaming
目錄下建立。Dockerfile的名稱為Dockerfile
,容器名稱為video-streaming
。我們將容器的80埠對映到主機的4000埠,並設定環境變數PORT
為80。
重點設定
version
: 指定Docker Compose檔案的版本為3。services
: 定義微服務的名稱和設定。image
: 指定映像檔的名稱。build
: 定義如何建立映像檔。context
: 指定建立映像檔的目錄。dockerfile
: 指定Dockerfile的名稱。container_name
: 指定容器的名稱。ports
: 定義埠對映。environment
: 設定環境變數。restart
: 設定容器重啟的行為。
從技術架構視角來看,微服務容器化佈署方案以 Docker 為核心,結合 Docker Compose 和私有容器註冊中心,實作了應用程式元件的隔離、封裝和自動化佈署。透過 Dockerfile 定義微服務的執行環境,確保了環境一致性,簡化了佈署流程。Docker Compose 則有效地管理了多容器應用程式的生命週期,提升了開發效率。然而,目前方案的彈性擴充套件能力和服務發現機制仍需進一步完善,才能更好地適應複雜的微服務架構。對於追求高用性和容錯性的應用程式,引入 Kubernetes 等容器協調工具將是下一步的關鍵。玄貓認為,此容器化策略適用於快速迭代開發和中小型應用佈署,但需持續關注容器安全性和資源管理,才能確保系統的長期穩定執行。隨著服務網格等技術的發展,我們預見微服務的佈署和管理將更加便捷和人工智慧化。