Docker Nginx PM2部署

journey

在现代软件开发中,部署是一个重要的环节。为了更好地管理和运行应用程序,我们通常使用容器化技术。Docker 是一种开源的容器化平台,可以让开发人员将应用程序和所有依赖项打包到一个标准化的容器中。Nginx 是一款高性能的 Web 服务器,用于反向代理和负载均衡。PM2 是一个现代的、生产级的 Node.js 进程管理器。

本文将介绍如何使用 Docker、Nginx 和 PM2 来部署一个 Node.js 应用程序。

准备工作

在开始之前,我们需要准备一些工具和环境:

  • 安装 Docker:参考 Docker 官方文档,根据不同的操作系统安装 Docker。
  • 安装 Docker Compose:Docker Compose 是 Docker 官方推出的用于管理多个 Docker 容器的工具,可以简化容器的部署和管理。
  • 一个 Node.js 应用程序:本文以一个简单的 Node.js Express 应用程序为例。

步骤一:创建 Dockerfile

Dockerfile 是一个文本文件,用于定义 Docker 镜像的构建过程。在项目根目录下创建一个名为 Dockerfile 的文件,并添加以下内容:

# 使用官方的 Node.js 镜像作为基础镜像
FROM node:12

# 创建工作目录
WORKDIR /app

# 复制 package.json 和 package-lock.json 到工作目录
COPY package*.json ./

# 安装依赖
RUN npm install

# 复制应用程序代码到工作目录
COPY . .

# 暴露容器的端口
EXPOSE 3000

# 运行应用程序
CMD ["npm", "start"]

上述 Dockerfile 使用官方的 Node.js 镜像作为基础镜像,并定义了工作目录、安装依赖、复制应用程序代码和运行应用程序的步骤。

步骤二:创建 Docker Compose 文件

在项目根目录下创建一个名为 docker-compose.yml 的文件,并添加以下内容:

version: '3'
services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - '3000:3000'

上述 Docker Compose 文件定义了一个名为 app 的服务,使用上一步创建的 Dockerfile 构建镜像,并将容器的 3000 端口映射到主机的 3000 端口。

步骤三:构建和运行容器

打开终端,进入项目根目录,运行以下命令来构建和运行容器:

docker-compose up --build

上述命令会启动一个 Docker 容器,并在终端中显示应用程序的输出。通过访问 http://localhost:3000 可以查看应用程序运行的结果。

步骤四:配置 Nginx

通过 Nginx 反向代理,我们可以将客户端请求转发到后端的 Node.js 应用程序。在项目根目录下创建一个名为 nginx.conf 的文件,并添加以下内容:

http {
  upstream backend {
    server app:3000;
  }

  server {
    listen 80;
    server_name localhost;

    location / {
      proxy_pass http://backend;
    }
  }
}

上述 Nginx 配置文件定义了一个反向代理规则,将客户端请求转发到名为 backend 的 upstream,该 upstream 配置了我们在 Docker Compose 文件中定义的服务名称和端口。

步骤五:更新 Docker Compose 文件

docker-compose.yml 文件中添加一个名为 nginx 的服务,并将 Nginx 配置文件挂载到容器中:

version: '3'
services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - '3000:3000'
  nginx:
    image: nginx
    ports:
      - '80:80'
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
    depends_on:
      - app