多年來,應用程式和工具變得越來越複雜,以滿足人們不斷變化的需求和期望。但這可能會導致代碼兼容性和遠程訪問方面的問題。例如,在Windows上正常運行的代碼庫在Linux上安裝後可能出現兼容性錯誤。
幸運的是,Docker來拯救了。但您可能會想知道Docker是什麼,它又是如何幫助的呢?您將在本教程中學到所有這些以及更多內容。
但在我們開始之前,這裡有一些先決條件:
-
熟悉Linux命令
-
熟悉終端機的使用
-
熟悉Node.js和Express.js
目錄
什么是 Docker?
Docker 是一个开源工具,可以让软件在任何地方以一致的方式运行。它通过将您的应用程序和所有需要的内容(如库和设置)放入一个容器中(稍后会详细讨论)来实现这一点。
想象一下容器就像一个盒子:它包含您的应用程序及其所有部分,因此它在您的笔记本电脑、服务器或云中都可以完全相同地运行。Docker 通过可靠且可移植的方式将所有内容打包在一起,帮助开发人员避免“在我的机器上可行”的问题。
Docker 是由 Solomon Hykes 在 2013 年创建的。多年来,它已经发展成涵盖各种工具的工具。它已成为改进应用程序部署和网络处理过程的首选工具。
在继续之前,让我们先了解一些在本教程中会遇到的关键术语:
Docker 引擎
Docker 引擎,顧名思義,是 Docker 應用程式的強大引擎。它有一個客戶端和一個伺服器組件。在我們的情況下,Docker 客戶端是我們將用來發送相關命令以執行項目的命令列介面工具或 Docker 終端。Docker 伺服器,通常稱為守護進程,是處理運行各種 Docker 映像和容器的伺服器。
Docker 映像
Docker 映像是可執行軟體和系統的預製模板。Docker 提供了各種各樣的映像,從作業系統模板到伺服器模板、軟體模板等等。你可以在存儲這些映像的 Docker hub 註冊中心找到所有這些映像。
你也可以建立特定的映像,並將其公開托管在 Docker hub 或在私人註冊中心中。
Docker 容器
Docker 容器是基於生成的模板(即 Docker 映像)構建的可執行緊湊實例。它們是輕量級的、可攜式的包,包含運行一段軟體所需的一切——代碼、運行時、庫和系統工具。容器確保應用程式無論在何種環境下都能穩定運行。
使用 Docker 的好處
以下是作為後端開發者使用 Docker 的一些好處:
-
Docker 是創建堅實的 DevOps 文化以進行應用程式開發的絕佳工具,因為它明確了開發和運營團隊的職能。
-
它也非常靈活,可以輕鬆部署微服務和分佈式的龐大後端應用程序。
-
它還可以減少依賴錯誤配置在安裝過程中的錯誤,因為它一次性將應用程序及其必要的依賴端口化。
接下來,我們將深入探討如何將 Node.JS Express 應用程序 Docker 化。但在此之前,您需要在計算機上安裝 Docker。如果您已經安裝了,則可以跳過這一步。
安裝 Docker 的方法
Docker 是一個跨平台工具,可以在所有流行的操作系統(Windows、Mac OS 和 Linux 發行版)上安裝。在本教程中,我將只強調如何在 Windows 上設置 Docker。
如果您目前使用的是 Windows 以外的任何操作系統,您可以通過按照 Docker 文檔中的步驟 這裡 來輕鬆設置 Docker。
對於 Windows 用戶,您的電腦必須符合最低規格要求 – 否則安裝將不成功。最低要求如下:
-
不低於 Windows 10 家庭版的 Windows 操作系統版本
-
安裝了 WSL-2 或啟用了 Hypervisor 的電腦。
接下來,讓我們下載 Docker 安裝程式可執行檔。您可以從 這裡 下載最新的 Docker 安裝程式。完成後,運行該軟體並接受條款和條件。成功完成後,啟動應用程式。您應該看到這樣的畫面:
為了確認您已成功安裝該應用程式,請導航到命令提示字元終端並運行 Docker –-version
。如果安裝成功,您應該會看到您所安裝的 Docker 引擎工具的確切版本。
現在我們將進入專案的正題。
示範專案:如何將 Node.js 應用程式容器化
在這一部分中,我們將容器化一個簡單的基於 Node.js 的後端服務,並且依賴性最少。這將向您展示如何使用名為 Dockerfile 的 Docker 應用程式容器化技術來容器化和移植一個應用程式。請記住,如果您有一個更複雜的應用程式,使用 Docker compose YAML 工具 可能會更好。
首先,我們將建立範例的 Node.js 應用程式。我將在此文章中提供完整的程式碼設置。但首先,讓我們了解什麼是 dockerfile。
什麼是 Dockerfile?
基本上,Dockerfile 是一種模板系統,允許使用者輸入命令,這些命令在執行時可以產生應用程式的功能性映像。這個映像然後可以轉換為容器。
以下是 Dockerfile 基本結構中包含的一些命令:
-
CMD
:設定容器啟動時如果未指定命令則執行的預設命令。可以在運行容器時提供命令來覆蓋它(docker run ...
)。 -
ENTRYPOINT
:指定容器啟動時始終執行的主要命令。這個命令不容易被覆蓋,但可以附加參數。
注意CMD
和ENTRYPOINT
都指定了容器啟動時應執行的命令或過程。但它們的使用方式不同,目的也不同。使用CMD
來設置可以被覆蓋的預設行為。使用ENTRYPOINT
來定義容器的主要目的的固定命令。 FROM
:這通常是 Dockerfile 中的開頭語句。這個命令獲取一個基本映像,這個映像形成了構建相關應用程序映像的基礎。例如,在我們的應用程序中,Node.js 應用程序的基本映像是安裝基線 Node.js 引擎。WORKDIR
:此語法定義了應用程序文件所在的活動工作目錄,該目錄位於定義的容器內。如果該文件夾尚不存在,將自動創建一個。-
COPY
: 此語法用於確保從代碼基礎項目文件創建Docker映像所需的文件被複製到新創建的Docker容器中。這些文件的目錄被仔細標出。 -
RUN
: 此語法指定在完成應用程序容器化之前要運行的腳本。 -
ENV
: 此語法用於突出顯示在運行應用程序過程中將被調用的環境變數和秘密。 -
EXPOSE
: 此語法標示應用程序用於與外部互聯網通信的瀏覽端口。例如EXPOSE: 3000
將應用程序的網頁介面映射到localhost:3000
。
深入了解 Docker,讓我們快速回顧一下在本教程中將使用的一些關鍵 Docker 命令:
-
Docker ps
: 此命令列出您 Docker 終端上所有正在運行的容器。 -
Docker run
: 此命令執行 Docker 映像以觸發容器的實例。 -
Docker build
: 此命令根據 Docker 文件生成服務或應用程式的映像。 -
Docker rm
: 此命令可用於使用映像識別詳細信息刪除映像。
如何將應用程式容器化
現在我們可以開始對我們簡單的 Node/Express 應用進行容器化。要跟著本教程進行操作,您可以從這裡獲取基本代碼。
在本地測試後,執行它會返回一個 CRUD API,您可以在其中創建、獲取、更新和刪除產品。我們將使用我們的 Docker 引擎將應用程序打包以便在雲端輕鬆部署。我們將使用上面討論過的 Dockerfile 工具來實現這一點。
第 1 步:創建 Dockerfile
在您的項目文件夾中,創建一個名為 Dockerfile
的文件。確保名稱完全是 “Dockerfile”(沒有擴展名,在某些系統中區分大小寫 – 因此請確保它是大寫)。
如果您使用的是代碼編輯器,只需創建一個名為 Dockerfile
的新文件。如果您使用的是基本文本編輯器,請將文件保存為名稱 Dockerfile
,並確保它不會意外保存為像 .txt
這樣的擴展名。
然後輸入第一行:
FROM Node:18-alpine
此命令將獲取我們將用於驅動我們 Express 應用程序的基本映像,即 Node 引擎本身。
您可能想知道 alpine
是用來做什麼的。Alpine 是 Docker 映像的輕量、壓縮版本。它排除了不直接關鍵的額外套件,這些套件對基本操作系統並非必要。使用輕量級發行版以提高執行速度並方便使用被提倡為一種標準良好的代碼實踐。
第 2 步:設置工作目錄
WORKDIR /app
這將影像的工作目錄設置為容器的 /app
資料夾。這確保所有檔案操作都在此處進行,所有檔案都被複製到這個目錄中。
步驟 3:複製必要的檔案
COPY package.json
此命令複製 package.json
檔案,其中包含要安裝的依賴項和套件,以支持我們的應用程式。
步驟 4:執行設置腳本
RUN npm install
此命令確保所有必要的依賴項已安裝在容器上,以支持我們的 Node.js 應用程式。
步驟 5:複製程式碼檔案
COPY . .
此命令確保本地目錄中的所有檔案被複製到設置的工作目錄內的容器檔案系統中。
步驟 6:公開伺服器端口
EXPOSE 3000
此命令公開我們打算用來訪問容器的伺服器端口。在這個案例中是 3000 端口。
步驟 7:包含啟動容器的命令
CMD ["npm", "run", "dev"]4
此命令在最後執行,以啟動 Node.js 應用程式。它簡單地運行 npm run dev
命令,這是你在開發環境中使用的命令。要在生產環境中運行,則應使用 npm start
命令。
完成此過程後,最終的 Dockerfile 結構應如下所示:
FROM Node:18-alpine
WORKDIR /app
COPY package.json
RUN npm install
COPY . .
CMD ["npm", "run", "dev"]
測試 Docker 容器
總結一下,我們將創建我們的 Node.js 應用程式的 Docker 映像。為此,執行命令docker build -t nodeapp .
。 docker build
命令建立映像,而 -t
允許指定映像標籤的詳細資料。
在我們的情況下,我們將指定名稱 nodeapp
給我們將要建立的映像,並且該映像將在工作目錄中建立。
恭喜!您已成功建立第一個 Docker 映像。要查看本地存儲庫中的所有映像,請執行命令 docker images
。
為了創建用於測試的映像的可運行實例,請執行命令 docker run nodeapp
。
我們在本教程中使用 Mongo DB 作為我們的資料庫,因此我們需要將 MongoDB URL 作為環境變數傳遞給 Docker 容器。環境變數可以幫助您保護某些不應該向公眾開放的關鍵變數。其他可以作為環境變數傳遞的變數包括 API 金鑰和加密代碼。
為了將 MongoDB URL 傳遞給 Docker 容器,我們使用 -e
標籤來確保 Docker 識別對應的輸入值為環境變數。
docker run -e JWT_SECRETS={輸入您選擇的值} -e MONGO_URL={您選擇的 mongo url} nodeapp
。
為了在背景中使用容器,只需附加 -d
標籤,該標籤代表分離選項。此選項允許容器在退出命令行終端後在背景運行。
如果沒有錯誤,導航至 localhost:5000
應該會產生類似於下方圖片的結果。
總結
在這篇文章中,您學習了什麼是 Docker 及其如何運作,以及常用命令和如何將後端應用程式容器化。從基礎知識出發,您還可以探索 Docker 在持續集成和開發中的其他用途。要了解更多關於 Docker 的資訊,您可以查看其文檔 這裡。
我還建議您利用您新學到的知識來部署具有實際應用案例的項目,以及探索 Docker 應用程式中的網路功能。要使您的應用程式上線,您可以輕鬆地將您創建的 Docker 映像部署到任何流行的雲服務提供商,如 AWS、GCP、Azure 等等。
隨時可以向我提出任何問題!您也可以查看我其他的文章 這裡。下次再見,繼續編程!
Source:
https://www.freecodecamp.org/news/containerize-a-nodejs-application-using-docker/