将 React SPA 和 Next.js 应用 Docker 化是生产部署的标准做法:它保证开发、测试、生产环境完全一致,支持一键部署到任何支持 Docker 的服务器。本文覆盖从开发热重载到生产 Nginx 反向代理的完整配置。
一、React SPA(Vite / CRA)的 Docker 化
1.1 Dockerfile
# 构建阶段
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# 运行阶段:Nginx 托管静态文件
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
1.2 Nginx 配置
server {
listen 80;
server_name localhost;
root /usr/share/nginx/html;
index index.html;
location / {
try_files $uri $uri/ /index.html; # SPA 路由回退
}
location /static/ {
expires 1y;
add_header Cache-Control "public, immutable";
}
}
1.3 docker-compose.yml
version: '3.8'
services:
web:
build: .
ports:
- "3000:80"
二、Next.js 的 Docker 化
2.1 next.config.js
module.exports = {
output: 'standalone',
};
2.2 Dockerfile
# 依赖安装
FROM node:20-alpine AS deps
RUN apk add --no-cache libc6-compat
WORKDIR /app
COPY package*.json ./
RUN npm ci
# 构建
FROM node:20-alpine AS builder
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
RUN npm run build
# 运行
FROM node:20-alpine AS runner
WORKDIR /app
ENV NODE_ENV production
EXPOSE 3000
ENV PORT 3000
RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nextjs
COPY --from=builder /app/public ./public
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
USER nextjs
CMD ["node", "server.js"]
2.3 带数据库的 docker-compose.yml
version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
environment:
DATABASE_URL: postgres://postgres:${DB_PASSWORD}@db:5432/myapp
depends_on:
- db
db:
image: postgres:15-alpine
volumes:
- postgres_data:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD: ${DB_PASSWORD}
volumes:
postgres_data:
三、开发 vs 生产配置
| 维度 | 开发 | 生产 |
|---|---|---|
| 构建命令 | next dev | next build |
| 热重载 | ✅ 开启 | ❌ 关闭 |
| 源码映射 | ✅ 开启 | ❌ 关闭 |
| 体积 | 大(含 dev deps) | 小(standalone) |
| Nginx | 不需要 | ✅ 推荐 |
| HTTPS | 不需要 | ✅ 必须 |
相关阅读
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。
「saas」更多文章
自定义域名接入 Cloudflare:CDN 加速与缓存规则配置实战
手把手讲解自定义域名接入 Cloudflare CDN 的完整流程:NS 接管、SSL/TLS 模式选择、橙云代理与灰云 DNS 的区别,并用 2024 年后的新 Cache Rules 引擎实战配置静态资源长缓存、HTML 不缓存、后台 Bypass,让边缘缓存命中率最大化。
Hugo 部署到 Cloudflare Pages 实战:从 Git 推送到全球边缘上线
详解 Cloudflare Pages 部署 Hugo 静态站的完整流程,涵盖框架预设、HUGO_VERSION 环境变量固定、构建命令、自定义域名、分支预览、_headers 缓存安全头配置及常见构建失败排查,一次推送即可全球边缘上线。
Cloudflare Workers 入门实战:在边缘运行你的第一行代码
一份面向初学者的 cloudflare workers 教程,从 V8 Isolate 运行时模型讲起,手把手演示 wrangler 初始化、路由分发、KV 存储、Cache API 缓存响应与环境变量配置,帮你在 30 分钟内部署第一个生产可用的边缘 Serverless 应用。