Docker+PM2+Nginx:构建分布式 Node.js 应用

阅读时长 8 分钟读完

在现代 Web 开发中,Node.js 已经成为了一种非常流行的后端技术,而 Docker 则是一个非常流行的容器化技术,可以帮助我们构建和运行分布式应用程序。在本文中,我们将探讨如何使用 Docker、PM2 和 Nginx 构建分布式 Node.js 应用。

为什么选择 Docker?

在传统的 Web 开发中,我们通常会使用虚拟机或物理服务器来部署我们的应用程序。这种方式的缺点是需要手动配置和管理服务器,而且很难实现快速部署和扩展。而 Docker 则是一种轻量级的容器化技术,可以帮助我们快速构建、部署和扩展应用程序。

使用 Docker 构建应用程序的好处包括:

  • 可移植性:Docker 容器可以在任何支持 Docker 的环境中运行,无需担心环境配置问题。
  • 可复制性:Docker 容器可以轻松地复制和共享,使得团队协作变得更加容易。
  • 可扩展性:Docker 容器可以快速地扩展,使得应用程序可以轻松地应对高负载。

构建 Node.js 应用程序

在这个例子中,我们将构建一个简单的 Node.js 应用程序,该应用程序将在 Docker 容器中运行。

首先,我们需要创建一个名为 app 的文件夹,并在其中创建一个 package.json 文件,其中包含以下内容:

-- -------------------- ---- -------
-
  ------- --------------
  ---------- --------
  -------------- -- ------ ------- --- ------- -- - ------ -----------
  ------- -----------
  --------------- -
    ---------- ---------
  -
-

接下来,我们需要创建一个 index.js 文件,其中包含以下内容:

-- -------------------- ---- -------
----- ------- - ------------------
----- --- - ---------

------------ ----- ---- -- -
  --------------- --------
--

----- ---- - ---------------- -- ----
---------------- -- -- -
  ---------------------- -- ---- ---------
--

该应用程序使用 Express.js 框架创建了一个简单的 HTTP 服务器,该服务器将在端口 3000 上监听请求,并返回一个 “Hello World!” 字符串。

使用 PM2 管理 Node.js 进程

在生产环境中,我们通常需要运行多个 Node.js 进程,以确保应用程序的高可用性和负载均衡。但是手动管理这些进程是非常困难的,因为我们需要监视它们的运行状态并根据需要重新启动它们。这就是 PM2 的作用,它是一个流行的 Node.js 进程管理器,可以帮助我们管理多个 Node.js 进程。

首先,我们需要在应用程序文件夹中安装 PM2:

接下来,我们可以使用以下命令启动应用程序:

该命令将启动一个名为 node-docker 的 Node.js 进程,并使用 PM2 监视该进程的运行状态。我们可以使用以下命令查看进程列表:

我们也可以使用以下命令重启进程:

使用 Docker 构建容器

现在我们已经准备好将应用程序打包成 Docker 容器了。我们需要在应用程序文件夹中创建一个名为 Dockerfile 的文件,其中包含以下内容:

-- -------------------- ---- -------
- -- ------- -- ------
---- -------

- ------
------- ----

- - ------------ - ----------------- --------
---- ------------- --

- -- ------- ---
--- --- -------

- -------------
---- - -

- ------
--- - -------------- -------- ----------- --------- ------------- -

该 Dockerfile 包含以下步骤:

  1. 使用 Node.js 14 作为基础镜像。
  2. 设置工作目录为 /app
  3. package.jsonpackage-lock.json 文件复制到容器中。
  4. 安装 Node.js 依赖项。
  5. 将应用程序文件复制到容器中。
  6. 使用 pm2-runtime 启动应用程序。

接下来,我们可以使用以下命令构建 Docker 镜像:

该命令将使用 Dockerfile 中的指令构建一个名为 node-docker 的 Docker 镜像,其中 . 表示当前目录。

使用 Docker Compose 部署应用程序

现在我们已经准备好将应用程序部署到生产环境中了。我们可以使用 Docker Compose 来定义和运行多个 Docker 容器。Docker Compose 是一个用于定义和运行多个 Docker 容器的工具,它使用 YAML 文件来描述应用程序的各个部分。

我们需要创建一个名为 docker-compose.yml 的文件,其中包含以下内容:

-- -------------------- ---- -------
-------- ---

---------
  ----
    ------ -
    -------- ------
    ------
      - -----------
    ------------
      --------- ----------
    -----------
      - -----
    ---------
      - -----------

  ------
    ------ ------------
    -------- ------
    ------
      - -------
    --------
      - ----------------------------------
    -----------
      - ---
    ---------
      - -----------

  ------
    ------ ------------
    -------- ------
    ---------
      - -----------

---------
  ------------
    ------- ------

该文件包含以下部分:

  • version:使用 Docker Compose 版本 3。
  • services:定义应用程序的各个部分。
  • app:定义 Node.js 容器。
    • build:使用当前目录中的 Dockerfile 构建容器。
    • restart:容器停止后自动重启。
    • ports:将容器的 3000 端口映射到主机的 3000 端口。
    • environment:设置 NODE_ENV 环境变量为 production
    • depends_on:定义容器之间的依赖关系。
    • networks:将容器添加到 app-network 网络中。
  • nginx:定义 Nginx 容器。
    • image:使用最新版本的 Nginx 镜像。
    • restart:容器停止后自动重启。
    • ports:将容器的 80 端口映射到主机的 80 端口。
    • volumes:将当前目录中的 nginx.conf 文件映射到容器的 /etc/nginx/nginx.conf 文件。
    • depends_on:定义容器之间的依赖关系。
    • networks:将容器添加到 app-network 网络中。
  • redis:定义 Redis 容器。
    • image:使用最新版本的 Redis 镜像。
    • restart:容器停止后自动重启。
    • networks:将容器添加到 app-network 网络中。
  • networks:定义 app-network 网络。

接下来,我们可以使用以下命令启动应用程序:

该命令将启动三个 Docker 容器:Node.js 容器、Nginx 容器和 Redis 容器。我们可以使用以下命令查看容器列表:

我们也可以使用以下命令停止和删除容器:

结论

在本文中,我们探讨了如何使用 Docker、PM2 和 Nginx 构建分布式 Node.js 应用。我们首先创建了一个简单的 Node.js 应用程序,然后使用 PM2 管理 Node.js 进程。接下来,我们使用 Docker 将应用程序打包成容器,并使用 Docker Compose 部署应用程序。这种方法可以帮助我们快速部署和扩展应用程序,并提高生产环境中的可靠性和可用性。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67567ddbd8a608cf5d8c7535

纠错
反馈