将 React/Next.js 应用容器化
为 Next.js 应用编写多阶段 Dockerfile,并使用 Docker Compose 在本地运行。
将 React/Next.js 应用容器化 是 CoddyKit 上的免费 React Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 React Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 React Academy 课程共包含 4 节课。
为什么使用 Docker
Docker 容器会将应用及其依赖打包在一起,确保应用在开发、预发布和生产环境中的行为一致。同一个镜像可以在任何地方运行。
用于基础 React SPA 的 Dockerfile
两阶段构建:使用 Node.js 进行构建,使用 Nginx 提供静态构建产物。
# Stage 1: Build
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# Stage 2: Serve with 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;"]SPA 路由的 Nginx 配置
配置 Nginx 为所有路由提供 index.html(支持客户端路由)。
# nginx.conf
server {
listen 80;
root /usr/share/nginx/html;
index index.html;
location / {
try_files $uri $uri/ /index.html; # SPA routing
}
location ~* \.(js|css|png|jpg|woff2)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
}Next.js 独立模式 Dockerfile
Next.js 12+ 支持 output: 'standalone',它只会复制所需文件,从而生成精简的生产镜像。
// next.config.js
module.exports = { output: 'standalone' };
# Dockerfile (Next.js standalone)
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM node:20-alpine AS runner
WORKDIR /app
ENV NODE_ENV=production
COPY --from=builder /app/.next/standalone ./
COPY --from=builder /app/.next/static ./.next/static
COPY --from=builder /app/public ./public
EXPOSE 3000
CMD ["node", "server.js"].dockerignore
从 Docker 构建上下文中排除不必要的文件,以加快构建速度并减小镜像大小。
node_modules
.next
dist
.env*
.git
README.md
*.test.ts构建与运行
构建镜像并在本地运行。
# Build:
docker build -t my-next-app .
# Run:
docker run -p 3000:3000 -e DATABASE_URL=postgres://... my-next-app
# Check size:
docker images my-next-app用于本地开发的 Docker Compose
使用 Docker Compose 通过一条命令让应用与其依赖项(数据库、Redis)一起运行。
# docker-compose.yml
services:
web:
build: .
ports: ['3000:3000']
environment:
DATABASE_URL: postgresql://postgres:password@db:5432/myapp
depends_on: [db]
db:
image: postgres:16-alpine
environment:
POSTGRES_PASSWORD: password
POSTGRES_DB: myapp
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:健康检查
在 Dockerfile 中添加健康检查,以便编排器知道容器何时已准备就绪。
HEALTHCHECK --interval=30s --timeout=3s \
CMD curl -f http://localhost:3000/api/health || exit 1运行时环境变量
在 docker run 时传入环境变量,或通过 --env-file 传入。切勿将密钥打包进镜像。
docker run -p 3000:3000 \
--env-file .env.production \
my-next-app多平台构建
使用 Docker Buildx 为多种 CPU 架构构建镜像(M1 Mac 和云虚拟机使用 ARM64,大多数服务器使用 AMD64)。
docker buildx build \
--platform linux/amd64,linux/arm64 \
-t myregistry/my-next-app:latest \
--push .快速检查
对 React/Next.js 应用使用多阶段 Docker 构建有什么好处?
回顾
使用多阶段 Dockerfile:使用 Node.js 构建,使用 Nginx 或 node:alpine 提供服务。在 Next.js 配置中添加 output: 'standalone' 以生成精简镜像。在本地开发中使用 Docker Compose,在运行时通过环境变量传入密钥,并使用 Buildx 构建多平台镜像,以兼容 ARM 和 AMD64。
常见问题解答
「将 React/Next.js 应用容器化」课时是免费的吗?
是的 — 「将 React/Next.js 应用容器化」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 React Academy 课程的其余内容,请升级到 CoddyKit PRO。 React Academy 课程共包含 4 节课。
「将 React/Next.js 应用容器化」这节课中我会学到什么?
为 Next.js 应用编写多阶段 Dockerfile,并使用 Docker Compose 在本地运行。 你通过在浏览器中直接运行的动手代码来练习 React Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 React Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 React Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「将 React/Next.js 应用容器化」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 React Academy 课中编写并运行代码吗?
能。每节 React Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 部署到 Vercel:零配置与预览 URL
- 在 AWS S3 与 CloudFront 上托管 React SPA
- 将 React/Next.js 应用容器化
- React 的 GitHub Actions CI/CD