运行 一个 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。
我在 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。