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

React+NodeJS+MongoDB项目Docker多环境配置:开发热重载与生产Nginx部署

Great question! This is a super common setup for full-stack React/Node/Mongo apps, and you absolutely can handle both dev hot-reloading and production Nginx deployment with a single Dockerfile and separate docker-compose configs. Let's break this down step by step:


1. Single Multi-Stage Dockerfile

We'll use multi-stage builds to support both environments from one file. This keeps our production images lean and avoids duplicating code. Save this as Dockerfile in your project root:

# Base Node image shared across all stages
FROM node:18-alpine AS base
WORKDIR /app
RUN apk add --no-cache bash

# ------------------------------
# Backend Dependency Install
# ------------------------------
FROM base AS backend-deps
WORKDIR /app/server
COPY server/package*.json ./
RUN npm ci

# ------------------------------
# Frontend Dependency Install
# ------------------------------
FROM base AS frontend-deps
WORKDIR /app/client
COPY client/package*.json ./
RUN npm ci

# ------------------------------
# Development Environment (Hot Reload)
# ------------------------------
FROM base AS development
ENV NODE_ENV=development
RUN npm install -g nodemon

# Copy pre-installed dependencies to avoid re-installing on every build
COPY --from=backend-deps /app/server/node_modules /app/server/node_modules
COPY --from=frontend-deps /app/client/node_modules /app/client/node_modules

# Copy full project code (will be overridden by docker-compose volumes)
COPY . .

EXPOSE 3000 5000

# ------------------------------
# Production Backend
# ------------------------------
FROM backend-deps AS backend-prod
ENV NODE_ENV=production
WORKDIR /app/server
COPY server/ .
EXPOSE 5000
CMD ["node", "server.js"]

# ------------------------------
# Production Frontend + Nginx
# ------------------------------
FROM frontend-deps AS frontend-build
WORKDIR /app/client
COPY client/ .
RUN npm run build

FROM nginx:alpine AS production
# Copy built React app to Nginx's static directory
COPY --from=frontend-build /app/client/build /usr/share/nginx/html
# Custom Nginx config for SPA routing and API proxy
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

2. Docker Compose for Development (Hot Reload)

Create docker-compose.dev.yml to enable live code sync and hot reloading. We'll mount local code directories into containers so changes reflect instantly:

version: '3.8'

services:
  mongodb:
    image: mongo:latest
    container_name: mongodb-dev
    ports:
      - "27017:27017"
    volumes:
      - mongodb-data-dev:/data/db
    environment:
      MONGO_INITDB_ROOT_USERNAME: dev-admin
      MONGO_INITDB_ROOT_PASSWORD: dev-pass

  backend:
    build:
      context: .
      target: development
    container_name: backend-dev
    volumes:
      # Mount local backend code to container (hot reload)
      - ./server:/app/server
      # Keep container's node_modules (avoid overwriting with local)
      - /app/server/node_modules
    ports:
      - "5000:5000"
    environment:
      NODE_ENV: development
      MONGO_URI: mongodb://dev-admin:dev-pass@mongodb:27017/dev-db?authSource=admin
    depends_on:
      - mongodb
    command: ["nodemon", "server.js"]

  frontend:
    build:
      context: .
      target: development
    container_name: frontend-dev
    volumes:
      # Mount local frontend code to container (hot reload)
      - ./client:/app/client
      # Keep container's node_modules
      - /app/client/node_modules
    ports:
      - "3000:3000"
    environment:
      NODE_ENV: development
      REACT_APP_API_URL: http://localhost:5000
    depends_on:
      - backend

volumes:
  mongodb-data-dev:

Key Dev Features:

  • Volumes: Mounts local server/ and client/ folders to containers, so code changes sync immediately.
  • Nodemon: Auto-restarts the Node backend when code changes.
  • React Dev Server: Uses npm start which includes built-in hot module replacement (HMR).

3. Docker Compose for Production (Nginx Deployment)

Create docker-compose.prod.yml for a production-ready setup with Nginx serving static files and proxying API requests:

First, create an nginx.conf file in your project root for routing:

server {
    listen 80;
    server_name localhost;

    # Serve React static files and handle SPA routing
    location / {
        root /usr/share/nginx/html;
        try_files $uri $uri/ /index.html;
    }

    # Proxy API requests to the backend service
    location /api/ {
        proxy_pass http://backend:5000/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

Now the production compose file:

version: '3.8'

services:
  mongodb:
    image: mongo:latest
    container_name: mongodb-prod
    volumes:
      - mongodb-data-prod:/data/db
    environment:
      MONGO_INITDB_ROOT_USERNAME: prod-admin
      MONGO_INITDB_ROOT_PASSWORD: prod-pass
    restart: unless-stopped

  backend:
    build:
      context: .
      target: backend-prod
    container_name: backend-prod
    environment:
      NODE_ENV: production
      MONGO_URI: mongodb://prod-admin:prod-pass@mongodb:27017/prod-db?authSource=admin
    depends_on:
      - mongodb
    restart: unless-stopped

  nginx:
    build:
      context: .
      target: production
    container_name: nginx-prod
    ports:
      - "80:80"
    depends_on:
      - backend
    restart: unless-stopped

volumes:
  mongodb-data-prod:

Key Production Features:

  • Lean Images: Production stages exclude development dependencies, keeping image sizes small.
  • Nginx: Serves static React files and proxies /api requests to the Node backend.
  • Restart Policies: Ensures services auto-restart if they crash.
  • No Exposed Backend Port: The backend is only accessible via Nginx, improving security.

4. How to Use
  • Start Development Environment:

    docker-compose -f docker-compose.dev.yml up --build
    

    Make changes to your React or Node code—you'll see the dev server auto-reload instantly.

  • Start Production Environment:

    docker-compose -f docker-compose.prod.yml up --build -d
    

    This builds the production images, starts all services in the background, and makes your app accessible at http://localhost.


Quick Notes:

  • Ensure your Node backend listens on 0.0.0.0 (not localhost) so it's accessible from other containers.
  • In your React app, use the REACT_APP_API_URL environment variable for API calls—this will point to http://localhost:5000 in dev and /api in production (thanks to Nginx proxying).
  • Adjust ports, database credentials, and API paths to match your project's setup.

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 10:07:56