You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Docker在单台VPS上部署多个Node.js API服务及独立MongoDB实例

单VPS托管多Node+Mongo应用落地方案

整体架构思路

你的场景用Docker Compose+Nginx完全可以满足需求,单配置文件就能实现一键启动,对新手友好的同时也能保证服务隔离性、安全性要求。

具体落地步骤

1. 目录结构建议

.
├── docker-compose.yml  # 统一服务配置文件,所有服务都在这管理
├── nginx.conf          # Nginx反向代理配置
├── app1/               # 第一个Node应用源码
│   └── Dockerfile
├── app2/               # 第二个Node应用源码
│   └── Dockerfile
└── app3/               # 第三个Node应用源码
    └── Dockerfile

2. docker-compose.yml 配置示例

所有服务都写在同一个文件中,通过自定义网络实现内网互通,数据库不对外暴露端口:

version: '3.8'

# 自定义隔离网络,只有同网络内的服务可以互相访问
networks:
  app-network:
    driver: bridge

# 每个MongoDB独立挂载存储卷,数据不会随容器删除丢失
volumes:
  mongo1-data:
  mongo2-data:
  mongo3-data:

services:
  # 第一个MongoDB实例
  mongo1:
    image: mongo:6.0
    restart: always
    volumes:
      - mongo1-data:/data/db
    environment:
      MONGO_INITDB_ROOT_USERNAME: mongo1_user
      MONGO_INITDB_ROOT_PASSWORD: 替换为自定义强密码1
    networks:
      - app-network

  # 第一个Node应用
  app1:
    build: ./app1
    restart: always
    environment:
      # 数据库连接直接用服务名访问,无需公网IP
      MONGO_URI: mongodb://mongo1_user:替换为自定义强密码1@mongo1:27017/mongo1_db?authSource=admin
      PORT: 3000
    depends_on:
      - mongo1
    networks:
      - app-network

  # 第二个MongoDB实例
  mongo2:
    image: mongo:6.0
    restart: always
    volumes:
      - mongo2-data:/data/db
    environment:
      MONGO_INITDB_ROOT_USERNAME: mongo2_user
      MONGO_INITDB_ROOT_PASSWORD: 替换为自定义强密码2
    networks:
      - app-network

  # 第二个Node应用
  app2:
    build: ./app2
    restart: always
    environment:
      MONGO_URI: mongodb://mongo2_user:替换为自定义强密码2@mongo2:27017/mongo2_db?authSource=admin
      PORT: 3000
    depends_on:
      - mongo2
    networks:
      - app-network

  # 第三个MongoDB实例
  mongo3:
    image: mongo:6.0
    restart: always
    volumes:
      - mongo3-data:/data/db
    environment:
      MONGO_INITDB_ROOT_USERNAME: mongo3_user
      MONGO_INITDB_ROOT_PASSWORD: 替换为自定义强密码3
    networks:
      - app-network

  # 第三个Node应用
  app3:
    build: ./app3
    restart: always
    environment:
      MONGO_URI: mongodb://mongo3_user:替换为自定义强密码3@mongo3:27017/mongo3_db?authSource=admin
      PORT: 3000
    depends_on:
      - mongo3
    networks:
      - app-network

  # Nginx反向代理,唯一对外暴露80/443端口
  nginx:
    image: nginx:alpine
    restart: always
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      # 后续申请SSL证书后可把证书目录也挂载到此处
    networks:
      - app-network
    depends_on:
      - app1
      - app2
      - app3

3. Nginx配置示例

按不同域名转发到对应Node应用:

events {}
http {
  server {
    listen 80;
    server_name app1.你的域名.com;
    location / {
      proxy_pass http://app1:3000;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
    }
  }

  server {
    listen 80;
    server_name app2.你的域名.com;
    location / {
      proxy_pass http://app2:3000;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
    }
  }

  server {
    listen 80;
    server_name app3.你的域名.com;
    location / {
      proxy_pass http://app3:3000;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
    }
  }
}

4. Node应用Dockerfile参考

FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install --production
COPY . .
CMD ["npm", "start"]

安全与运维注意事项

  • 所有MongoDB不要映射公网端口,仅同网络内的Node应用可访问,避免数据库暴露被攻击
  • 上线前申请SSL证书,把Nginx的80端口请求全部跳转到443,启用HTTPS访问
  • 一键启动直接在根目录执行 docker compose up -d 即可,所有服务会按依赖顺序启动;后续更新单个应用只需执行 docker compose up -d --build 对应应用名 即可
  • 数据备份可以定期执行 docker compose exec 对应Mongo服务名 mongodump -u 数据库用户名 -p 数据库密码 --out 备份目录 导出备份文件

可选优化思路

如果后续服务规模扩大,可以把每个应用的compose配置拆成独立文件,当前3个服务的场景用单个compose文件完全够用,维护成本更低。

内容的提问来源于stack exchange,提问作者headliner090

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 17:45:03