Node.js服務的容器化

容器化是將應用程序、其依賴項和庫一起捆綁在一起,以便可以像即插即用一樣在任何類型的基礎設施上使用。每個捆綁包都被稱為容器。

為什麼要將 Node.js 服務容器化?

正如上一節中所討論的,將一個Node.js 服務容器化意味著將應用程序、其依賴項、庫甚至配置捆綁到一個容器中。容器化具有以下好處:

  1. 可攜式由於我們將所有應用程序要求捆綁在一個容器中,因此相同的映像可以安裝在開發、暫存和生產環境中。
  2. 快速輕量容器往往比虛擬機器(VM)或裸機快得多,因為它們僅運行應用程序的要求,而歷史上,VM或裸機將啟動整個機器和所有應用程序。
  3. 可擴展有了上述兩個好處,由於容器快速、高效且易於部署,因此可擴展性變得非常容易。

在本文中,我們將專注於將 Node.js 應用程式容器化。

前提條件

工具與軟體

Docker(Docker 引擎和 Docker CLI)

我們需要安裝 Docker以管理我們的容器。Docker 引擎處理運行時,CLI 可用於通過命令列進行互動。

已安裝 Node.js 和 npm/yarn(用於初始開發/測試)

我們需要已安裝 Node.js 和 npm 以安裝庫的依賴項並運行服務。

Kubernetes 或 Docker Compose 來管理多個容器(選擇性)

我們需要 Kubernetes 或 Docker Compose 來管理多個容器。

基本原理

Node.js 應用結構:

  • 讀者應該已了解專案中主文件(如 app.jsindex.js)的角色,以及其他文件例如 package.jsonyarn.lock 的作用。
  • 本文也不會深入探討專案的其他方面,例如控制器、中介軟體和 路由。

基礎 Docker 命令和 Dockerfile 語法

Docker 命令:

Shell

 

核心 Dockerfile 指令:

Shell

 

上述表格涵蓋的內容以及 Node.js 結構足以開始進行容器化並部署您的 Node.js 服務。

設置 Node.js 服務

設置 Node.js 環境 是一個簡單的過程。 確保 已經在你的機器上安裝了 Node.js。如果 有任何疑問, 請參考附錄 (1)一旦安裝完成,打開 你的 終端並通過輸入 來驗證安裝。

Shell

 

創建一個項目目錄並初始化 你的 項目,如下所示:

Shell

 

安裝 express 模組

Shell

 

創建一個伺服器文件, 我們稱它為 server.mjs,在這裡我們可以添加路由和對應的邏輯。 因為這篇文章更關於容器化,我們將保持端點邏輯非常簡單。像這樣:

JavaScript

 

現在您的服務已準備好啟動,請在終端機中導航至專案目錄,並執行此命令:

Shell

 

服務已啟動並運行;如果我們訪問 http://localhost:3000,我們將看到:

“歡迎來到我的伺服器

創建 Dockerfile

讓我們回顧一下 Dockerfile 是什麼,它包含構建 docker 映像的指令。讓我們在根目錄中創建一個 Dockerfile。在這一步中,正如我們在 Dockerfile 指令中討論的,我們需要做以下幾件事:

Plain Text

 

構建和運行 Docker 映像

從終端機的根目錄,導航到您的項目並運行以下命令:

Shell

 

其中image-name是Docker映像的名稱。末尾的.設置了當前目錄的上下文。

映像構建完成後,我們將創建容器並運行Node.js應用程式,使用以下命令:

Shell

 

完成上述步驟後,可以通過運行docker ps來驗證服務是否運行,然後前往與之前相同的本地主機URL。

將映像推送到註冊表

現在您的圖像已準備就緒,時候將它推送到註冊表中了。對於本文範圍,讓我們只推送到Docker Hub。Docker Hub是一個基於雲端的服務,用於存儲、分享和管理Docker容器映像。

https://hub.docker.com/創建帳戶並登錄。 您的帳戶。

Shell

 

登錄後,本地構建的映像可以像這樣添加:

Shell

 

其中:

  • taglatest或版本號。
  • repository-name是所需的存儲庫名稱。

接下來,按照以下方式推送映像:

Shell

 

結論

正如我們所看到的,容器化通過分離依賴關係,使得複雜的工作流程和服務快速、可移植和可擴展。一旦實施,整個團隊都會從中受益。我鼓勵您探索高級功能,如多階段構建和容器網絡。同時,考慮學習管控工具(例如 Kubernetes)並集成 CI/CD 流水線,以優化您的開發工作流程。

附錄

  1. 如何在您的機器上安裝 node 和 npm

Source:
https://dzone.com/articles/containerization-of-a-nodejs-service