隨著微服務架構的普及,容器化技術已成為不可或缺的佈署方案。本文將深入探討如何利用 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)不同,私有容器註冊允許開發團隊在自己的伺服器上儲存和管理映象,這樣可以更好地控制存取許可權和安全性。

使用私有容器註冊的優點包括:

  1. 安全性:透過將映象儲存在私有伺服器上,可以更好地控制誰可以存取和下載映象,從而減少了安全風險。
  2. 可靠性:私有容器註冊可以確保映象的可靠性和一致性,因為開發團隊可以完全控制映象的版本和更新。
  3. 效率:私有容器註冊可以提高開發效率,因為開發人員可以快速地儲存和分享映象,而不需要依賴公共註冊。

開發環境

開發環境是指軟體開發過程中使用的所有工具、軟體和硬體的集合。一個良好的開發環境應該能夠提供高效、安全和可靠的開發體驗。

在使用Docker容器化技術時,開發環境通常包括以下幾個部分:

  1. Docker引擎:用於建立和管理Docker容器的軟體。
  2. 私有容器註冊:用於儲存和管理Docker映象的私有倉函式庫。
  3. 開發工具:如IDE、編譯器和除錯器等,用於編寫、測試和除錯軟體的工具。
  4. 版本控制系統:如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 映像,並將在未來章節中繼續使用。

建立和發布微服務

  1. 建立一個 Dockerfile,指定微服務的程式碼和資產。
  2. 使用 docker build 命令從 Dockerfile 建立映像。
  3. 使用 docker run 命令從映像啟動容器。
  4. 使用 docker tag 命令為映像增加標籤,以便將其發布到容器註冊中心。
  5. 使用 docker push 命令將映像發布到容器註冊中心。
內容解密:

上述過程涉及多個 Docker 命令,包括 docker builddocker rundocker pushdocker tag。每個命令都有其特定的功能,例如建立映像、啟動容器、發布映像和增加標籤。瞭解這些命令的作用和使用方法是使用 Docker 的關鍵。

圖表翻譯:

  graph LR
    A[Dockerfile] -->|建立映像|> B[映像]
    B -->|啟動容器|> C[容器]
    C -->|增加標籤|> D[標籤]
    D -->|發布映像|> E[容器註冊中心]

上述圖表展示了使用 Docker 建立和發布微服務的過程,包括建立 Dockerfile、建立映像、啟動容器、增加標籤和發布映像。每個步驟都對應著一個特定的 Docker 命令,例如 docker builddocker rundocker tagdocker 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 StorageAzure Storage是一種雲端儲存檔案的服務。我們可以透過Azure門戶、API或命令列管理資產。我們透過Azure門戶上傳影片,然後使用Node.js Azure Storage SDK讀取它。
@azure/storage-blob12.15.0我們使用此npm包從Azure Storage使用JavaScript檢索檔案。
MongoDB7.0.0MongoDB是一種流行的NoSQL型別資料函式庫。它輕量級、易於設定和使用,並且對於微服務很方便。
mongodb6.0.0MongoDB的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 等容器協調工具將是下一步的關鍵。玄貓認為,此容器化策略適用於快速迭代開發和中小型應用佈署,但需持續關注容器安全性和資源管理,才能確保系統的長期穩定執行。隨著服務網格等技術的發展,我們預見微服務的佈署和管理將更加便捷和人工智慧化。