在 Docker 容器中使用 PM2 启动 Node.js 应用程序

在开发和部署 Node.js 应用程序时,使用 PM2 管理进程是非常常见的方式。而在使用 Docker 部署应用程序时,使用 PM2 启动 Node.js 应用程序也是一个可行的方式。本文将介绍如何在 Docker 容器中使用 PM2 启动 Node.js 应用程序,并提供示例代码。

准备工作

在开始使用 Docker 部署 Node.js 应用程序之前,需要安装 Docker 和 Docker Compose。如果您已经安装了这些工具,可以跳过该步骤。

安装 Docker

Docker 官方网站提供了各个操作系统的安装指南。根据您的操作系统和版本选择对应的安装方法。

安装 Docker Compose

Docker Compose 是 Docker 官方提供的一个工具,可以简化 Docker 多容器应用程序的部署。可以通过以下命令安装 Docker Compose。

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

创建 Node.js 应用程序

为了演示在 Docker 容器中使用 PM2 启动 Node.js 应用程序,我们先创建一个简单的 Node.js 应用程序。

  1. 创建一个名为 app 的目录,进入该目录。
mkdir app && cd app
  1. 在该目录下,创建一个名为 index.js 的文件,并添加以下内容。
const http = require('http');

const server = http.createServer((req, res) => {
  res.end('Hello World!');
});

server.listen(8080, () => {
  console.log('Server running at http://localhost:8080');
});

这是一个简单的 Node.js HTTP 服务器,监听 8080 端口,并在收到请求时返回 Hello World!

  1. 在该目录下,创建一个名为 package.json 的文件,并添加以下内容。
{
  "name": "docker-pm2-example",
  "version": "0.1.0",
  "scripts": {
    "start": "node index.js"
  }
}

这是一个标准的 Node.js 应用程序的 package.json 文件,其中包含了一个 start 命令,用于启动应用程序。

创建 Docker 镜像

在准备好 Node.js 应用程序后,我们需要创建一个 Docker 镜像,以便在 Docker 容器中运行该应用程序。在创建 Docker 镜像时,需要将 Node.js 应用程序打包到 Docker 镜像中,并在 Docker 容器中安装 Node.js 运行环境。

以下是创建 Docker 镜像的步骤。

  1. app 目录下,创建一个名为 Dockerfile 的文件,并添加以下内容。
FROM node:14-alpine

WORKDIR /app

COPY package*.json ./

RUN npm install

COPY . .

EXPOSE 8080

CMD ["npm", "start"]

该 Dockerfile 文件指定了使用 Node.js 14 版本的 Alpine Linux 镜像作为基础镜像,将 app 目录作为工作目录,并将应用程序的依赖安装到 Docker 镜像中。在 Docker 容器中暴露 8080 端口,并通过执行 npm start 启动应用程序。

  1. app 目录下,执行以下命令,以创建 Docker 镜像。
docker build -t myapp .

该命令将在当前目录下创建名为 myapp 的 Docker 镜像。

在 Docker 容器中使用 PM2

当 Docker 镜像准备好后,我们可以使用 Docker Compose 创建一个包含两个服务的多容器环境,其中一个服务是 PM2,另一个服务是我们刚刚创建的应用程序。

以下是创建多容器环境的步骤。

  1. app 目录下,创建一个名为 docker-compose.yml 的文件,并添加以下内容。
version: "3"

services:
  app:
    build: .
    ports:
      - "8080:8080"
    restart: unless-stopped
    environment:
      NODE_ENV: production
    command: [ "pm2-runtime", "start", "index.js", "--name", "myapp" ]

  pm2:
    image: keymetrics/pm2:latest-alpine
    restart: always
    volumes:
      - ./app:/app
      - /app/node_modules
    command: [ "pm2-runtime", "start", "pm2.json" ]

该文件定义了两个服务,一个是名为 app 的服务,用于启动 Node.js 应用程序,并将应用程序暴露在 8080 端口上。另一个是名为 pm2 的服务,用于启动 PM2 守护进程,并在 PM2 守护进程中启动 Node.js 应用程序。

请注意,我们使用了 PM2 的 pm2-runtime 命令来运行 Node.js 应用程序。pm2-runtime 命令是一个特殊的命令,它可以在 PM2 守护进程中运行应用程序。使用 pm2-runtime 命令可以让我们在 Docker 容器中使用 PM2 管理 Node.js 应用程序。

此外,我们还将 Node.js 应用程序的配置文件 pm2.json 放置在了 app 目录下,以便在 PM2 守护进程中启动 Node.js 应用程序。以下是 pm2.json 文件的内容。

{
  "apps": [
    {
      "name": "myapp",
      "script": "index.js",
      "instances": 1,
      "autorestart": true,
      "watch": false,
      "max_memory_restart": "1G"
    }
  ]
}

该文件定义了一个名为 myapp 的 Node.js 应用程序,并指定了应用程序的配置项,如应用程序的入口文件、运行实例数、自动重启等。

  1. app 目录下,执行以下命令,以启动多容器环境。
docker-compose up -d

该命令将启动 Docker Compose 环境,并在后台运行。在 Docker 中运行应用程序时,建议使用 -d 参数,以便在后台运行 Docker 容器。

现在,您可以在浏览器中访问 http://localhost:8080,应该可以看到 Hello World! 的输出。

总结

在本文中,我们介绍了如何在 Docker 容器中使用 PM2 启动 Node.js 应用程序。通过使用 Docker 和 Docker Compose,我们可以方便地部署和管理多容器应用程序。希望本文对您有所帮助。如果您有任何疑问或建议,请随时在评论区留言。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65b36f44add4f0e0ffc80ef1