发布于 2026-01-06 6 阅读
0

🐳面向Node.js开发者的Docker

🐳面向Node.js开发者的Docker

介绍

作为开发人员,我们经常需要处理各种依赖项、配置和部署环境。这种复杂性有时会使我们难以确保应用程序在不同的机器和平台上稳定运行。

Docker 的出现,彻底改变了我们构建、交付和运行应用程序的方式。Docker 提供了一个轻量级、可移植且自包含的应用程序运行环境,使其成为希望简化开发工作流程和部署流程的 Node.js 和 Express 开发人员的理想选择。

在这篇博文中,我们将揭开 Docker 的神秘面纱,探索它如何简化 Node.js 和 Express 应用的开发和部署。无论您是经验丰富的开发者还是新手,本指南都将为您提供 Docker 的基本概念和实践技能,助您自信地将 Node.js 和 Express 项目容器化。

Docker到底是什么?

Docker 是一款旨在简化应用程序创建、部署和运行的工具,它利用容器技术来实现这一目标。容器允许开发人员将应用程序及其所有必需组件(例如库和其他依赖项)打包在一起,并将其作为一个软件包进行部署。

为什么要将 Docker 与 Node.js 和 Express 一起使用?

管理依赖关系并确保不同开发和生产环境中的行为一致性可能是一项艰巨的任务。而 Docker 正好可以解决这个问题。

通过使用 Docker 将 Node.js 和 Express 应用程序容器化,您可以:

隔离依赖项:Docker 容器封装了应用程序的依赖项,防止不同项目之间出现冲突和版本不匹配。

简化部署:Docker 的可移植性确保您的应用程序在开发、测试和生产环境中以相同的方式运行。

轻松扩展:Docker 容器可以轻松进行水平复制和扩展,以应对不断增长的流量和需求。

无缝协作:与团队成员共享您的 Docker 容器,确保每个人都在相同的环境中工作,无论他们的本地设置如何。

亲自动手做些实际的事情

请先在您的系统中安装 Docker,然后再继续操作。

Docker 构建和运行容器化应用程序涉及几个关键步骤。以下是主要步骤的简要概述:

  1. 编写代码:首先,像往常一样编写应用程序的代码。

  2. 创建 Dockerfile:你需要创建一个名为“Dockerfile”的特殊文本文件,它告诉 Docker 如何设置应用程序的环境。这就像为你的应用程序编写一份食谱。

  3. 构建 Docker 镜像:您可以使用 Dockerfile 来构建镜像。镜像就像是应用程序及其运行环境的快照,它包含了运行应用程序所需的所有组件和指令。

  4. 运行容器:有了镜像之后,就可以从中创建容器。容器就像应用程序的一个运行实例,应用程序就实际运行在容器中。

  5. 使用您的应用:容器运行后,您就可以像使用普通程序一样使用您的应用程序了。它与您的计算机隔离,因此不会影响其他任何程序。

  6. 停止或移除容器:当您使用完应用程序后,您可以停止容器(就像关闭应用程序一样)或将其移除(就像删除它一样)。

更简单地说,你可以把它想象成烤蛋糕:

  • 编写代码:你写下蛋糕的配方。

  • 创建 Dockerfile:就像把烘焙蛋糕的步骤写在一张特殊的食谱卡上一样。

  • 构建图像:您使用食谱卡收集所有食材并烘焙蛋糕。现在,蛋糕已经准备好享用了。

  • 运行容器:就像把蛋糕放在盘子里开始吃一样,这就像在容器中运行你的应用程序。

  • 停止或移除容器:当你吃饱不想再吃的时候,你可以停止进食(停止容器)或扔掉剩下的蛋糕(移除容器)。

Docker 可以帮助你将应用程序及其运行环境打包到一个简洁、便携的容器(镜像)中,然后在任何你想要的地方运行它(容器)。这就像拥有一个神奇的厨房,无论你走到哪里都能为你制作并奉上蛋糕!

让我们通过代码来实际看一下:

编写你的代码

如果您已经熟悉 node/express,那么这一部分对您来说应该轻而易举,因此我会加快讲解速度。

创建一个新文件夹,然后执行此操作npm init并持续按 Enter 键Enter现在
你应该会看到一个文件。 创建一个名为 `<filename>` 的新文件,并将以下代码粘贴到该文件中:package.json
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!');
    }

);

Enter fullscreen mode Exit fullscreen mode

现在在终端中执行以下操作:

npm install
Enter fullscreen mode Exit fullscreen mode

安装完成后,在终端中输入以下命令:

node index.js
Enter fullscreen mode Exit fullscreen mode

你应该会在终端中看到以下内容:

Shameel app listening on port 3000!
Enter fullscreen mode Exit fullscreen mode

这是一个简单的应用程序,Hello Shameel当您http://localhost:3000/在浏览器中点击时会发送消息。

创建 Dockerfile 🐳

你只需要创建一个名为“”的文件,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"]

Enter fullscreen mode Exit fullscreen mode

让我们来详细解读一下 Docker 指令:

  1. FROM node:12.18.3-alpine3.12
  • 说明:这行代码告诉 Docker 使用 Node.js 版本 12.18.3 的基础镜像启动,具体来说,它使用的是名为 Alpine 的轻量级 Linux 版本 3.12。

  • 更简单的解释:你可以把这想象成选择一台预装了 Node.js 的电脑。我们选择的是一台体积小、速度快的电脑(Alpine 系统),并且预装了 Node.js 12.18.3 版本。

  1. WORKDIR /app
  • 说明:这会将 Docker 容器内的工作目录设置为名为“app”的文件夹。

  • 更简单的解释:想象一下你正在一个虚拟房间内工作,而这条命令的意思是,“从现在开始,让我们在‘应用程序’房间内工作。”

  1. COPY package.json /app
  • 说明:此操作会将您计算机(用于构建 Docker 容器的计算机)中的“package.json”文件复制到 Docker 容器内的“app”文件夹中。

  • 更简单的解释:这就像从你的桌子上拿一张纸(package.json)并把它放到“应用程序”房间里一样。

  1. RUN npm install
  • 说明:这条命令指示 Docker 在容器的“app”文件夹内运行“npm install”命令。它会根据“package.json”文件中列出的内容,安装 Node.js 应用程序所需的所有软件。

  • 更简单的解释:想象一下,你有一个食谱(package.json),其中列出了制作蛋糕所需的所有原料。这条命令就像走进厨房(“应用”房间),实际取出所有这些原料(安装它们),以便你稍后可以烤蛋糕。

  1. COPY . /app
  • 说明:此操作会将您计算机上的所有文件和文件夹(整个当前目录,用“.”表示)复制到 Docker 容器内的“app”文件夹中。

  • 更简单的解释:这就像将你所有的项目文件和文件夹(包括你的代码)移动到“app”文件夹中。

  1. EXPOSE 3000:3000
  • 说明:这部分告诉我们容器需要监听 3000 端口。格式为`<port>:<host>: hostPort:containerPort...hostPortcontainerPort

  • 更简单的解释:当这个容器运行时,就像容器上有一扇标有“3000”的门。如果你想与容器内部的任何内容通信,你应该敲这扇门(端口 3000)。

  1. CMD ["node", "index.js"]
  • 说明:此设置指定 Docker 容器启动时要运行的默认命令。在本例中,它运行的是“node index.js”命令,该命令通常会启动您的 Node.js 应用程序。

  • 更简单的解释:你可以把它想象成设置一个自动操作,当你进入“应用”房间时就会执行。一旦你进入房间,就会有程序(Docker)自动使用“node index.js”启动你的项目。

因此,所有这些指令加起来就像是给 Docker 提供了一套步骤,用于创建一个特殊的运行空间(“应用”房间),引入所需的工具和组件(Node.js 及其依赖项),然后在进入该房间时启动项目。这样,任何拥有 Docker 的人都可以使用这套指令为自己的 Node.js 应用创建完全相同的环境。

构建 Docker 镜像

在终端中输入此命令。

docker build .

docker build .命令用于根据当前目录(以点号表示.)中的 Dockerfile 文件中提供的指令构建 Docker 镜像。
以下是该命令的详细说明:

  1. 需要 Dockerfile:使用此命令前,您必须在运行命令的同一目录下放置一个 Dockerfile 文件。Dockerfile 文件包含创建镜像的指令,包括使用哪个基础镜像、安装哪些软件以及如何配置环境。

  2. 构建过程:运行 Docker 时docker build .,Docker 会读取 Dockerfile 中的指令并按步骤执行。它首先创建一个初始基础镜像(在 Dockerfile 中指定),然后执行 Dockerfile 中的每个命令,在该基础镜像之上创建各个层。

  3. 分层方法:Docker 使用分层方法构建镜像。Dockerfile 中的每条指令都会向镜像添加一个新层。这种分层结构可以实现高效的缓存和层重用,如果 Dockerfile 没有更改,则可以加快后续构建速度。

  4. 输出:当 Docker 执行 Dockerfile 中的指令时,您会在终端中看到输出,显示构建进度。Docker 将根据指令下载必要的组件、安装软件并执行其他任务。

  5. 最终镜像:Dockerfile 中的所有指令执行完毕后,Docker 会生成一个最终镜像。该镜像是您的应用程序及其环境的快照,包括 Dockerfile 中指定的所有依赖项和配置。

  6. 标签:默认情况下,Docker 会为其构建的镜像分配一个唯一的标识符(一个长的十六进制字符串)。但是,您也可以使用-t标志为镜像指定一个更易于理解的名称和标签。例如:docker build -t myapp:1.0 .

  7. 结果:构建过程成功完成后,您将获得一个封装了您的应用程序及其运行环境的 Docker 镜像。然后,您可以使用此镜像创建和运行容器,这些容器是您的应用程序实例,可以独立运行。

运行该命令后,您将看到类似这样的输出:

=> [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
Enter fullscreen mode Exit fullscreen mode

如您所见,您目前处于五个步骤中的第一步,它采用了如上文第 3 点所述的分层方法
。 它首先下载图像,然后执行后续命令,您将看到如下所示的命令:

[4/5] RUN npm install
[5/5] COPY . /app
Enter fullscreen mode Exit fullscreen mode

最后你会看到类似这样的信息,表示你现在已经构建好了一个镜像。

writing image sha256:<some-string>
Enter fullscreen mode Exit fullscreen mode

基本 Docker 镜像操作

现在 Docker 镜像已经编写好了,让我们来看看它。

列表图像

运行以下命令:

docker image ls
Enter fullscreen mode Exit fullscreen mode

你应该能够看到没有标签的图片:

图片描述

请注意,它没有标签,因为我们没有提供任何标签。

删除图片

运行以下命令:

docker image rm <image-id>
Enter fullscreen mode Exit fullscreen mode

你可以像前面演示的那样,通过命令找到id它。 就我而言,我会这样写:imagedocker image ls

docker image rm 3eeaca53075f
Enter fullscreen mode Exit fullscreen mode

我看到了这样的回复:

Deleted: sha256:3eeaca53075f9fda421fb006d8627e605f90e8a71d331c5e12d7a517c58a2daf
Enter fullscreen mode Exit fullscreen mode

构建带有标签的 Docker 镜像

使用-t标志位,name如下tag所示:

运行以下命令:

docker build -t shameel-node-image .
Enter fullscreen mode Exit fullscreen mode

有趣的事实:

请看这里:

图片描述

你感受到分层的魔力了吗?这些步骤已经缓存好了:

=> CACHED [2/5] WORKDIR /app
=> CACHED [3/5] COPY package.json /app
=> CACHED [4/5] RUN npm install
Enter fullscreen mode Exit fullscreen mode

这意味着它npm install不会在你修改 Node.js 应用程序时每次都运行。只有修改的部分才会被复制。它只会在你添加/移除依赖项时才会更新。

运行容器

容器通过镜像运行。

让我们列出我们刚刚用 cool 标签创建的图像。

图片描述

你可以用以下命令运行它:

docker run -p 3000:3000 -d --name shameel-node-app -d shameel-node-image
Enter fullscreen mode Exit fullscreen mode

让我们来分析一下这条命令的内容:

  • docker run:这会告诉 Docker 运行一个容器,容器就像一个虚拟空间,用于运行你的应用程序。

  • --name shameel-node-app : 这部分允许您为容器指定一个唯一的昵称,例如本例中的“shameel-node-app”。

  • -d:此标志代表“分离模式”。这意味着您的容器将在后台运行,您可以继续使用终端执行其他任务。

  • -p 3000:3000:此部分指定端口映射。它告诉 Docker 将主机(运行 Docker 的计算机)上的 3000 端口映射到容器内部的 3000 端口。这样做的目的是让您可以通过主机上的 3000 端口访问容器内运行的服务。

  • shameel-node-image:这是您用于创建容器的 Docker 镜像的名称。它就像您创建应用程序时需要遵循的食谱。

所以,当你运行这个命令时,Docker 将会:

  1. 取“shameel-node-image”(您的应用程序配方)。
  2. 从中创建一个新容器,并将其命名为“shameel-node-app”(就像为你的菜肴制作一个盛菜盘一样)。
  3. 在这个容器内后台运行你的应用程序,你可以继续使用终端做其他事情。

这就像你点了一份餐(图片),要求把它盛放在盘子里(名为“shameel-node-app”的容器),然后就可以享用你的餐点,而无需观看厨师(Docker)在厨房(你的电脑)里烹饪。

一切就绪后,你应该会看到一串奇怪的字符串:

图片描述

这个奇怪的字符串是容器的 ID。

就我而言,情况是:

2d06a5f7e628c12b76cea2e99b3bf7e2485d3b0dd7a3e895b69a0221cce654a6
Enter fullscreen mode Exit fullscreen mode

您可以使用以下命令列出容器

docker ps
Enter fullscreen mode Exit fullscreen mode

就这样,事情办完了。

现在打开浏览器中的链接,然后点击这里:

http://localhost:3000/
Enter fullscreen mode Exit fullscreen mode

神奇的是,你会看到这样的景象:

图片描述

如果您安装了 Docker Desktop,那么您应该能够看到该应用程序的终端:

图片描述

.dockerignore 文件的重要性

目前,我们复制了所有内容,但我们并不想复制所有内容,例如,在这种情况下,node_modules我们不想复制所有Dockerfile内容。在生产应用中,我们也不会推送所有内容,尤其是密钥之类的东西。
所以,就像在之前一样git,我们.gitignore在这里也使用了 `<filename>`,.dockerignore这有助于我们避免将我们永远不想复制到镜像中的文件复制到镜像中。

只需创建一个.dockerignore文件,并在其中写入要忽略的文件/目录的名称即可。

像这样:

node_modules
Dockerfile
.gitignore
.git
Enter fullscreen mode Exit fullscreen mode

结论

以下是 Docker 的关键要点和命令:

要点总结:

  • Docker 允许您在容器中创建、部署和运行应用程序,容器会将应用程序及其依赖项打包成一个可移植的单元。

  • 将 Docker 与 Node.js 和 Express 结合使用,可以帮助您隔离依赖项、简化部署、轻松扩展,并与您的团队无缝协作。

  • Dockerfile是定义 Docker 镜像构建方式的关键组件。它包含设置环境、安装依赖项和运行应用程序的指令。

  • Docker 镜像就是应用程序及其环境的快照,而 Docker 容器则是这些镜像的实例,可以独立运行。

  • Docker 命令,例如docker builddocker rundocker image lsdocker image rm,用于构建、运行、列出和删除 Docker 镜像和容器。

关键 Docker 命令:

  • docker build <image-name> .使用当前目录中的 Dockerfile 构建 Docker 镜像。

  • docker run -p <host-port>:<container-port> -d --name <container-name> <image-name>:从镜像运行 Docker 容器,指定端口映射、容器名称和镜像名称。

  • docker image ls列出系统上的 Docker 镜像。

  • docker image rm <image-id>:通过 ID 删除 Docker 镜像。

  • docker ps列出系统上的 Docker 容器。

祝您编码和容器化愉快!🐳✨

关注我获取更多此类内容:
LinkedIn:https://www.linkedin.com/in/shameeluddin/
GitHub: https: //github.com/Shameel123

文章来源:https://dev.to/shameel/docker-for-nodejs-developers-5458