介紹
作為開發(fā)人員,我們經(jīng)常發(fā)現(xiàn)自己需要處理各種依賴項(xiàng)、配置和部署環(huán)境。這種復(fù)雜性有時(shí)會(huì)使確保我們的應(yīng)用程序在不同機(jī)器和平臺(tái)上一致運(yùn)行變得具有挑戰(zhàn)性。
Docker 是一個(gè)革命性的工具,它改變了我們構(gòu)建、發(fā)布和運(yùn)行應(yīng)用程序的方式。Docker 為運(yùn)行應(yīng)用程序提供了一個(gè)輕量級(jí)、可移植且自給自足的環(huán)境,使其成為希望簡化開發(fā)工作流程和部署過程的 Node.js 和 Express 開發(fā)人員的理想選擇。
在這篇博文中,我們將踏上揭開 Docker 神秘面紗的旅程,并探索它如何簡化 Node.js 和 Express 應(yīng)用程序的開發(fā)和部署。無論您是經(jīng)驗(yàn)豐富的開發(fā)人員還是剛剛?cè)腴T,本指南都將為您提供自信地容器化 Node.js 和 Express 項(xiàng)目所需的基本 Docker 概念和實(shí)踐技能。
Docker 到底是什么?
Docker 是一種工具,旨在讓使用容器更輕松地創(chuàng)建、部署和運(yùn)行應(yīng)用程序。容器允許開發(fā)人員將應(yīng)用程序及其所需的所有部分(例如庫和其他依賴項(xiàng))打包在一起,并將其部署為一個(gè)包。
為什么將 Docker 與 Node.js 和 Express 結(jié)合使用?
管理依賴關(guān)系并確保不同開發(fā)和生產(chǎn)環(huán)境中的行為一致可能是一項(xiàng)艱巨的任務(wù)。這就是 Docker 能夠發(fā)揮作用的地方。
通過使用 Docker 將 Node.js 和 Express 應(yīng)用程序容器化,您可以:
隔離依賴關(guān)系:Docker 容器封裝應(yīng)用程序的依賴關(guān)系,防止不同項(xiàng)目之間的沖突和版本不匹配。
簡化部署:Docker 的可移植性確保您的應(yīng)用程序在開發(fā)、測試和生產(chǎn)環(huán)境中以相同的方式運(yùn)行。
輕松擴(kuò)展:Docker 容器可以輕松復(fù)制和水平擴(kuò)展,以處理增加的流量和需求。
無縫協(xié)作:與團(tuán)隊(duì)成員共享您的 Docker 容器,確保每個(gè)人都在同一環(huán)境中工作,無論其本地設(shè)置如何。
用實(shí)用的東西來實(shí)踐我們的雙手
在繼續(xù)之前,請(qǐng)?jiān)谀南到y(tǒng)中安裝 docker。
Docker 涉及構(gòu)建和運(yùn)行容器化應(yīng)用程序的幾個(gè)關(guān)鍵步驟。以下是簡單的主要步驟:
編寫您的代碼:首先,您像平常一樣為您的應(yīng)用程序編寫代碼。
創(chuàng)建 Dockerfile:您創(chuàng)建一個(gè)名為“Dockerfile”的特殊文本文件,它告訴 Docker 如何設(shè)置應(yīng)用程序的環(huán)境。這就像為您的應(yīng)用程序?qū)懴率匙V。
構(gòu)建您的 Docker 映像:您使用 Dockerfile 來構(gòu)建映像。映像就像應(yīng)用程序及其環(huán)境的快照。它包含運(yùn)行應(yīng)用程序所需的所有成分和說明。
運(yùn)行容器:一旦有了映像,您就可以從中創(chuàng)建容器。容器就像應(yīng)用程序的運(yùn)行實(shí)例。這是您的應(yīng)用程序?qū)嶋H運(yùn)行的地方。
使用您的應(yīng)用程序:現(xiàn)在您的容器正在運(yùn)行,您可以像使用常規(guī)程序一樣使用您的應(yīng)用程序。它與您的計(jì)算機(jī)隔離,因此不會(huì)弄亂其他任何內(nèi)容。
停止或刪除容器:使用完應(yīng)用程序后,您可以停止容器(就像關(guān)閉應(yīng)用程序)或?qū)⑵鋭h除(就像刪除它)。
更簡單地說,就像烤蛋糕一樣:
編寫代碼:您寫下蛋糕食譜。
創(chuàng)建 Dockerfile:您在特殊的食譜卡中寫下烘烤蛋糕的步驟。
建立形象:您使用食譜卡收集所有原料并烘烤蛋糕。現(xiàn)在你已經(jīng)準(zhǔn)備好蛋糕了。
運(yùn)行容器:將蛋糕放在盤子上并開始吃。這就像在容器中運(yùn)行應(yīng)用程序一樣。
停止或移除容器:當(dāng)您吃飽并且不想再吃東西時(shí),您可以停止進(jìn)食(停止容器)或扔掉剩下的蛋糕(移除容器)。
Docker 幫助您將應(yīng)用程序及其環(huán)境打包到一個(gè)整潔的便攜式盒子(映像)中,然后在您想要的任何地方運(yùn)行它(容器)。這就像擁有一個(gè)神奇的廚房,可以隨時(shí)隨地制作和供應(yīng)您的蛋糕!
讓我們用我們的代碼來看看它的實(shí)際情況:
編寫你的代碼
如果您已經(jīng)熟悉node/express,那么本節(jié)應(yīng)該是輕而易舉的事情,因此我會(huì)以更快的速度進(jìn)行。
創(chuàng)建新文件夾并執(zhí)行此操作npm init并按住Enter。
您現(xiàn)在應(yīng)該有一個(gè)package.json文件。
創(chuàng)建一個(gè)名為的新文件index.js并粘貼以下代碼:
const express = require('express'); const app = express(); app.get('/', (_, res) => { res.send('Hello Shameel!'); } ); app.listen(3000, () => { console.log('Example app listening on port 3000!'); } );
現(xiàn)在在終端中執(zhí)行此操作:
npm install
安裝完成后,在終端中輸入:
node index.js
你應(yīng)該在終端中看到這個(gè):
Shameel app listening on port 3000!
這是一個(gè)簡單的應(yīng)用程序,Hello Shameel當(dāng)您點(diǎn)擊http://localhost:3000/瀏覽器時(shí)就會(huì)發(fā)送
創(chuàng)建一個(gè) Dockerfile ??
您所要做的就是創(chuàng)建一個(gè)名為:的文件Dockerfile并將其粘貼:
FROM node:12.18.3-alpine3.12 WORKDIR /app COPY package.json /app RUN npm install COPY . /app EXPOSE 3000:3000 CMD ["node", "index.js"]
讓我們分解一下 Docker 指令:
FROM node:12.18.3-alpine3.12
說明:此行告訴 Docker 從 Node.js 版本 12.18.3 的基礎(chǔ)映像開始,具體來說,它使用名為 Alpine 的輕量級(jí) Linux 版本 3.12。
更簡單的解釋:可以將其視為選擇一臺(tái)已安裝 Node.js 的預(yù)制計(jì)算機(jī)。我們選擇一臺(tái)體積小、速度快的計(jì)算機(jī) (Alpine),并配備 Node.js 版本 12.18.3。
WORKDIR /app
說明:這會(huì)將 Docker 容器內(nèi)的工作目錄設(shè)置為名為“app”的文件夾。
更簡單的解釋:想象一下,您正在虛擬房間內(nèi)工作,并且此命令表示:“從現(xiàn)在開始,讓我們?cè)凇畱?yīng)用程序’房間內(nèi)工作?!?/p>
COPY package.json /app
說明:這會(huì)將“package.json”文件從您的計(jì)算機(jī)(用于構(gòu)建 Docker 容器的計(jì)算機(jī))復(fù)制到 Docker 容器內(nèi)的“app”文件夾中。
更簡單的解釋:這就像從辦公桌上取出一張紙(package.json)并將其放入“應(yīng)用程序”房間內(nèi)。
RUN npm install
解釋:這告訴 Docker 在容器的“app”文件夾中運(yùn)行“npm install”命令。它根據(jù)“package.json”文件中列出的內(nèi)容安裝 Node.js 應(yīng)用程序所需的所有軟件。
更簡單的解釋:假設(shè)您有一個(gè)食譜 (package.json),其中列出了蛋糕所需的所有成分。這個(gè)命令就像去廚房(“應(yīng)用程序”房間)并實(shí)際獲取所有這些成分(安裝它們),以便稍后可以烘烤蛋糕。
COPY . /app
說明:這會(huì)將計(jì)算機(jī)中的所有文件和文件夾(整個(gè)當(dāng)前目錄,用“.”表示)復(fù)制到 Docker 容器內(nèi)的“app”文件夾中。
更簡單的解釋:這就像將所有項(xiàng)目文件和文件夾(包括代碼)移到“應(yīng)用程序”房間中。
EXPOSE 3000:3000
說明:這部分告訴我們?nèi)萜黝A(yù)計(jì)偵聽端口 3000。此處的格式為hostPort:containerPort,其中:hostPort是您的計(jì)算機(jī)(主機(jī))上可用于與容器通信的端口。containerPort是容器內(nèi)的端口,您的應(yīng)用程序設(shè)置為接收網(wǎng)絡(luò)請(qǐng)求。
更簡單的解釋:當(dāng)這個(gè)容器運(yùn)行時(shí),就像容器上有一扇標(biāo)有“3000”的門。如果你想與容器內(nèi)的任何內(nèi)容交談,你應(yīng)該敲這扇門(端口 3000)。
CMD ["node", "index.js"]
說明:這設(shè)置 Docker 容器啟動(dòng)時(shí)將運(yùn)行的默認(rèn)命令。在本例中,它運(yùn)行“node index.js”命令,該命令通常會(huì)啟動(dòng) Node.js 應(yīng)用程序。
更簡單的解釋:將其視為在您進(jìn)入“應(yīng)用程序”房間時(shí)設(shè)置自動(dòng)操作。一旦你走進(jìn)去,某人(Docker)就會(huì)自動(dòng)使用“node index.js”啟動(dòng)你的項(xiàng)目。
因此,所有這些說明加在一起就像給 Docker 提供一組步驟來創(chuàng)建一個(gè)特殊的工作區(qū)(“應(yīng)用程序”房間),引入工具和成分(Node.js 和依賴項(xiàng)),然后在進(jìn)入該房間時(shí)啟動(dòng)您的項(xiàng)目。這樣,任何擁有 Docker 的人都可以使用這組指令為您的 Node.js 應(yīng)用程序創(chuàng)建完全相同的環(huán)境。
構(gòu)建您的 Docker 鏡像
在終端中輸入此命令
docker build .
該docker build .命令用于根據(jù)位于當(dāng)前目錄(由點(diǎn)表示.)的 Dockerfile 中提供的指令構(gòu)建 Docker 映像。
以下是該命令的更多詳細(xì)信息:
需要 Dockerfile:在使用此命令之前,您運(yùn)行該命令的同一目錄中必須有一個(gè) Dockerfile。Dockerfile 包含有關(guān)如何創(chuàng)建映像的說明,包括使用什么基礎(chǔ)映像、要安裝什么軟件以及如何配置環(huán)境。
構(gòu)建過程:當(dāng)您運(yùn)行時(shí)docker build .,Docker 會(huì)從 Dockerfile 中讀取指令并逐步遵循它們。它從初始基礎(chǔ)映像(在 Dockerfile 中指定)開始,然后執(zhí)行 Dockerfile 中的每個(gè)命令以在該基礎(chǔ)映像之上創(chuàng)建層。
分層方法:Docker 使用分層方法來構(gòu)建鏡像。Dockerfile 中的每條指令都會(huì)向鏡像添加一個(gè)新層。這種分層可以實(shí)現(xiàn)層的高效緩存和重用,如果 Dockerfile 沒有更改,則可以使后續(xù)構(gòu)建速度更快。
輸出:當(dāng) Docker 執(zhí)行 Dockerfile 中的指令時(shí),您將在終端中看到顯示構(gòu)建進(jìn)度的輸出。Docker 將根據(jù)指示下載必要的組件、安裝軟件并執(zhí)行其他任務(wù)。
最終映像:執(zhí)行完 Dockerfile 中的所有指令后,Docker 會(huì)生成最終映像。該映像是您的應(yīng)用程序及其環(huán)境的快照,包括 Dockerfile 中指定的所有依賴項(xiàng)和配置。
標(biāo)記:默認(rèn)情況下,Docker 會(huì)為其構(gòu)建的鏡像分配一個(gè)唯一的標(biāo)識(shí)符(一個(gè)長的十六進(jìn)制字符串)。但是,您還可以使用該-t標(biāo)志為您的圖像提供更易于理解的名稱和標(biāo)簽。例如:docker build -t myapp:1.0 .
結(jié)果:構(gòu)建過程成功完成后,您將擁有一個(gè)封裝您的應(yīng)用程序及其環(huán)境的 Docker 映像。然后,您可以使用此映像來創(chuàng)建和運(yùn)行容器,這些容器是可以單獨(dú)執(zhí)行的應(yīng)用程序的實(shí)例。
運(yùn)行該命令后,您將看到如下輸出:
=> [internal] load build definition from Dockerfile 0.1s => => transferring dockerfile: 157B 0.0s => [internal] load .dockerignore 0.1s => => transferring context: 2B 0.0s => [internal] load metadata for docker.io/library/node:12.18.3-alpine3.12 11.1s => [auth] library/node:pull token for registry-1.docker.io 0.0s => [1/5] FROM docker.io/library/node:12.18.3-alpine3.12@sha256:24d74460bbffb823e26129ea186ebab1678757e210a521e3358 30.8s => => resolve docker.io/library/node:12.18.3-alpine3.12@sha256:24d74460bbffb823e26129ea186ebab1678757e210a521e3
正如您所看到的,您正處于 5 步中的第一步,并且它使用了上面第 3 點(diǎn)中討論的分層方法。
它首先下載圖像。然后執(zhí)行后續(xù)命令,您將看到如下所示:
[4/5] RUN npm install [5/5] COPY . /app
最后,您將看到類似的內(nèi)容,表示您現(xiàn)在已準(zhǔn)備好構(gòu)建映像。
writing image sha256:<some-string>
Docker 鏡像基本操作
現(xiàn)在你已經(jīng)編寫了 docker 鏡像,讓我們看看。
列表圖片
運(yùn)行這個(gè)命令:
docker image ls
您應(yīng)該能夠看到?jīng)]有任何標(biāo)簽的圖像:
請(qǐng)注意,它沒有標(biāo)簽,因?yàn)槲覀儧]有提供任何標(biāo)簽。
刪除圖像
運(yùn)行這個(gè)命令:
docker image rm <image-id>
您可以從前面演示的命令中找到idof 。 對(duì)于我的情況,我會(huì)這樣給出:imagedocker image ls
docker image rm 3eeaca53075f
我看到這樣的回應(yīng):
Deleted: sha256:3eeaca53075f9fda421fb006d8627e605f90e8a71d331c5e12d7a517c58a2daf
使用標(biāo)簽構(gòu)建 Docker 鏡像
使用帶有of 的-t標(biāo)志,如下所示:nametag
運(yùn)行這個(gè)命令:
docker build -t shameel-node-image .
很酷的事實(shí):
看這個(gè):
你看到分層的魔力了嗎?這些步驟已被緩存:
=> CACHED [2/5] WORKDIR /app => CACHED [3/5] COPY package.json /app => CACHED [4/5] RUN npm install
這意味著npm install每當(dāng)您在 Node.js 應(yīng)用程序中進(jìn)行更改時(shí),它并不總是會(huì)運(yùn)行。僅復(fù)制更改。僅當(dāng)您添加/刪除依賴項(xiàng)時(shí)它才會(huì)改變。
運(yùn)行容器
容器從圖像運(yùn)行。
讓我們列出我們剛剛使用 Cool 標(biāo)簽構(gòu)建的圖像。
您可以使用以下命令運(yùn)行它:
docker run -p 3000:3000 -d --name shameel-node-app -d shameel-node-image
讓我們消化一下該命令是什么:
docker run:這告訴 Docker 運(yùn)行一個(gè)容器,它就像一個(gè)運(yùn)行應(yīng)用程序的虛擬空間。
--name Shameel-node-app:這部分允許您為容器指定一個(gè)唯一的昵稱,在本例中假設(shè)它是“shameel-node-app”。
-d:該標(biāo)志代表“分離模式”。這意味著您的容器將在后臺(tái)運(yùn)行,您可以繼續(xù)使用終端執(zhí)行其他任務(wù)。
-p 3000:3000:這部分指定端口映射。它告訴 Docker 將主機(jī)(運(yùn)行 Docker 的計(jì)算機(jī))上的端口 3000 映射到容器內(nèi)的端口 3000。這樣做是為了讓您可以通過主機(jī)的端口 3000 訪問容器內(nèi)運(yùn)行的服務(wù)。
Shameel-node-image:這是您要用來創(chuàng)建容器的 Docker 映像的名稱。這就像您在申請(qǐng)時(shí)要遵循的食譜。
因此,當(dāng)您運(yùn)行此命令時(shí),Docker 將:
獲取“shameel-node-image”(您的應(yīng)用程序配方)。
從中創(chuàng)建一個(gè)新容器,將其命名為“shameel-node-app”(就像為您的菜肴制作一個(gè)盤子)。
開始在后臺(tái)運(yùn)行您的應(yīng)用程序,然后您可以繼續(xù)使用終端執(zhí)行其他操作。
就好像您點(diǎn)了一頓飯(圖片),要求將其放在盤子上(名為“shameel-node-app”的容器),然后就可以享用美食,而無需觀看廚師(Docker)在廚房(你的電腦)做飯。
完成并除塵后,您應(yīng)該看到一個(gè)奇怪的字符串:
這個(gè)奇怪的字符串就是容器的ID。
對(duì)于我的情況是:
2d06a5f7e628c12b76cea2e99b3bf7e2485d3b0dd7a3e895b69a0221cce654a6
您可以使用此命令列出容器
docker ps
這樣就完成了..
現(xiàn)在轉(zhuǎn)到瀏覽器中的鏈接并點(diǎn)擊:
http://localhost:3000/
神奇的是你會(huì)看到這個(gè):
如果您有 docker 桌面,那么您應(yīng)該能夠看到該應(yīng)用程序的終端:
.dockerignore 的重要性
目前,我們正在復(fù)制所有內(nèi)容,但我們不想復(fù)制所有內(nèi)容,在本例中為node_modules, Dockerfile。在生產(chǎn)應(yīng)用程序中,我們也不會(huì)真正推送所有內(nèi)容,尤其是秘密之類的東西。
因此,就像在 中一樣git,我們有.gitignore,在這里,我們有.dockerignore這可以幫助我們避免我們不想復(fù)制到圖像中的文件。
只需創(chuàng)建一個(gè).dockerignore文件,寫入您想要忽略的文件/目錄的名稱。
像這樣:
node_modules Dockerfile .gitignore .git
結(jié)論
以下是 Docker 的關(guān)鍵要點(diǎn)和命令:
要點(diǎn):
Docker 允許您在容器中創(chuàng)建、部署和運(yùn)行應(yīng)用程序,容器將應(yīng)用程序及其依賴項(xiàng)打包到單個(gè)可移植單元中。
將 Docker 與 Node.js 和 Express 結(jié)合使用可以幫助您隔離依賴項(xiàng)、簡化部署、輕松擴(kuò)展并與團(tuán)隊(duì)無縫協(xié)作。
這Dockerfile是定義 Docker 鏡像構(gòu)建方式的關(guān)鍵組件。它包括設(shè)置環(huán)境、安裝依賴項(xiàng)和運(yùn)行應(yīng)用程序的說明。
Docker 鏡像是應(yīng)用程序及其環(huán)境的快照,而 Docker 容器是這些鏡像的可以獨(dú)立運(yùn)行的實(shí)例。
Docker 命令,例如docker build、docker run、docker image ls和docker image rm,用于構(gòu)建、運(yùn)行、列出和刪除 Docker 映像和容器。
主要 Docker 命令:
docker build <image-name> .:使用當(dāng)前目錄下的Dockerfile構(gòu)建Docker鏡像。
docker run -p <host-port>:<container-port> -d --name <container-name> <image-name>:從映像運(yùn)行 Docker 容器,指定端口映射、容器名稱和映像名稱。
docker image ls:列出系統(tǒng)上的 Docker 鏡像。
docker image rm <image-id>:通過ID刪除Docker鏡像。
docker ps:列出系統(tǒng)上的 Docker 容器。
快樂的編碼和容器化!???
文章來源:http://www.zghlxwxcb.cn/article/331.html
下一篇:使用 Docker 輕松開發(fā) Node.js
文章來源地址http://www.zghlxwxcb.cn/article/331.html
到此這篇關(guān)于面向 Nodejs 開發(fā)人員的 Docker的文章就介紹到這了,更多相關(guān)內(nèi)容可以在右上角搜索或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!