現代應用程式佈署的革新:容器化技術
在容器技術出現之前,應用程式在開發環境執行良好,但在生產環境卻常常出現問題。主要原因是開發環境和生產環境的差異,例如函式庫和依賴項的版本不同。Docker 的出現解決了這個問題,它提供了一種簡便的方法,將應用程式及其依賴項封裝在一起,確保佈署到生產環境的內容與開發和測試的內容完全一致。
這種標準化的封裝方式稱為映像檔,標準的執行環境稱為容器。映像檔包含了應用程式執行所需的一切。簡而言之,Docker 解決了應用程式在生產環境中無法正常執行的問題,並使應用程式的封裝和執行變得異常簡單!
容器化核心概念解析
容器是封裝和執行現代應用程式最流行的方式。它們比虛擬機器更小、更快、更具可攜性,並且可以與使用現有語言編寫的現有應用程式一起使用,無需學習任何新的語言或框架!
將應用程式作為容器執行主要有兩個步驟:
- 將應用程式封裝為映像檔。
- 將映像檔作為容器執行。
將應用程式封裝為映像檔的過程稱為容器化。它將應用程式原始碼(包括所有依賴項)構建到映像檔中。此映像檔通常很小,但包含執行應用程式所需的一切。構建映像檔後,您可以使用 Docker 等工具將其作為容器執行。
在底層,容器是一個隔離的執行環境。這是一個專業術語,指的是作業系統 (OS) 中專用於單個應用程式的環繞區域。下圖顯示了一個執行四個容器的單個作業系統。每個容器都是作業系統的一個隔離部分,每個容器都執行一個單獨的應用程式,並且它們彼此之間都不知道對方的存在。
graph LR subgraph 作業系統 C1[容器 1] --> App1[應用程式 1] C2[容器 2] --> App2[應用程式 2] C3[容器 3] --> App3[應用程式 3] C4[容器 4] --> App4[應用程式 4] end
內容解密: 上圖展示了作業系統與容器的關係,每個容器在作業系統中都是獨立執行的,彼此隔離互不影響。
將映像檔視為已停止的容器,將容器視為正在執行的映像檔可能會有幫助。下圖顯示了容器化應用程式的主要步驟。步驟如下:
- 開發您的應用程式。
- 將應用程式和依賴項構建到映像檔中。
- 將映像檔傳送到登入檔(可選)。
- 將映像檔作為容器執行。
graph LR A[開發應用程式] --> B(構建映像檔); B --> C{傳送到登入檔?}; C -- Yes --> D[推播到登入檔]; C -- No --> E[執行容器]; D --> E;
內容解密: 上圖展示了容器化應用程式的流程,從開發到構建映像檔,再到可選的推播到登入檔,最後執行容器。
映像檔:應用程式的藍圖
映像檔是一個唯讀範本,其中包含執行應用程式所需的一切:程式碼、執行時、系統工具、系統函式庫和設定。您可以將映像檔視為已停止的容器。
容器:映像檔的執行個體
容器是映像檔的可執行個體。您可以使用 Docker CLI 或 Docker Desktop 建立、啟動、停止、移動或刪除容器。
登入檔:映像檔的儲存函式庫
登入檔是一個儲存和分發映像檔的中央位置。您可以將映像檔推播到登入檔,以便其他人可以提取和執行它們。公開的登入檔包括 Docker Hub、Amazon ECR 和 Google Container Registry。您也可以執行自己的私有登入檔。
開放容器倡議 (OCI):容器標準化
開放容器倡議 (OCI) 是一個輕量級的、開放的治理結構(專案),旨在圍繞容器格式和執行時建立業界標準。OCI 的目標是確保容器映像檔和容器執行時的互操作性。
容器與虛擬機器:比較與差異
容器和虛擬機器都是隔離應用程式的執行環境,但它們在底層技術上有所不同。虛擬機器在硬體層虛擬化,而容器在作業系統層虛擬化。這使得容器比虛擬機器更輕量級、更快速。
微服務:容器的最佳拍檔
微服務是一種架構風格,它將應用程式構建為一系列小型、獨立的服務。每個服務都執行在自己的程式中,並透過輕量級機制(通常是 HTTP API)進行通訊。容器是執行微服務的理想平台,因為它們輕量級、可攜性強與易於佈署。
Linux 容器和 Windows 容器:跨平台支援
Docker 支援 Linux 和 Windows 容器。這意味著您可以在 Linux 或 Windows 上構建和執行容器。
容器與人工智慧:強強聯手
容器技術在人工智慧領域也發揮著越來越重要的作用。容器可以簡化 AI 模型的佈署和管理,並提高 AI 應用程式的可攜性和可擴充套件性。
術語回顧
- 映像檔:應用程式的藍圖,包含執行應用程式所需的一切。
- 容器:映像檔的可執行個體。
- 登入檔:儲存和分發映像檔的中央位置。
- OCI:開放容器倡議,旨在建立容器標準。
- 微服務:一種架構風格,將應用程式構建為一系列小型、獨立的服務。
本文總結
本文介紹了容器技術的核心概念,包括映像檔、容器、登入檔、OCI、容器與虛擬機器的比較、微服務、Linux 和 Windows 容器,以及容器與人工智慧的關係。這些概念對於理解和使用容器技術至關重要。在後續的文章中,我們將探討 Docker 的安裝和使用,以及如何使用 Docker 構建、佈署和管理應用程式。
深入解析容器技術:映像檔、容器與儲存函式庫
在初步瞭解容器技術的全貌後,讓我們探討其核心組成:映像檔、容器和儲存函式庫。
映像檔:容器的藍圖
映像檔是應用程式及其所有依賴項的集合,如同應用程式的藍圖。它由多個層級組成,每個層級都包含特定的功能或依賴項。
graph LR A[基礎作業系統與檔案系統] --> B(應用程式) B --> C{依賴項} C --> D[映像檔]
上圖展示了一個三層映像檔的結構:底層是最小化的作業系統和檔案系統,中間層是應用程式本身,頂層則是應用程式所需的依賴項。這些層級堆積疊在一起,形成一個包含執行應用程式所需一切的映像檔。
構建映像檔最常用的方法是使用 Dockerfile 和 docker build
指令。Dockerfile 是一系列指令,指示 docker build
如何構建映像檔。以下是一個簡單的 Dockerfile 示例:
FROM golang:1.20-alpine
COPY go.mod go.sum .
RUN go mod download
ENTRYPOINT [ "/bin/server" ]
內容解密:
這個 Dockerfile 建立了前面圖表中所示的三個層級。FROM
指令指定基礎作業系統;COPY
指令複製應用程式碼和依賴項清單;RUN
指令安裝依賴項;ENTRYPOINT
指令設定啟動應用程式的指令。
使用以下指令可以構建名為 my-image
的映像檔:
docker build -t my-image . -f Dockerfile
構建過程會依序執行 Dockerfile 中的每個指令:下載基礎作業系統、複製應用程式和依賴項、安裝依賴項,最後設定啟動指令。
容器映像檔、Docker 映像檔和 OCI 映像檔這些術語都指的是同一事物,通常簡稱為映像檔。
容器:映像檔的例項
從單個映像檔可以啟動一個或多個容器,每個容器都是映像檔的獨立執行個體。
graph LR A[映像檔] --> B(容器 1) A --> C(容器 2) A --> D(容器 3)
上圖顯示從單個映像檔啟動三個相同的容器。開發者可以將映像檔和容器類別比為類別和物件,而系統管理員則可以將它們類別比為虛擬機器範本和正在執行的虛擬機器。
以下指令從 my-image
映像檔啟動一個名為 web
的容器:
docker run --name web my-image
儲存函式庫:映像檔的集中存放地
容器儲存函式庫是用於儲存和提取映像檔的集中式場所,例如 Docker Hub 和 GitHub Container Registry。儲存映像檔的動作稱為推播(push),而提取映像檔的動作稱為提取(pull)。
graph LR A[本地機器] -->|推播| B(儲存函式庫) B -->|提取| C[另一台本地機器]
上圖展示了推播和提取映像檔的過程。大多數儲存函式庫還提供存取控制、漏洞掃描和與自動化構建流程整合等額外功能。
開放容器標準 (OCI)
開放容器標準 (OCI) 是一個管理機構,負責制定和維護容器生態系統的核心標準,包括映像檔規格、執行時規格和分發規格。這些標準確保了容器技術的互通性和可移植性。
容器與虛擬機器
容器和虛擬機器都是常用的應用程式封裝方式,也是虛擬化的一種形式。容器體積更小、速度更快、可移植性更強,虛擬化的是作業系統,而虛擬機器虛擬化的是硬體。
graph LR A[分享主機] --> B(硬體) A --> C(作業系統) C --> D{容器 1} C --> E{容器 2} B --> F[虛擬機器 1] B --> G[虛擬機器 2]
上圖比較了容器和虛擬機器的虛擬化方式。容器分享主機的作業系統,而虛擬機器則需要各自的作業系統,因此在相同的硬體上可以執行更多的容器。
微服務與容器
在容器技術出現之前,應用程式大多採用單體式架構,所有功能都整合在一個應用程式中。這種架構在開發、佈署和維護方面都存在挑戰。而容器技術的出現,使得微服務架構成為可能,每個功能都可以作為獨立的服務開發、佈署和管理,提高了應用程式的靈活性和可擴充套件性。
容器化應用程式:深入淺出 Docker 與現代應用設計
在現代軟體開發中,容器化技術已成為不可或缺的一環。容器化應用程式,相較於傳統虛擬機器,更小巧、更快速、也更容易移植。這篇文章將探討容器化技術的核心概念,並以 Docker 為例,帶您瞭解如何建構、測試和佈署現代應用程式,特別是在微服務架構和人工智慧應用方面的應用。
容器化基礎:映像檔、容器和 Registry
容器化過程涉及將應用程式及其所有依賴項封裝成一個容器映像檔(Image)。這些映像檔通常儲存在 Registry 中,以便於存取和管理。執行容器只需從 Registry 中提取映像檔,並根據映像檔啟動容器即可。一個映像檔可以建立多個容器,每個容器都是作業系統中一個獨立的執行環境,專為執行單個應用程式而設計。
圖一:容器化核心概念
graph LR A[應用程式及其依賴項] --> B(容器映像檔) B --> C{Registry} C --> D[容器 1] C --> E[容器 2] C --> F[容器 n]
微服務架構:容器化應用新趨勢
微服務是一種現代設計模式,其中每個應用程式功能都被開發、佈署和管理為一個獨立的小型應用程式(微服務)。每個微服務都佈署為一個容器,可以獨立更新和擴充套件,從而實作更靈活的應用程式管理。
圖二:微服務架構示意圖
graph LR subgraph 應用程式 A[微服務 1] --> B[微服務 2] B --> C[微服務 3] C --> D[微服務 n] end
Linux 容器與 Windows 容器
Docker 支援 Linux 和 Windows 容器。Linux 容器在 Linux 主機上執行 Linux 應用程式,而 Windows 容器在 Windows 主機上執行 Windows 應用程式。值得注意的是,安裝了 WSL 2(Windows Subsystem for Linux)的 Windows 主機也可以執行 Linux 容器。儘管如此,絕大多數容器都是 Linux 容器。
容器與人工智慧:未來發展趨勢
越來越多的組織和開發者選擇 Docker 和容器作為建構、測試和佈署本地 AI 模型的首選方式。這意味著容器在未來 AI 應用中將扮演越來越重要的角色。
常用術語回顧
- **OCI(Open Container Initiative):**一個輕量級的治理機構,負責制定和維護低階容器技術的標準,例如映像檔、執行時和 Registry。
- **映像檔(Image):**包含單個應用程式、所有必需的依賴項以及將應用程式作為容器啟動所需的元資料。
- **容器(Container):**作業系統中一個獨立的執行環境,用於執行單個應用程式。
- **Registry:**用於儲存和檢索映像檔的集中式位置。
- **主機(Host):**每個容器都在主機上執行。主機可以是實體伺服器或虛擬機器,可以是 Linux 或 Windows,並且執行容器執行時,例如 Docker。
- **核心(Kernel):**作業系統的核心功能。
- **微服務(Microservices):**一種現代應用程式設計模式,其中每個功能都作為一個獨立的小型應用程式(微服務)開發、佈署和管理。
- **Linux 容器:**執行 Linux 應用程式的容器,必須在具有 Linux 核心的主機上執行。
- **Windows 容器:**執行 Windows 應用程式的容器,必須在 Windows 主機上執行。
- **WSL 2:**Windows Subsystem for Linux,允許 Windows 電腦執行 Linux 容器。
- **Ollama:**一個在本地機器上執行大語言模型(LLM)的開源平台。
- **模型(Model):**AI 程式的術語。
本文總結
本文探討了容器化技術的核心概念,包括映像檔、容器和 Registry。同時,也介紹了微服務架構以及容器在人工智慧應用中的重要性。最後,我們回顧了常用的容器化術語,幫助您更好地理解這個領域。
在開始之前,確保你已安裝 Docker Desktop 或 Multipass。以下步驟將引導你完成整個流程。
## 確認現有容器和映像
首先,確認系統中沒有預先存在的容器或映像。在 Multipass 上,你可能會有預先存在的 Portainer 容器和映像,這沒有問題。
執行 `docker ps` 命令列出任何正在執行的容器:
```bash
$ docker ps
CONTAINER ID IMAGE COMMAND STATUS PORTS NAMES
輸出顯示沒有容器。
現在執行 docker images
檢視本地映像列表:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
輸出顯示沒有映像。確認你的系統是乾淨的,現在可以開始執行第一個容器了。
執行容器
執行以下命令建立一個名為 test
的新容器:
$ docker run -d --name test -p 5555:8080 nigelpoulton/gsd-book
恭喜,你剛剛建立了你的第一個容器!在測試它之前,讓我們看看發生了什麼。
docker run
是啟動新容器的命令。-d
標誌在後台(分離模式)啟動容器,這樣它不會鎖定你的終端。-p 5555:8080
選項將 Docker 主機上的連線埠 5555 對映到容器內的連線埠 8080。這個容器在連線埠 8080 上執行一個 Web 伺服器。將其對映到主機上的連線埠 5555 意味著我們可以在連線埠 5555 上開啟瀏覽器並連線到容器中的應用程式。
graph LR A[Docker Host (Port 5555)] --> B(Container (Port 8080)) C[Browser] --> A
- 最後一個引數
nigelpoulton/gsd-book
是容器所根據的映像名稱。
按下 Enter 鍵後會發生很多事情。以下是輸出示例:
Unable to find image 'nigelpoulton/gsd-book:latest' locally
latest: Pulling from nigelpoulton/gsd-book
... (下載映像層的訊息)
Status: Downloaded newer image for nigelpoulton/gsd-book:latest
... (容器ID)
第一行顯示 Docker 尋找本地映像副本但未找到。因此,它在 Docker Hub 上搜尋名為 nigelpoulton/gsd-book
的映像,找到後並下載它。「下載映像」的術語是 pulling。接下來的幾行顯示 Docker 正在下載所有映像層。最後幾行顯示映像摘要、成功訊息和剛啟動的容器的 ID。
測試應用程式
現在我們知道發生了什麼,讓我們連線到應用程式並測試它是否正常工作。
如果你使用的是 Docker Desktop,請在瀏覽器中開啟 http://localhost:5555/
。
如果你使用的是 Multipass,請在瀏覽器中開啟 Multipass 虛擬機器的 192.168.x.x IP 地址上的連線埠 5555。你可以在虛擬機器中輸入 ip a | grep 192
或執行 multipass list
命令找到此 IP 地址。
內容解密:
這段程式碼示範瞭如何使用 docker run
命令啟動一個容器。-d
引數讓容器在後台執行,--name
引數為容器命名,-p
引數則進行連線埠對映,將主機的 5555 連線埠對映到容器的 8080 連線埠。nigelpoulton/gsd-book
指定了要使用的映像。如果本地沒有該映像,Docker 會自動從 Docker Hub 下載。這個例子展示了 Docker 的核心功能:映像提取、容器啟動和連線埠對映。在實際應用中,可以根據需求調整連線埠對映和容器名稱。
Multipass 的使用
如果你已經安裝了 Docker Desktop,則不需要 Multipass。Multipass 是一個適用於 Linux、Mac 和 Windows 的免費工具,可以輕鬆建立執行 Docker 的虛擬機器。它不像 Docker Desktop 那樣易於使用,也沒有所有相同的功能。例如,你沒有漂亮的圖形介面或漏洞掃描功能。
安裝和測試 Multipass
前往 https://multipass.run/install 並安裝適合你係統的版本。安裝完成後,開啟命令列並執行以下命令來建立一個名為 gsd-vm
的新虛擬機器(“gsd” 是 getting started with docker 的縮寫)。該命令使用 docker
範本建立一個已安裝 Docker 的虛擬機器。
$ multipass launch docker --name gsd-vm
下載範本並啟動虛擬機器需要一兩分鐘的時間。列出虛擬機器以確保它已正確啟動:
$ multipass ls
記下虛擬機器的 192.168.x.x IP 地址,因為稍後在文章中的示例中將需要用到它。執行 multipass shell gsd-vm
命令連線到虛擬機器,然後執行一些 docker 命令來驗證安裝。你可以隨時輸入 exit
離開虛擬機器並傳回到你的本地機器。同樣,你可以輸入 multipass shell gsd-vm
傳回虛擬機器。
Docker Hub 和 Docker 帳戶
本文後面的示例會將映像推播到 Docker Hub。也存在其他的 registry,你可以使用它們。但是,如果你還沒有其他 registry 的帳戶,我建議你從 Docker Hub 開始,因為它使用簡單與長期以來一直很穩定。前往 hub.docker.com 並點選「註冊」按鈕。這將帶你到註冊頁面,你可以在其中註冊一個免費帳戶。擁有帳戶後,你可以使用 Docker Desktop 登入。這也會讓你無縫登入 Docker Hub。如果你沒有使用 Docker Desktop,請從安裝了 Docker 的主機或虛擬機器執行 docker login
命令。
安裝 Git CLI
範例應用程式的原始碼和設定檔託管在 GitHub 上。取得它們的最簡單方法是使用 git
命令列工具複製它們。別擔心如果你不知道如何使用 Git,沒關係 ;-) 在網路上搜尋「安裝 git cli」並按照你的系統的說明進行操作。安裝完成後,執行以下命令。它將建立一個包含所有你需要用到的檔案的 gsd-book
目錄。
$ git clone https://github.com/nigelpoulton/gsd-book.git
本文介紹了兩種取得 Docker 開發環境的簡單方法:Docker Desktop 和 Multipass。Docker Desktop 是在筆記型電腦或個人電腦上使用 Docker 的最簡單方法,它提供了一個簡潔的使用者介面和一系列強大的功能。對於個人專案和個人學習,它是免費使用的。Multipass 是另一種取得本地 Docker 環境的方法。它啟動一個安裝了 Docker 引擎的輕量級虛擬機器。它沒有 Docker Desktop 的所有功能,但足以遵循本文中的示例。你也瞭解到 Docker 個人帳戶是免費的,它們可以讓你存取 Docker Hub。還有許多其他工具可以讓你構建和管理容器。
啟動你的第一個容器:Docker Desktop 圖形化介面操作
在上一篇文章中,我們使用 docker run
命令啟動了第一個容器。本文將更進一步,透過 Docker Desktop 的圖形化使用者介面 (GUI) 來管理容器,包含啟動、停止、重新啟動和刪除等操作。
Docker Desktop 讓容器管理更加直覺化,即使不熟悉命令列操作也能輕鬆上手。以下步驟將引導你使用 Docker Desktop 管理容器:
前置作業
- 開啟 Docker Desktop:在選單列或系統託盤中點選 Docker 圖示,選擇 “Go to Dashboard”。
- 確認映象:在 “Images” 檢視中,你應該能看到先前提取的
nigelpoulton/gsd-book:latest
映象。
啟動容器
- 點選執行:點選映象右側 “Actions” 欄位中的播放/執行三角形按鈕。
- 設定容器:在彈出的 “Run a new container” 視窗中,展開 “Optional settings”,並參考下圖填寫表單。
graph LR A[Container Name] --> B{test} A --> C{Ports} C --> D{5555:8080}
- Container Name: 設定容器名稱為
test
。 - Ports: 設定埠對映,將容器的 8080 埠對映到本機的 5555 埠。
- Container Name: 設定容器名稱為
- 執行容器:點選藍色的 “Run” 按鈕。
- 確認執行狀態:切換到 “Containers” 標籤頁,即可看到正在執行的容器。
檢視容器資訊
在 “Containers” 檢視中,你可以看到類別似 docker ps
命令輸出的容器摘要資訊,包含容器 ID、映象名稱、埠對映等。點選容器名稱,可以檢視更詳細的資訊,例如日誌、設定、檔案系統等,並可執行除錯工作階段的命令。
停止、重新啟動和刪除容器
在 “Containers” 檢視中,“Actions” 欄位提供了停止和刪除容器的按鈕。
- 停止容器: 點選停止方塊按鈕。
- 重新啟動容器: 點選重新啟動按鈕。
- 刪除容器: 點選垃圾桶圖示,並在警告視窗中選擇 “Delete forever”。
刪除映象
切換到 “Images” 檢視,點選映象右側 “Actions” 欄位中的垃圾桶圖示,並在提示視窗中選擇 “Delete forever” 即可刪除映象。
Docker Desktop 的其他功能
除了上述基本操作外,Docker Desktop 還提供了許多其他功能,例如檢視映象層級、漏洞報告和修復建議等。我們將在後續文章中探討這些功能。
開發你的第一個 Node.js 容器
本文將引導你將一個 Node.js 應用程式容器化,並在容器中執行。即使你不是 Node.js 開發者,也能輕鬆跟隨步驟完成操作。
前置作業
- 更新 Docker 環境:確保你的 Docker 環境為最新版本。
- 下載程式碼:從書籍的 GitHub 儲存函式庫複製程式碼。
git clone https://github.com/nigelpoulton/gsd-book.git cd gsd-book/node-app
- 安裝 Node.js (可選):如果你想在本機測試應用程式,需要安裝 Node.js。
應用程式概覽
這個範例應用程式非常簡單,只包含四個檔案:
app.js
:應用程式的主要邏輯。package.json
:應用程式的描述檔,包含依賴項等資訊。package-lock.json
:鎖定依賴項版本,確保應用程式在不同環境中一致性。views
資料夾:包含應用程式的檢視檔案。
測試應用程式 (可選)
如果你安裝了 Node.js,可以在本機測試應用程式:
- 安裝依賴項:
npm install
- 啟動應用程式:
node app.js
- 瀏覽器存取:在瀏覽器中存取
http://localhost:8080
,應該能看到應用程式正在執行。
在下一篇文章中,我們將會開始容器化這個 Node.js 應用程式。
內容解密:
以上步驟示範瞭如何使用 Docker Desktop 的 GUI 管理容器,以及準備 Node.js 應用程式進行容器化的過程。 透過圖形化介面,簡化了容器操作的複雜度,讓使用者更直覺地管理容器生命週期。 此外,我們也說明瞭 Node.js 應用程式的基本結構,為後續的容器化步驟奠定基礎。
開發輕量級 Node.js 容器映像:最佳實踐
在現代軟體開發中,容器化已成為不可或缺的一環。如何有效地將 Node.js 應用程式容器化,同時兼顧效能和安全性,是每個開發者都必須掌握的技能。本文將深入淺出地引導您使用 docker init
命令和最佳實踐,構建一個輕量級與高效的 Node.js 容器映像。
應用程式範例解析
首先,我們來看看一個簡單的 Node.js 應用程式範例,它包含以下幾個關鍵檔案:
- app.js: 應用程式核心程式碼,使用 Express 框架和 Pug 範本引擎。
- views/home.pug: Pug 範本檔案,用於渲染應用程式首頁。
- package.json: 定義專案依賴項,包含 Express 和 Pug。
- package-lock.json: 鎖定依賴項版本,確保構建一致性。
graph LR A[app.js] --> B(Express) A --> C(Pug) C --> D{views/home.pug} E[package.json] --> B E --> C F[package-lock.json] --> E
app.js
啟動一個 Web 伺服器,監聽 8080 埠,並使用 Pug 渲染首頁內容。package.json
和 package-lock.json
則管理專案的依賴項,確保在不同環境中都能一致地構建應用程式。
利用 Docker 快速容器化
docker init
命令是 Docker Desktop 提供的便捷工具,可以自動生成 Dockerfile、.dockerignore 和 compose.yaml 檔案,簡化容器化流程。
在 gsd-book/node-app
目錄下執行以下命令:
docker init
按照提示選擇 Node.js 平台、版本、套件管理器和啟動命令等資訊。命令執行完成後,您將獲得一個最佳化的 Dockerfile,以及用於構建和管理容器的相關檔案。
如果您沒有使用 Docker Desktop,可以參考以下範例 Dockerfile:
ARG NODE_VERSION=23.3.0
FROM node:${NODE_VERSION}-alpine
ENV NODE_ENV production
WORKDIR /usr/src/app
RUN --mount=type=bind,source=package.json,target=package.json \
--mount=type=bind,source=package-lock.json,target=package-lock.json \
--mount=type=cache,target=/root/.npm \
npm ci --omit=dev
USER node
COPY . .
EXPOSE 8080
CMD node app.js
Dockerfile 內容解密:
這個 Dockerfile 採用了多階段構建的最佳實踐,確保生成的映像體積最小化。
- 基礎映像選擇: 使用
node:${NODE_VERSION}-alpine
作為基礎映像,Alpine Linux 的輕量級特性有助於減少映像大小。 - 設定生產環境:
ENV NODE_ENV production
設定 Node.js 為生產模式,提升應用程式效能。 - 最佳化依賴安裝: 使用
--mount
選項掛載package.json
和package-lock.json
,並利用快取機制加速依賴項安裝,避免重複下載。 - 以非 root 使用者執行:
USER node
切換到非 root 使用者執行應用程式,提高容器安全性。 - 複製應用程式碼:
COPY . .
將應用程式碼複製到映像中。 - 暴露埠號:
EXPOSE 8080
暴露應用程式埠號,以便外部存取。 - 設定啟動命令:
CMD node app.js
設定容器啟動時執行的命令。
構建映像
執行以下命令構建映像:
docker build -t node-app .
執行容器
使用以下命令執行容器:
docker run -p 8080:8080 node-app
現在,您就可以在瀏覽器中存取 http://localhost:8080/
,檢視應用程式是否正常執行。
透過以上步驟,我們成功地將 Node.js 應用程式容器化,並實作了多項最佳實踐,確保映像的輕量級、高效能和安全性。
這個範例展示瞭如何利用 Docker 快速構建和佈署 Node.js 應用程式。透過理解 Dockerfile 的每個指令,您可以更好地控制映像的構建過程,並根據專案需求進行調整。
希望這篇文章能幫助您更好地理解 Node.js 容器化,並在實踐中應用這些技巧。
容器化Node.js應用程式:構建與佈署
在軟體開發的過程中,確保應用程式在不同環境中具有一致的行為至關重要。容器化技術的出現有效地解決了這個問題,它將應用程式及其所有依賴項封裝到一個獨立的單元中,從而消除了「在我的機器上可以執行」的窘境。本文將以一個Node.js Web應用程式為例,探討如何使用Docker進行容器化,並分享我在實踐過程中的一些心得體會。
Docker 映像檔構建
首先,我們需要一個Dockerfile,它就像應用程式的容器化藍圖,描述瞭如何構建Docker映像檔。以下是一個簡化的Dockerfile示例,它根據Node.js Alpine版本構建:
FROM node:alpine
WORKDIR /usr/src/app
COPY . .
RUN npm ci --omit=dev
USER node
EXPOSE 8080
CMD ["node", "app.js"]
內容解密:
這個Dockerfile包含了幾個關鍵指令:
FROM node:alpine
:指定基礎映像檔為node:alpine
,這是一個輕量級的Node.js環境,非常適合用於容器化Web應用程式。我通常會選擇Alpine版本,因為它的體積更小,構建速度更快。WORKDIR /usr/src/app
:設定工作目錄,後續指令將在這個目錄下執行。COPY . .
:將當前目錄下的所有檔案複製到映像檔的工作目錄中。RUN npm ci --omit=dev
:安裝應用程式的依賴項,--omit=dev
引數表示跳過開發環境的依賴項,以減小映像檔體積。USER node
:設定容器以node
使用者身份執行,提高安全性。EXPOSE 8080
:宣告應用程式監聽的埠號。CMD ["node", "app.js"]
:指定容器啟動時執行的命令。
使用以下命令構建映像檔:
$ docker build -t node-app .
內容解密:
docker build
:構建Docker映像檔的命令。-t node-app
:為映像檔設定名稱為node-app
。.
:指定Dockerfile所在的目錄。
構建完成後,可以使用docker images
命令檢視已建立的映像檔。
執行容器化應用程式
構建完成映像檔後,我們就可以使用以下命令執行容器:
$ docker run -d --name web -p 8080:8080 node-app
內容解密:
docker run
:執行Docker容器的命令。-d
:以後台模式執行容器。--name web
:設定容器名稱為web
。-p 8080:8080
:將主機的8080埠對映到容器的8080埠。node-app
:指定要執行的映像檔名稱。
執行成功後,在瀏覽器中存取http://localhost:8080/
即可檢視應用程式。
推播映像檔到Docker Hub
為了在其他機器上執行容器化應用程式,我們可以將映像檔推播到Docker Hub等映像檔倉函式庫。
首先,使用docker tag
命令為映像檔增加標籤,包含Docker Hub使用者名稱和倉函式庫名稱:
$ docker tag node-app <你的Docker Hub使用者名稱>/gsd-book
內容解密:
docker tag
:為映像檔增加標籤的命令。<你的Docker Hub使用者名稱>/gsd-book
:新的映像檔標籤,包含你的Docker Hub使用者名稱和倉函式庫名稱。
然後,使用docker push
命令將映像檔推播到Docker Hub:
$ docker push <你的Docker Hub使用者名稱>/gsd-book
內容解密:
docker push
:將映像檔推播到倉函式庫的命令。<你的Docker Hub使用者名稱>/gsd-book
:要推播的映像檔標籤。
Mermaid 圖表 - 映像檔層級結構
graph LR A[基礎映像檔 (node:alpine)] --> B(WORKDIR); B --> C(COPY); C --> D(RUN npm ci); D --> E[應用程式映像檔 (node-app)];
圖表說明: 此流程圖展示了Docker映像檔的構建過程,從基礎映像檔開始,逐步增加應用程式碼和依賴項,最終形成完整的應用程式映像檔。
本文詳細介紹瞭如何使用Docker容器化一個Node.js應用程式,包括構建映像檔、執行容器以及推播映像檔到Docker Hub。容器化技術的應用,可以大幅簡化應用程式的佈署流程,提高開發效率。在實際應用中,可以根據具體需求調整Dockerfile的組態,例如,可以增加捲掛載來持久化資料,或者使用多階段構建來最佳化映像檔體積。
現代應用程式大多由許多不同的容器共同運作,形成複雜的微服務架構。本文將引導您使用 Docker Compose 佈署和管理這類別多容器應用程式,並以一個實際案例示範,讓您掌握 Compose 的精髓。