在微服務架構下,Docker 容器化技術已成為不可或缺的一環。本文將逐步講解如何利用 Docker 將影片串流微服務封裝成映像檔,並釋出到私有容器登入函式庫,為後續佈署到 Kubernetes 等容器協調平臺做好準備。首先,我們會從 Dockerfile 的撰寫開始,依序說明如何選擇基礎映像、設定工作目錄、複製程式碼和依賴項、設定環境變數以及定義容器啟動指令。接著,我們會使用 docker build 命令構建映像檔,並透過 docker run 執行容器,確認服務正常運作。最後,我們將引導讀者如何將構建好的映像檔釋出到 Azure 私有容器登入函式庫,確保映像檔的安全性和可控性,方便團隊協作和後續佈署。

依賴項

Dockerfile 中,我們使用 npm ci --omit=dev 來安裝依賴項。這個命令將會安裝所有指定在 package.json 檔案中的依賴項,但不包括開發依賴項。

影片檔案

在這個範例中,我們將一個示範影片檔案複製到映像中。這個影片檔案將會被用於示範影片串流功能。

Docker映像檔建立與封裝

在建立Docker映像檔的過程中,我們需要建立一個名為Dockerfile的指令碼檔。這個檔案包含了建立我們的Docker映像檔的指令。

Dockerfile指令

以下是Dockerfile中的指令:

  • FROM: 指定基礎映像檔。例如,FROM node:18.17.1指定了Node.js版本18.17.1為基礎映像檔。
  • COPY: 複製檔案到映像檔中。例如,COPY package*.json./複製了package.jsonpackage-lock.json檔案到映像檔中的當前目錄。
  • RUN: 執行命令以安裝依賴項或進行其他設定任務。例如,RUN npm install安裝了生產環境依賴項。
  • CMD: 指定容器啟動時執行的命令。例如,CMD ["npm", "start"]指定了啟動容器時執行npm start命令。

封裝Docker映像檔

要封裝我們的微服務為Docker映像檔,我們需要使用docker build命令。這個命令需要一個包含Dockerfile的目錄作為輸入。

以下是封裝命令的範例:

cd chapter-3/example-1
docker build -t video-streaming --file Dockerfile.

這個命令會建立一個名為video-streaming的Docker映像檔。

.dockerignore檔案

.dockerignore檔案是用來指定Docker在建立映像檔時應該忽略的檔案和目錄。這個檔案是可選的,但可以幫助加速建立映像檔的過程。

以下是.dockerignore檔案的範例:

.git
.github
node_modules

這個檔案指定了Docker應該忽略.git.githubnode_modules目錄。

建立Docker映像檔的流程

以下是建立Docker映像檔的流程:

  1. 建立一個名為Dockerfile的指令碼檔,包含了建立映像檔的指令。
  2. 使用docker build命令建立Docker映像檔。
  3. 指定.dockerignore檔案以忽略不必要的檔案和目錄。

透過這個流程,我們可以建立一個包含我們微服務的Docker映像檔,並將其佈署到生產環境中。

微服務容器化:Dockerfile 解析

導言

在微服務架構中,容器化是將應用程式及其依賴關係封裝成一個容器的過程,使其在不同的環境中保持一致的行為。Docker 是最流行的容器化工具之一。在本文中,我們將探討如何使用 Dockerfile 將我們的影片串流媒體微服務容器化。

Dockerfile 概述

Dockerfile 是一個文字檔案,包含用於構建 Docker 映像的指令。它定義瞭如何將應用程式及其依賴關係封裝成一個容器。以下是影片串流媒體微服務的 Dockerfile 範例:

# 使用官方 Python 基礎映像
FROM python:3.9-slim

# 設定工作目錄
WORKDIR /app

# 複製依賴關係
COPY requirements.txt.

# 安裝依賴關係
RUN pip install -r requirements.txt

# 複製應用程式程式碼
COPY..

# 公開連線埠
EXPOSE 8000

# 執行命令
CMD ["python", "app.py"]

Dockerfile 指令解析

  • FROM python:3.9-slim: 使用官方 Python 3.9 基礎映像作為我們的映像基礎。
  • WORKDIR /app: 設定工作目錄為 /app
  • COPY requirements.txt.: 複製 requirements.txt 檔案到工作目錄。
  • RUN pip install -r requirements.txt: 安裝指定在 requirements.txt 中的依賴關係。
  • COPY..: 複製當前目錄下的所有檔案到工作目錄。
  • EXPOSE 8000: 公開 8000 連線埠,以便外部存取。
  • CMD ["python", "app.py"]: 設定預設執行命令為執行 app.py 指令碼。

建立 Docker 映像

使用以下命令建立 Docker 映像:

docker build -t video-streaming --file Dockerfile.

這個命令告訴 Docker 使用當前目錄下的 Dockerfile 來建立一個名為 video-streaming 的映像。

: 在這個範例中,我們使用 docker build 命令來建立一個 Docker 映像。-t 選項指定了映像的名稱,--file 選項指定了 Dockerfile 的位置。最後的 . 表示 Dockerfile 位於當前目錄。

封裝微服務

現在,我們已經準備好將微服務封裝成 Docker 映像。這個過程涉及到使用 Docker 的 build 命令,來建立一個包含我們微服務的映像。

執行 Docker Build 命令

要開始封裝,我們需要執行以下命令:

docker build -t video-streaming --file Dockerfile.

這裡,-t 引數用於指定映像的名稱,在這裡是 video-streaming--file 引數指定了 Dockerfile 的位置,預設情況下,它會在當前目錄中尋找一個名為 Dockerfile 的檔案。最後,. 表示命令應該在當前目錄中執行。

命令輸出

當命令完成後,你應該會看到類別似以下的輸出:

[+] Building 2.0s (11/11) FINISHED
--snip--
=> => writing image sha256:2c68c7c4e2989f9aaeacb30abaedf...

這表明映像已經成功建成。輸出的內容包括映像的唯一 ID 和你為它設定的標籤。

注意事項

  • 使用 -t 引數可以給映像一個有意義的名稱,這樣比使用預設的長字串 ID 來得方便。
  • --file 引數可以指定 Dockerfile 的位置,雖然預設情況下它會在當前目錄中尋找 Dockerfile
  • 在命令結尾的 . 是必不可少的,它告訴 Docker 在當前目錄中進行操作。

檢視本地映像

封裝完成後,你可以使用以下命令來檢視所有本地映像:

docker image list

如果你的 docker build 命令成功執行,你應該能夠在列表中看到你剛剛建立的映像。

一般格式

Docker build 命令的一般格式是:

docker build -t <映像名稱> --file <Dockerfile路徑> <專案路徑>

你可以根據自己的需求替換 <映像名稱><Dockerfile路徑><專案路徑>

執行Docker容器

在建立了Docker映像後,我們需要測試它是否能夠正常執行。為了實作這一點,我們可以使用docker run命令來啟動一個容器。

啟動容器

以下是啟動容器的命令:

docker run -d -p 3000:3000 -e PORT=3000 video-streaming

這個命令有幾個引數:

  • -d:以分離模式執行容器,意味著容器將在背景中執行,而不是佔用終端。
  • -p 3000:3000:將主機的3000連線埠對映到容器的3000連線埠,這樣我們就可以透過主機的3000連線埠存取容器內的服務。
  • -e PORT=3000:設定容器內的PORT環境變數為3000,這樣容器內的服務就會監聽3000連線埠。
  • video-streaming:指定要啟動的映像名稱。

當我們執行這個命令後,Docker將建立一個新的容器,並啟動它。容器的ID將被列印預到終端上。

容器ID

容器ID是一個唯一的字串,用於標識容器。當我們需要管理容器時,需要使用這個ID。例如,我們可以使用docker ps命令來檢視所有正在執行的容器,並找到我們剛剛建立的容器的ID。

管理容器

現在,我們已經啟動了容器,我們可以使用Docker提供的命令來管理它。例如,我們可以使用docker logs命令來檢視容器的日誌,或者使用docker stop命令來停止容器。

測試服務

現在,容器已經啟動了,我們可以透過主機的3000連線埠存取容器內的服務。例如,我們可以使用瀏覽器存取http://localhost:3000來測試服務是否正常執行。

封裝微服務

在完成微服務的開發後,封裝是將其轉換為可佈署格式的重要步驟。這個過程涉及到建立一個 Docker 映像,該映像包含了我們的微服務應用程式。

執行命令

要啟動我們的微服務容器,我們需要使用 docker run 命令。這個命令不僅可以啟動容器,還可以設定環境變數、指定映像名稱、執行模式等。

以下是 docker run 命令的一個範例:

docker run -d -p 3000:3000 video-streaming

讓我們逐一解釋這個命令的每個部分:

  • -d 引數:這使得容器在分離模式下執行,也就是說,容器會在背景中執行,不會佔用終端。
  • -p 3000:3000 引數:這個引數將容器的 3000 連線埠對映到主機的 3000 連線埠。這樣,當我們存取主機的 3000 連線埠時,實際上是存取容器內的 3000 連線埠。
  • video-streaming:這是映像的名稱,也是我們在構建映像時使用 docker build 命令並指定 -t 引數時給出的名稱。

常見錯誤

在執行 docker run 命令時,可能會遇到一個常見的錯誤:連線埠已經被佔用。如果發生這種情況,你需要關閉佔用該連線埠的其他應用程式,或者選擇一個不同的連線埠。

例如,如果 3000 連線埠已經被佔用,你可以選擇使用 3001 連線埠:

docker run -d -p 3001:3000 video-streaming

這樣,容器的 3000 連線埠就會被對映到主機的 3001 連線埠。

: 上述命令和引數的設定,都是為了確保容器可以正確地執行並對外提供服務。透過 -d 引數,我們讓容器在背景中執行;透過 -p 引數,我們組態連線埠對映,讓外部可以存取容器內的服務;最後,指定映像名稱 video-streaming,告訴 Docker 要啟動哪個映像。

  flowchart TD
    A[啟動容器] --> B[設定環境變數]
    B --> C[指定映像名稱]
    C --> D[執行模式選擇]
    D --> E[連線埠對映設定]
    E --> F[啟動容器並對映連線埠]

這個流程圖展示了從啟動容器到設定連線埠對映的整個過程,每一步驟都對應著 docker run 命令中的不同引數和設定。

Docker 容器管理與除錯

在上一章中,我們成功建立了一個 Docker 容器並確認它的運作狀態。在本章中,我們將深入探討如何管理和除錯 Docker 容器。

檢視容器狀態

要檢視目前正在執行的容器,可以使用以下命令:

docker container list

這將顯示所有正在執行的容器,包括其 ID、映像名稱、狀態和連線埠對映等訊息。

檢視容器日誌

要檢視容器的日誌,可以使用以下命令:

docker logs <container-id>

<container-id> 替換為您要檢視的容器 ID。這將顯示容器的日誌訊息,幫助您瞭解容器內的應用程式是否執行正常。

進入容器

如果您需要進入容器內部進行除錯或檢查,可以使用以下命令:

docker exec -it <container-id> bash

這將開啟一個新的終端會話,讓您可以在容器內部執行 Linux 命令。注意,需要使用您自己的容器 ID。

連線埠對映

在建立容器時,我們使用了 -p 引數來對映主機連線埠到容器連線埠。例如:

docker run -d -p 3000:3000 <image-name>

這將主機的 3000 連線埠對映到容器的 3000 連線埠,讓您可以透過主機的 3000 連線埠存取容器內的應用程式。

下一步

在下一章中,我們將探討如何發布您的 Docker 映像,並將其佈署到雲端平臺或其他環境中。

  graph LR
    A[Docker 容器] -->|建立|> B[Docker 映像]
    B -->|發布|> C[雲端平臺]
    C -->|佈署|> D[應用程式]

這個圖表展示了 Docker 容器、映像和雲端平臺之間的關係,以及如何將您的應用程式佈署到雲端平臺中。

探索其他容器

您知道可以使用 docker run 命令輕鬆執行任何公共映像嗎?我們稍後將在書中使用的兩個映像是 mongodbrabbitmq。嘗試執行以下命令,以在本地主機上獲得即時可用的資料函式庫:

docker run -p 27017:27107 mongo:latest

有許多公共映像可供線上使用,您無需帳戶即可存取。

發布微服務

我們已經將微服務封裝在 Docker 映像中,但該映像目前位於我們的本地開發電腦上。這對於我們自己的測試和實驗是很好的,但我們仍需要將映像發布到某個地方,以便稍後佈署到 Kubernetes 叢集。圖 3.9 說明瞭我們現在如何將映像發布到 Azure 上的私有容器登錄檔中。

建立私有容器登錄檔

建立私有容器註冊表相當簡單。我們將在 Azure 上建立登錄檔,但所有主要的雲端供應商都支援此功能,因此您可以輕鬆地在 Amazon Web Services (AWS) 上使用 Elastic Container Registry (ECR)、Google Cloud Platform (GCP) 或其他雲端平臺建立容器登錄檔。為什麼要發布到私有登錄檔?在本章中,我們關注的是如何為私人公司構建專有應用程式,因此發布映像到私有登錄檔而不是使用公共登錄檔(如 Docker Hub)是有意義的。

步驟

  1. 建立私有容器登錄檔。
  2. 在發布之前,使用 docker login 命令進行身份驗證。
  3. 使用 docker push 命令將映像上傳到登錄檔。
  4. 再次使用 docker run 命令從發布的映像啟動微服務。

建立私有容器登錄檔

建立私有容器註冊表相當簡單。我們將在 Azure 上建立登錄檔,但所有主要的雲端供應商都支援此功能,因此您可以輕鬆地在 Amazon Web Services (AWS) 上使用 Elastic Container Registry (ECR)、Google Cloud Platform (GCP) 或其他雲端平臺建立容器登錄檔。為什麼要發布到私有登錄檔?在本章中,我們關注的是如何為私人公司構建專有應用程式,因此發布映像到私有登錄檔而不是使用公共登錄檔(如 Docker Hub)是有意義的。

步驟詳解

  1. 建立私有容器登錄檔:建立私有容器登錄檔是一個簡單的過程。我們將在 Azure 上建立登錄檔,但所有主要的雲端供應商都支援此功能,因此您可以輕鬆地在 Amazon Web Services (AWS) 上使用 Elastic Container Registry (ECR)、Google Cloud Platform (GCP) 或其他雲端平臺建立容器登錄檔。
  2. 進行身份驗證:在發布之前,使用 docker login 命令進行身份驗證。
  3. 上傳映像:使用 docker push 命令將映像上傳到登錄檔。
  4. 啟動微服務:再次使用 docker run 命令從發布的映像啟動微服務。

Mermaid 圖表

  graph LR
    A[建立私有容器登錄檔] --> B[進行身份驗證]
    B --> C[上傳映像]
    C --> D[啟動微服務]

圖表翻譯

此圖表示了發布微服務的步驟。首先,建立私有容器登錄檔。然後,進行身份驗證。接下來,上傳映像到登錄檔。最後,啟動微服務從發布的映像。

私有容器登入服務

在雲端執行的私有容器登入服務

我們可以將應用程式佈署到任何具有存取此登入服務憑證的電腦。

私有容器登入服務

Docker映像

Docker映像 圖3.9 將Docker映像釋出到雲端的私有容器登入服務

釋出微服務

如圖3.10所示,選擇「容器登入服務」並點選「建立」>「容器登入服務」。 您現在應該看到一個頁面,提供更多關於Microsoft容器登入服務的資訊。 如果您感興趣,可以閱讀更多資訊,然後點選「建立」按鈕。 接下來,我們需要填寫一些關於要建立的登入服務的詳細資訊。如圖3.11所示,我們首先需要提供一個名稱。這個名稱很重要,因為它會建立一個URL,我們稍後會用它來與登入服務進行通訊。由於登入服務的名稱會生成URL,因此必須是全域唯一的。也就是說,您不能選擇一個已經被別人佔用的名稱,您必須選擇自己的唯一名稱。您應該記下URL,因為您稍後會在呼叫Docker命令時需要它。 在點選「審查+建立」按鈕之前,我們需要選擇或建立一個資源群組。如其名稱所示,Azure中的資源群組允許雲端資源被收集到群組中,以便於管理。 搜尋「容器登入服務」。

找到玄貓的容器登入服務。

點選建立 > 容器登入服務。 圖3.10 在Azure入口網站中建立新的私有容器登入服務

建立資源群組

圖3.12顯示我正在建立一個新的資源群組來包含新的登入服務,我將其命名為bmdk1。要建立新的資源群組,請點選「建立新群組」,輸入名稱,然後點選「確定」。

設定私有登入服務的名稱。

確保您使用一個全域唯一的名稱。

圖3.12 建立新的資源群組

Docker映像釋出

私有容器登入服務允許我們將Docker映像釋出到雲端,從而可以佈署到任何具有存取此登入服務憑證的電腦。

  flowchart TD
    A[建立私有容器登入服務] --> B[填寫登入服務詳細資訊]
    B --> C[選擇或建立資源群組]
    C --> D[建立新的資源群組]
    D --> E[設定私有登入服務的名稱]
    E --> F[記下URL]
    F --> G[釋出Docker映像]

此圖表顯示了建立私有容器登入服務並釋出Docker映像的流程。首先,我們需要建立私有容器登入服務,然後填寫登入服務的詳細資訊。接下來,我們需要選擇或建立資源群組,並設定私有登入服務的名稱。然後,我們需要記下URL,以便於稍後使用。最後,我們可以釋出Docker映像到私有容器登入服務。

上述流程中,每一步都很重要。首先,建立私有容器登入服務是將Docker映像釋出到雲端的第一步。然後,填寫登入服務的詳細資訊是為了提供足夠的資訊以便於管理和存取登入服務。選擇或建立資源群組是為了將雲端資源收集到群組中,以便於管理。設定私有登入服務的名稱是為了建立一個URL,以便於與登入服務進行通訊。記下URL是為了在稍後使用時能夠存取登入服務。最後,釋出Docker映像是將映像上傳到私有容器登入服務,以便於佈署到任何具有存取此登入服務憑證的電腦。

建立私有容器登入函式庫

在 Azure 中,建立私有容器登入函式庫是佈署微服務的重要步驟。這個過程涉及到建立一個新的資源群組和組態登入函式庫的細節。

步驟 1:建立資源群組

首先,需要建立一個新的資源群組來容納私有容器登入函式庫。這個資源群組可以使用任何有意義的名稱,不需要與登入函式庫的名稱相同。點選「Create New」按鈕來建立新的資源群組。

步驟 2:組態登入函式庫細節

接下來,需要填寫登入函式庫的細節,包括名稱、SKU 等。使用「Basic」SKU 可以降低執行成本,特別是在 Azure 免費試用期結束後。填寫完成後,點選「Review + Create」按鈕進行下一步。

容器化技術已成為微服務架構佈署的基本。本文深入探討了使用 Docker 建立、封裝、釋出和管理微服務容器的完整流程,涵蓋 Dockerfile 指令解析、映像構建、容器執行、日誌檢視、連線埠對映等關鍵環節。分析顯示,Docker 的便捷性和可移植性極大簡化了微服務的佈署流程,但也需要注意映像大小控制、安全性強化以及與其他服務的整合等挑戰。對於資源有限的團隊,善用.dockerignore檔案、選擇合適的基礎映像以及精簡依賴項,能有效最佳化構建流程和降低執行成本。展望未來,隨著多雲平臺和混合雲架構的普及,容器協調技術如 Kubernetes 將扮演更重要的角色,而掌握 Docker 基礎將是駕馭這些技術的必要條件。玄貓認為,對於追求敏捷開發和高效佈署的企業,積極擁抱容器化技術並建立私有容器登入服務,將是提升競爭力的關鍵策略。