在开发和部署 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 应用程序。
- 创建一个名为
app
的目录,进入该目录。
mkdir app && cd app
- 在该目录下,创建一个名为
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!
。
- 在该目录下,创建一个名为
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 镜像的步骤。
- 在
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
启动应用程序。
- 在
app
目录下,执行以下命令,以创建 Docker 镜像。
docker build -t myapp .
该命令将在当前目录下创建名为 myapp
的 Docker 镜像。
在 Docker 容器中使用 PM2
当 Docker 镜像准备好后,我们可以使用 Docker Compose 创建一个包含两个服务的多容器环境,其中一个服务是 PM2,另一个服务是我们刚刚创建的应用程序。
以下是创建多容器环境的步骤。
- 在
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 应用程序,并指定了应用程序的配置项,如应用程序的入口文件、运行实例数、自动重启等。
- 在
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