运行 一个 VPS 上的多个节点服务器(API's)使用 docker

Run multiple node servers (API's) on one VPS using docker

我在 devops 主题方面经验不足,我必须在未来几天内从 heroku 迁移到 VPS。

我在 heroku 上有 3 个 nodejs 应用 运行ning,我需要使用 docker 迁移到 VPS。在一台机器上托管并安全 运行 多个应用程序的最佳方法是什么?我已经阅读了一些关于 docker compose 和 nginx 的内容,但我不清楚如何使用 3 节点服务器来处理这个问题,这些服务器都需要自己的 mongoDB。

有没有办法在一个文件中设置所有应用程序并同时启动它们,或者最好的方法是什么?

您可以使用 Docker Compose 轻松创建多个应用程序,这些应用程序可以通过内部网络 DNS 通过容器名称相互连接。

有很多方法可以做到。如果你有三个小应用程序,每个都有自己的 MongoDB 实例,你可以 运行 它们都在一个组合中,或者在三个不同的组合中。

version: "3.9"
services:
  nodejs-1:
    image: your-app-1
    ports:
      - "81:80"
    environment:
      - database: db-1:27017
  db-1:
    image: mongodb

  nodejs-2:
    image: your-app-2
    ports:
      - "82:80"
    environment:
      - database: db-2:27017
  db-2:
    image: mongodb

  nodejs-3:
    image: your-app-3
    ports:
      - "83:80"
    environment:
      - database: db-3:27017
  db-3:
    image: mongodb

使用此方法,三个应用程序和三个数据库将 运行 在一个网络上。如果你想隔离它们,你可以把它分成三个不同的 docker-compose 文件。然后为每个创建一个专用网络。我添加了一个示例“数据库”环境变量,您的应用程序可以从中获取数据库 DNS 名称,但显然这会因您的应用程序配置而异。

如果你 运行 作为一个大网络并将流量路由到你的 node.js 实例而不直接暴露端口(80:80 等),你可以使用单个 Nginx 实例扩展它而是打开 Nginx 实例的端口。

本指南有助于使用 Docker Compose 设置反向代理。 https://www.domysee.com/blogposts/reverse-proxy-nginx-docker-compose

我认为这在很大程度上取决于您对这些 API 的预期负载类型以及您对可用性的预期。一些更重要的事情需要考虑;这些 api 是如何相互关联的,如果其他服务中的一项或两项不可用,您是否希望它们中的每一个都失败,等等。由于未指定这些内容,我将尝试回答简单的场景。

如果它是一个宠物项目并且没有要求它具有高可用性或 API 上的重负载(并且您正在努力将成本降至最低)

这个案例很简单。使用 docker-compose 在单个 VPS 上部署所有三个 API 及其各自的 mongodb 实例。设置会相当简单,您将在一个 VPS 上放置 6 个 docker 个容器 运行ning。每个 nodejs 启动都必须等待各自的 mongodb 服务启动,但这可以通过类似 wait-for-it script.

的东西很容易地实现。

要在单个端口上提供这些服务,您应该使用 nginx 作为反向代理。 Nginx 可以 运行 作为 VPS 本身的服务,或者为了可移植性,您也可以将 nginx 作为 docker-compose 的一部分。这将允许您将来在任何 VPS 上移植 docker-compose 文件,并使用单个命令启动整个环境。以下是您的 docker-compose 使用 3 个节点 API、3 个 mongodb 服务和 nginx 时的样子;

services:
  node-api1:
    image: node-api1
  environment:
    MONGO_HOST: api1-db
    ...

  node-api2:
    image: node-api2
  environment:
    MONGO_HOST: api2-db
    ...

  node-api3:
    image: node-api3
  environment:
    MONGO_HOST: api3-db
    ...

  api1-db:
    image: mongo
  environment:
      ...

  api2-db:
    image: mongo
  environment:
      ...

  api3-db:
    image: mongo
  environment:
      ...

  nginx:
    image: nginx:alpine
  ports:
    - 80:80
  volumes:
    - ./nginx.conf:/etc/nginx/nginx.conf

所有三个 mongo 和节点服务都将在一个 docker 网络上,并且能够使用它们的服务名称作为主机名相互通信,而不必与任何 hostname/ip地址。这再次使可移植性变得更加容易。唯一公开的端口是通过 nginx 的端口 80,您的反向代理的 nginx.conf 将如下所示;

http {

    sendfile on;

    upstream docker-node-api1 {
      server node-api1:3000;
    }
    upstream docker-node-api2 {
      server node-api2:3000;
    }
    upstream docker-node-api3 {
      server node-api3:3000;
    }

    server {
        listen 80;

        location /api1/ {
            proxy_pass         http://docker-node-api1;
            proxy_redirect     off;
            proxy_set_header   Host $host:$server_port;
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header   X-Forwarded-Host $server_name;
        }

        location /api2/ {
            proxy_pass         http://docker-node-api2;
            proxy_redirect     off;
            proxy_set_header   Host $host:$server_port;
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header   X-Forwarded-Host $server_name;
        }

        location /api3/ {
            proxy_pass         http://docker-node-api3;
            proxy_redirect     off;
            proxy_set_header   Host $host:$server_port;
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header   X-Forwarded-Host $server_name;
        }
    }

}

当然,这是非常简单的配置,在阅读了 nginx 反向代理设置后,您将不得不对它进行更多配置,但它应该能让您大致了解。如果您需要将部署移动到不同的机器,只需复制 docker-compose 和 nginx 配置即可。

因为您只从 vps 公开一个入口点端口,所以如果您需要设置 SSL,那么麻烦会少很多。您将在 nginx 级别终止 SSL,并且从 api 到 api 和 api 到 mongo 的所有内部流量都将是非 ssl。