Docker Compose 簡化了多容器應用程式的管理,讓開發者能以單一指令控制整個應用程式的生命週期。本文將逐步說明如何使用 Docker Compose 定義和管理微服務應用程式,包含容器的建置、啟動、日誌檢視,以及多個容器間的協作。同時,文章也涵蓋瞭如何整合 Azure Storage 作為檔案儲存服務,並示範如何建置一個視訊串流微服務,從 Azure Storage 讀取和提供視訊內容。最後,文章也強調了在微服務架構下,個別微服務的測試與資料管理的重要性,並提供相關的程式碼範例和說明。
埠號設定
我們從4000開始設定埠號,以避免與其他微服務的埠號衝突。如果您已經在開發電腦上執行其他網頁伺服器或服務,可能需要關閉它們或更改埠號。
重啟設定
在開發階段,我們不希望微服務在當機時自動重啟。這樣可以幫助我們發現問題並進行除錯。在生產環境中,我們通常希望微服務在當機時自動重啟。
建立和啟動容器
使用以下命令建立和啟動容器:
docker-compose up -d
這將建立和啟動video-streaming
容器,並在背景模式下執行。
使用Docker Compose管理微服務應用
Docker Compose是一種強大的工具,能夠幫助我們管理和協調微服務應用。在本章中,我們將學習如何使用Docker Compose來建立和管理微服務應用。
建立Docker Compose檔案
首先,我們需要建立一個Docker Compose檔案,該檔案將包含我們微服務應用的組態訊息。以下是範例Docker Compose檔案的內容:
version: '3'
services:
video-streaming:
build:.
environment:
- PORT=4000
ports:
- "4000:4000"
在這個範例中,我們定義了一個名為video-streaming
的服務,該服務將從當前目錄下的Dockerfile建立。環境變數PORT
被設定為4000,表示該服務將使用4000連線埠。
啟動微服務應用
要啟動微服務應用,我們可以使用以下命令:
docker compose up --build
這個命令將建立和啟動我們的微服務應用。--build
引數表示Docker Compose將在啟動應用之前重新建立映像。
檢視應用日誌
當應用啟動後,我們可以檢視應用的日誌輸出。以下是範例日誌輸出的內容:
video-streaming | > example-1@1.0.0 start /usr/src/app
video-streaming | > node./src/index.js
video-streaming |
video-streaming | Microservice online
在這個範例中,我們可以看到應用的日誌輸出,包括啟動命令和微服務的狀態訊息。
管理多個容器
當我們有多個容器時,Docker Compose可以幫助我們管理和協調這些容器。以下是範例Docker Compose檔案的內容:
version: '3'
services:
video-streaming:
build:.
environment:
- PORT=4000
ports:
- "4000:4000"
another-service:
build:./another-service
environment:
- PORT=5000
ports:
- "5000:5000"
在這個範例中,我們定義了兩個服務:video-streaming
和another-service
。每個服務都有自己的組態訊息,包括環境變數和連線埠對映。
使用Docker Compose管理微服務應用
在上一章中,我們學習瞭如何使用Docker建立和管理容器。在這一章中,我們將學習如何使用Docker Compose來管理微服務應用。
什麼是Docker Compose?
Docker Compose是一個工具,允許您定義和執行多個容器的應用程式。它提供了一種簡單的方式來管理複雜的應用程式,並確保所有容器之間的正確通訊。
如何使用Docker Compose?
要使用Docker Compose,您需要建立一個docker-compose.yml
檔案,該檔案定義了您的應用程式的結構和容器之間的關係。然後,您可以使用docker-compose up
命令啟動您的應用程式。
啟動應用程式
當您啟動您的應用程式時,Docker Compose會建立和啟動所有定義在docker-compose.yml
檔案中的容器。您可以使用docker-compose ps
命令檢視正在執行的容器列表。
停止應用程式
您可以使用docker-compose stop
命令停止您的應用程式。或者,您可以使用Ctrl+C
鍵停止應用程式,但這種方法可能會導致容器未能正常停止。
移除容器
當您停止您的應用程式時,容器會保持在停止狀態。如果您想要移除容器,您可以使用docker-compose down
命令。這個命令會移除所有容器和相關的卷。
使用Docker Compose的好處
使用Docker Compose有許多好處,包括:
- 簡化複雜應用程式的管理:Docker Compose允許您定義和執行多個容器的應用程式,使得管理複雜應用程式變得更加簡單。
- 確保容器之間的正確通訊:Docker Compose提供了一種簡單的方式來確保容器之間的正確通訊。
- 方便地重新啟動應用程式:您可以使用
docker-compose down
和docker-compose up
命令重新啟動您的應用程式,從而方便地更新程式碼或依賴項。
圖表翻譯:
graph LR A[啟動應用程式] --> B[建立和啟動容器] B --> C[檢視容器列表] C --> D[停止應用程式] D --> E[移除容器] E --> F[重新啟動應用程式]
內容解密:
在上面的圖表中,我們展示了使用Docker Compose管理微服務應用程式的流程。首先,我們啟動應用程式,然後建立和啟動容器。接下來,我們檢視容器列表,以確保所有容器都正在執行。當我們需要停止應用程式時,我們可以使用docker-compose stop
命令或Ctrl+C
鍵。最後,我們可以使用docker-compose down
命令移除容器,並重新啟動應用程式以更新程式碼或依賴項。
微服務的資料管理
在前面的章節中,我們已經學習瞭如何使用Docker Compose來管理微服務。但是,微服務的資料管理是一個更加複雜的問題。在這個章節中,我們將學習如何使用Azure Storage來為微服務增加檔案儲存功能。
為什麼使用Docker Compose進行開發,但不使用它進行生產?
在開發過程中,Docker Compose是一個非常方便的工具,因為它可以讓我們快速地啟動和停止微服務。但是,在生產環境中,Kubernetes是一個更好的選擇。Kubernetes可以提供更好的可擴充套件性和高用性,但是它也更加複雜。
增加檔案儲存到應用程式
現在,我們已經有了一個基本的微服務應用程式,但是它還缺乏檔案儲存功能。為了增加檔案儲存,我們將使用Azure Storage。Azure Storage是一個雲端儲存服務,提供了私有和公有檔案的儲存和存取功能。
使用Azure Storage
首先,我們需要建立一個Azure Storage帳戶。然後,我們可以上傳我們的測試影片到Azure Storage。接下來,我們將建立一個新的微服務,其目的是從Azure Storage中檢索影片。
Azure Storage的定義
Azure Storage是一個Microsoft Azure服務,用於在雲端中儲存私有或公有檔案。您可以上傳檔案到Azure Storage,然後透過Azure Storage API存取它們。
為什麼選擇Azure Storage?
我們有很多選擇來進行檔案儲存,為什麼選擇Azure Storage?事實上,我們可以使用AWS S3或Google Cloud Storage等其他雲端儲存服務。但是,對於本章的目的來說,選擇哪一個並不重要。重要的是,我們需要一個雲端儲存服務來儲存和存取檔案。
微服務應用程式
現在,我們已經有了一個基本的微服務應用程式,包括影片串流媒體和影片儲存微服務。影片儲存微服務負責從Azure Storage中檢索影片。這個微服務將使用@azure/storage-blob包來與Azure Storage進行互動。
微服務應用程式的結構
下面是微服務應用程式的結構:
微服務應用程式
|
|-- 影片串流媒體
|
|-- 影片儲存
| |
| |-- Azure Storage
在這個結構中,影片儲存微服務負責從Azure Storage中檢索影片。影片串流媒體微服務可以透過影片儲存微服務來存取影片。
微服務應用中的檔案儲存新增
為了將第二個微服務新增至我們的應用程式中,我們需要增加一個新的容器。這個容器將負責代管我們的第二個微服務。現在,當我們觀察整個應用程式架構時,我們可以看到已經有兩個容器在執行。
檔案儲存的優勢
在微服務架構中,我們可以輕易地替換掉現有的儲存微服務(如 Azure 儲存),並用其他替代方案取代。這種設計使得我們的應用程式更加靈活,即使在生產環境中,也能夠進行這種替換。因此,可以把這種儲存微服務視為「熱可換」(hot-swappable)。
建立 Azure 儲存帳戶
在開始使用檔案儲存之前,我們需要建立一個 Azure 儲存帳戶。這個過程與第三章中描述的類別似。在 Azure 入口網站中,點選左側選單中的「建立資源」,然後搜尋「儲存帳戶」。選擇 Microsoft 的儲存帳戶選項,然後點選「建立」。
接下來,您需要填寫新儲存帳戶的詳細訊息,包括選擇一個資源群組(您可以使用第三章中建立的資源群組,或者建立一個新的)和為您的儲存帳戶命名。其他設定可以保持預設值。填寫完成後,點選「審查 + 建立」。如果詳細訊息透過驗證,您就可以點選「建立」來建立儲存帳戶。
取得儲存帳戶存取金鑰
等待儲存帳戶佈署完成後,您可以點選通知中的「前往資源」或在全球資源列表中找到您的儲存帳戶。開啟儲存帳戶後,在左側選單中點選「存取金鑰」。這裡您會看到與您的儲存帳戶相關的存取金鑰,包括連線字串和金鑰值。您需要記下儲存帳戶名稱和其中一條金鑰的值,以便稍後用於驗證。
內容解密:
# 步驟 1:建立 Azure 儲存帳戶
- 前往 Azure 入口網站
- 點選左側選單中的「建立資源」
- 搜尋「儲存帳戶」
- 選擇 Microsoft 的儲存帳戶選項
- 點選「建立」
# 步驟 2:填寫儲存帳戶詳細訊息
- 選擇一個資源群組
- 為您的儲存帳戶命名
- 填寫其他必要詳細訊息
# 步驟 3:審查和建立儲存帳戶
- 點選「審查 + 建立」
- 如果詳細訊息透過驗證,點選「建立」
# 步驟 4:取得儲存帳戶存取金鑰
- 等待儲存帳戶佈署完成
- 前往您的儲存帳戶資源頁面
- 點選左側選單中的「存取金鑰」
- 記下儲存帳戶名稱和其中一條金鑰的值
圖表翻譯:
flowchart TD A[建立 Azure 儲存帳戶] --> B[填寫儲存帳戶詳細訊息] B --> C[審查和建立儲存帳戶] C --> D[取得儲存帳戶存取金鑰] D --> E[記下儲存帳戶名稱和金鑰值]
這個流程圖描述了建立 Azure 儲存帳戶的步驟,從建立開始到取得存取金鑰為止。每一步驟都對應著實際操作中的具體動作,幫助您更好地理解和實作這個過程。
將影片上傳到 Azure 儲存體
現在我們已經建立了儲存體帳戶,接下來可以上傳測試影片。在 Azure 入口網站中,開啟儲存體帳戶,然後在左側選單中點選「容器」。您應該會看到一個空的容器列表,如圖 4.9 所示。
由玄貓補充,為避免混淆,Azure 儲存體中的容器與我們在微服務應用程式中執行的容器不同。Azure 儲存體中的容器更像是一個目錄,是用於儲存檔案的位置。
點選工具欄中的「+ 容器」按鈕建立您的第一個容器。現在,為您的容器輸入一個名稱。您可以根據自己的喜好命名,但為了方便,讓我們繼續進行下一步。
在建立容器之前,我們需要確認一下儲存體帳戶的身份驗證詳情。如圖 4.8 所示,點選「顯示」按鈕以檢視您的存取金鑰。這些詳情對於與您的儲存體帳戶進行身份驗證至關重要。
回到容器的建立,輸入容器名稱後,點選「建立」按鈕即可完成容器的建立。現在,您已經有了一個可以用於儲存檔案的容器。
內容解密:
上述過程中,我們建立了一個 Azure 儲存體帳戶,並在其中建立了一個容器。這個容器將用於儲存我們的測試影片。透過這個過程,我們可以瞭解到 Azure 儲存體中的容器是如何工作的,以及如何使用它們來儲存和管理檔案。
flowchart TD A[建立儲存體帳戶] --> B[點選 Containers] B --> C[建立容器] C --> D[輸入容器名稱] D --> E[點選建立] E --> F[容器建立完成]
圖表翻譯:
此圖表展示了建立 Azure 儲存體容器的步驟。從建立儲存體帳戶開始,然後點選「Containers」選項,接下來建立一個新的容器,輸入容器名稱,最後點選「建立」按鈕即可完成容器的建立。這個過程展示瞭如何在 Azure 儲存體中建立和管理容器。
建立儲存容器
要在 Azure 中儲存影片檔案,我們需要建立一個儲存容器。這個容器將用於存放我們的影片檔案。首先,導航到 Azure 儲存體的容器選項,然後點選「+ 容器」按鈕來建立一個新的容器。
在建立容器時,我們需要為它命名。讓我們將其命名為「影片」。此外,我們還可以選擇存取級別,但在本例中,我們將使用預設的「私有存取」。
建立容器後,我們可以在容器列表中看到它。點選容器名稱即可檢視其內容。在檢視新容器的內容時,您可能會看到一條訊息,指出尚未上傳任何檔案(Blob)。如果您不清楚什麼是 Blob,不用擔心,它只是檔案的另一個稱呼。
上傳影片檔案
現在,讓我們上傳一個影片檔案到我們的儲存容器中。點選工具欄中的「上傳」按鈕,然後選擇要上傳的檔案。如果您沒有影片檔案,可以使用章節 4 的示例程式碼倉函式庫中的示例影片。
上傳影片檔案後,您可以在容器的檔案列表中看到它。
建立微服務以讀取 Azure 儲存體
既然我們已經將測試影片上傳到 Azure 儲存體中,現在是建立新的影片儲存微服務的時候了。這是我們的第二個官方微服務,它將是一個 REST API,用於從我們的儲存提供者檢索影片。
注意,我們可以直接將影片串流媒體微服務與雲儲存整合,但為了更大的靈活性和未來可能的擴充套件性,我們選擇在另一個微服務後面抽象化這個連線。
首先,我們需要為新的微服務建立一個目錄。您可以從頭開始建立一個新的子目錄,或者直接開啟章節 4 程式碼倉函式庫中的 example-2,並在 VS Code 中開啟它。讓我們將這個新的子目錄命名為「azure-storage」,以表明其與 Azure 儲存體相關的目的。如果我們要增加不同的儲存提供者,我們會給它們不同的名稱(例如,aws-storage 或 google-storage)。
以下是 example-2 專案的佈局:
example-2
docker-compose.yml
README.MD
azure-storage
Dockerfile
package-lock.json
package.json
src
index.js
video-streaming
在上傳測試影片後,您可以在「影片」儲存容器中的檔案列表中看到它。
內容解密
在上面的過程中,我們建立了一個新的儲存容器,然後上傳了一個影片檔案到其中。接下來,我們將建立一個新的微服務,以便從 Azure 儲存體中讀取影片檔案。這個微服務將是一個 REST API,用於檢索影片。
圖表翻譯
以下是建立儲存容器和上傳影片檔案的流程圖:
flowchart TD A[建立儲存容器] --> B[上傳影片檔案] B --> C[檢視檔案列表] C --> D[建立微服務] D --> E[實作 REST API]
這個流程圖顯示了從建立儲存容器到實作 REST API 的整個過程。每一步驟都很重要,因為它們共同構成了我們的影片儲存和檢索系統。
圖表翻譯
以下是 example-2 專案的佈局圖:
graph TD A[example-2] --> B[azure-storage] B --> C[docker-compose.yml] B --> D[README.MD] B --> E[package.json] B --> F[src] F --> G[index.js] F --> H[video-streaming]
這個圖表顯示了 example-2 專案的結構,包括 azure-storage 目錄、docker-compose.yml 檔案、README.MD 檔案等。這有助於我們瞭解專案的組織結構。
微服務應用程式的資料管理
在微服務架構中,資料管理是一個重要的議題。每個微服務都需要管理自己的資料,並且需要與其他微服務進行溝通和資料交換。在本文中,我們將介紹如何使用 Docker 和 Azure Blob Storage 來實作微服務的資料管理。
專案結構
首先,我們需要建立一個新的專案結構。如下所示:
example-2/
Dockerfile
package-lock.json
package.json
src/
index.js
azure-storage/
Dockerfile
package.json
src/
index.js
video-streaming/
Dockerfile
package.json
src/
index.js
在這個結構中,我們有三個微服務:azure-storage
、video-streaming
和 example-2
。每個微服務都有自己的 Dockerfile
和 package.json
檔案。
Azure Blob Storage
Azure Blob Storage 是一個雲端儲存服務,允許我們儲存和管理大型檔案和物件。在本文中,我們將使用 Azure Blob Storage 來實作微服務的資料管理。
首先,我們需要安裝 @azure/storage-blob
套件:
npm install --save @azure/storage-blob
然後,我們可以建立一個新的 Azure Blob Storage 客戶端:
const { BlobServiceClient, StorageSharedKeyCredential } = require("@azure/storage-blob");
const accountName = "your_account_name";
const accountKey = "your_account_key";
const blobServiceClient = new BlobServiceClient(
`https://${accountName}.blob.core.windows.net`,
new StorageSharedKeyCredential(accountName, accountKey)
);
微服務程式碼
以下是 azure-storage
微服務的程式碼:
const express = require("express");
const { BlobServiceClient, StorageSharedKeyCredential } = require("@azure/storage-blob");
const PORT = process.env.PORT;
const app = express();
app.get("/blobs", async (req, res) => {
const blobServiceClient = new BlobServiceClient(
`https://${accountName}.blob.core.windows.net`,
new StorageSharedKeyCredential(accountName, accountKey)
);
const containerName = "your_container_name";
const containerClient = blobServiceClient.getContainerClient(containerName);
const blobs = await containerClient.listBlobsFlat();
res.json(blobs);
});
app.listen(PORT, () => {
console.log(`Server listening on port ${PORT}`);
});
這個程式碼建立了一個 Express.js 伺服器,提供了一個 /blobs
端點,傳回 Azure Blob Storage 中的所有 blobs。
執行微服務
要執行微服務,我們需要建立一個 Docker 映像檔:
docker build -t azure-storage.
然後,我們可以執行微服務:
docker run -p 8080:8080 azure-storage
現在,我們可以存取 /blobs
端點,傳回 Azure Blob Storage 中的所有 blobs:
curl http://localhost:8080/blobs
Azure 儲存體服務整合
為了將 Azure 儲存體服務整合到我們的應用程式中,我們需要先設定儲存體帳戶和存取金鑰。以下是設定儲存體帳戶名稱和存取金鑰的程式碼:
const STORAGE_ACCOUNT_NAME = process.env.STORAGE_ACCOUNT_NAME;
const STORAGE_ACCESS_KEY = process.env.STORAGE_ACCESS_KEY;
接下來,我們需要建立一個連線到 Azure 儲存體 API 的函式。這個函式會使用儲存體帳戶名稱和存取金鑰來建立一個共用金鑰憑證:
function createBlobService() {
const sharedKeyCredential = new StorageSharedKeyCredential(
STORAGE_ACCOUNT_NAME,
STORAGE_ACCESS_KEY
);
const blobService = new BlobServiceClient(sharedKeyCredential);
return blobService;
}
現在,我們可以使用這個函式來建立一個 Blob 服務使用者端,並使用它來存取我們的儲存體容器。以下是使用 Express.js 框架建立一個簡單的網路伺服器,並使用 Azure 儲存體服務來提供視訊檔案的範例:
const app = express();
app.get("/video", async (req, res) => {
const videoPath = req.query.path;
const containerName = "videos";
const blobService = createBlobService();
const containerClient = blobService.getContainerClient(containerName);
//...
});
在這個範例中,我們使用 createBlobService
函式來建立一個 Blob 服務使用者端,然後使用它來取得我們的儲存體容器使用者端。接下來,我們可以使用這個容器使用者端來存取我們的視訊檔案。
內容解密:
在這個範例中,我們使用 StorageSharedKeyCredential
類別來建立一個共用金鑰憑證,這個憑證會使用儲存體帳戶名稱和存取金鑰來驗證我們的身份。然後,我們使用 BlobServiceClient
類別來建立一個 Blob 服務使用者端,這個使用者端會使用共用金鑰憑證來連線到 Azure 儲存體 API。
圖表翻譯:
flowchart TD A[設定儲存體帳戶名稱和存取金鑰] --> B[建立共用金鑰憑證] B --> C[建立 Blob 服務使用者端] C --> D[取得儲存體容器使用者端] D --> E[存取視訊檔案]
在這個圖表中,我們可以看到設定儲存體帳戶名稱和存取金鑰、建立共用金鑰憑證、建立 Blob 服務使用者端、取得儲存體容器使用者端和存取視訊檔案的流程。
使用 Azure Storage SDK 進行影片串流
在本文中,我們將使用 @azure/storage-blob
這個 Azure Storage SDK 來建立一個微服務,負責從 Azure Storage 中串流影片。首先,我們需要安裝這個 SDK。
安裝 Azure Storage SDK
npm install @azure/storage-blob
建立 Blob 服務客戶端
const { BlobServiceClient } = require('@azure/storage-blob');
const blobServiceClient = new BlobServiceClient(
`https://${process.env.STORAGE_ACCOUNT_NAME}.blob.core.windows.net`,
new StorageSharedKeyCredential(process.env.STORAGE_ACCOUNT_NAME, process.env.STORAGE_ACCESS_KEY)
);
建立容器客戶端
const containerClient = blobServiceClient.getContainerClient('my-container');
建立 Blob 客戶端
const blobClient = containerClient.getBlobClient('my-video.mp4');
下載影片 Blob
const properties = await blobClient.getProperties();
res.writeHead(200, {
'Content-Type': 'video/mp4',
});
const response = await blobClient.download();
response.readableStreamBody.pipe(res);
測試微服務
在測試這個微服務之前,我們需要設定 STORAGE_ACCOUNT_NAME
和 STORAGE_ACCESS_KEY
這兩個環境變數。這些變數用於驗證 Azure Storage 帳戶。
app.get('/video', async (req, res) => {
const videoPath = req.query.videoPath;
const blobClient = containerClient.getBlobClient(videoPath);
const properties = await blobClient.getProperties();
res.writeHead(200, {
'Content-Type': 'video/mp4',
});
const response = await blobClient.download();
response.readableStreamBody.pipe(res);
});
圖表翻譯:
flowchart TD A[HTTP GET /video] --> B[取得影片路徑] B --> C[建立 Blob 客戶端] C --> D[下載影片 Blob] D --> E[設定 HTTP 回應頭] E --> F[串流影片]
在這個流程圖中,我們可以看到 HTTP GET 請求 /video
路由的處理流程。首先,我們取得影片路徑,然後建立 Blob 客戶端,下載影片 Blob,設定 HTTP 回應頭,最後串流影片給客戶端。
微服務的資料管理和測試
在微服務架構中,資料管理和測試是非常重要的兩個方面。隨著應用程式的增大和複雜性增加,整體應用程式的整合測試將變得越來越困難。因此,對於每個微服務進行個別的測試是非常必要的。
微服務架構的興起帶動了容器化技術與雲端服務的蓬勃發展。本文深入探討瞭如何利用 Docker Compose 建立和管理微服務應用,並以 Azure Storage 作為範例,講解了如何在微服務中整合檔案儲存功能。透過逐步的程式碼範例和架構圖解,我們理解了如何利用環境變數、映像檔構建、容器協調等技術來簡化微服務的佈署和管理流程。然而,Docker Compose 主要適用於開發環境,生產環境中則更推薦使用 Kubernetes 等更具擴充套件性和容錯能力的協調工具。技術限制深析顯示,單純的容器化佈署並不能完全解決微服務架構下的資料管理挑戰。選擇合適的儲存方案、資料一致性保障、跨服務資料交換等問題仍需仔細考量。未來3-5年,Serverless 運算與微服務架構的深度融合將是重要的技術演進方向。預見更多輕量級、事件驅動的微服務應用將會出現,進一步降低開發和維護成本。玄貓認為,對於有意匯入微服務架構的團隊,應優先關注核心業務邏輯的拆分與容器化改造,並逐步探索適合自身業務場景的資料管理和服務治理方案。