使用 PM2 和 Docker Compose 实现 Node.js 进程的容器化部署

阅读时长 9 分钟读完

前言

在现代的 Web 开发中,Node.js 成为了一种非常流行的后端技术。由于 Node.js 单线程的特性,我们经常需要运行多个 Node.js 进程以应对高并发的情况。同时,Docker 技术也成为了一种非常流行的容器化部署方案,它能够轻松地实现环境隔离、快速部署和水平扩展等。

在本文中,我们会详细介绍如何使用 PM2 和 Docker Compose 实现 Node.js 进程的容器化部署。通过阅读本文,您将能够学习到以下内容:

  • PM2 和 Docker Compose 的基本概念和使用方法
  • Node.js 进程的管理和监控
  • Docker Compose 下的多容器编排
  • 容器环境变量的配置和使用

我们将从基本的概念开始,一步步讲解如何实现这一过程,并通过示例代码演示每一个步骤。

PM2 和 Docker Compose 的基本概念和使用方法

PM2

PM2 是一个 Node.js 进程管理工具,它可以帮助我们轻松地管理和监控 Node.js 进程。它能够自动重启 Node.js 进程,同时还提供了管理 API 和 Web 接口,帮助我们更好地管理和监控 Node.js 进程。

PM2 的使用非常简单,我们只需要通过 npm 安装它,并使用相应的命令即可。下面是一些常用的命令:

  • pm2 start app.js:启动一个 Node.js 进程(app.js)
  • pm2 stop app:停止一个进程
  • pm2 restart app:重启一个进程
  • pm2 list:查看当前运行的进程列表
  • pm2 show app:查看某个进程的详细信息
  • pm2 logs:查看应用程序的日志

更多命令请参考官方文档。

Docker Compose

Docker Compose 是一个多容器编排工具,它可以帮助我们快速地定义和管理多个 Docker 容器。它允许我们将多个容器组合在一起运行,并提供了一些有用的功能,例如容器间网络配置、环境变量的注入和容器的扩展等。

Docker Compose 的使用也非常简单,我们只需要定义一个 docker-compose.yml 文件,并使用 docker-compose 命令即可。下面是一个基本的 docker-compose.yml 文件:

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

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

这个文件定义了两个服务(web 和 db),分别使用了 nginx 和 PostgreSQL 的官方镜像,并且将它们暴露在了本地的 8080 和 5432 端口上,同时将 db 的环境变量 POSTGRES_PASSWORD 设置为 example。

更多内容请参考官方文档。

Node.js 进程的管理和监控

在使用 PM2 管理 Node.js 进程时,我们需要注意以下几点:

  1. 必须在每个 Node.js 项目的根目录下运行 pm2 start 命令;
  2. 需要在 package.json 中添加 start 脚本,然后使用 npm start 命令来启动进程;
  3. 在生产环境下,需要使用 NODE_ENV=production 来启动进程;
  4. 可以使用 ecosystem.config.js 文件来定义项目的启动、监控和管理脚本;
  5. 可以使用 pm2 monit 命令来监控进程的运行状态。

下面是一个简单的 Node.js 项目,我们将使用 PM2 来管理和监控它:

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

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

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

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

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

首先,我们需要在项目的根目录下运行以下命令来全局安装 PM2:

然后,我们需要在 package.json 中添加 start 脚本:

接下来,我们使用 PM2 来启动进程:

这个命令将启动一个名为 myapp 的进程,并使用 npm start 命令来启动它。

我们可以使用 pm2 list 命令来查看当前运行的进程列表,然后使用 pm2 monit 命令来监控进程的运行状态。

Docker Compose 下的多容器编排

在 Docker Compose 中,我们可以使用 docker-compose.yml 文件来定义多个容器,并使用 docker-compose 命令来启动它们。

下面是一个示例 docker-compose.yml 文件,它定义了两个容器,一个是 Node.js 应用程序,一个是 Redis 缓存服务。

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

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

这个文件定义了两个服务,分别是 appredisapp 需要构建 Docker 镜像,并将它暴露在本地的 3000 端口上,它还依赖于 redis 服务,同时需要将环境变量 REDIS_HOST 设置为 redisredis 服务使用了 Redis 的官方镜像。

我们可以使用以下命令来启动容器并管理它们:

  • docker-compose up:启动容器;
  • docker-compose down:停止容器并删除它们;
  • docker-compose ps:查看容器列表。

下面是一个简单的 Node.js 应用程序,它使用 Redis 来存储数据:

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

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

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

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

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

在这个应用程序中,我们使用了 Redis 来存储一个计数器值,每次访问首页时都会将计数器加 1,并返回当前访问者的编号。

我们需要在项目的根目录下运行以下命令来构建镜像:

然后,在 docker-compose.yml 文件所在目录下运行以下命令来启动容器:

这样,我们就能够轻松地在 Docker 中运行 Node.js 应用程序,并使用 Redis 来存储数据了。

容器环境变量的配置和使用

在 Docker 中,我们可以使用环境变量来配置容器的行为。我们可以在 docker-compose.yml 文件中设置环境变量,然后在容器中使用它们。

下面是一个示例 docker-compose.yml 文件,它定义了一个 Node.js 应用程序容器,使用了环境变量 EXAMPLE_ENV

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

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

在 Node.js 应用程序中,我们可以使用 process.env 对象来访问这个环境变量:

在 Dockerfile 中,我们也可以使用 ENV 指令来定义环境变量:

这样,我们就能够轻松地使用环境变量来配置容器行为了。

总结

本文介绍了如何使用 PM2 和 Docker Compose 实现 Node.js 进程的容器化部署。通过学习本文,您应该已经了解了 PM2 和 Docker Compose 的基本概念和使用方法,以及如何在 Docker 中运行 Node.js 应用程序,并使用环境变量来配置容器行为。希望本文能够对您有所启发,帮助您更好地理解和运用这些工具和技术。

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

纠错
反馈