如何使用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
相关产品推荐
相关产品推荐

