Docker 部署 Node.js 生产服务:多阶段构建与安全基线
为什么个人站也值得容器化
- 环境一致:本地
docker build与腾讯云一致 - 回滚简单:保留上一版镜像 tag
- 与 PM2 共存:可先容器试跑,再决定是否全面迁移
多阶段 Dockerfile(Next.js standalone)
# syntax=docker/dockerfile:1
FROM node:20-alpine AS deps
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci
FROM node:20-alpine AS builder
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
ENV NEXT_TELEMETRY_DISABLED=1
RUN npm run build
FROM node:20-alpine AS runner
WORKDIR /app
ENV NODE_ENV=production
RUN addgroup -S nodejs && adduser -S nextjs -G nodejs
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
EXPOSE 3000
HEALTHCHECK --interval=30s --timeout=3s \
CMD wget -qO- http://127.0.0.1:3000/ || exit 1
CMD ["node", "server.js"]
next.config 需开启:
/** @type {import('next').NextConfig} */
const nextConfig = { output: "standalone" };
module.exports = nextConfig;
.dockerignore 必写
node_modules
.next
.git
.env*
README.md
否则构建上下文巨大、且可能把密钥打进镜像层。
运行与资源限制
docker build -t zhubook:latest .
docker run -d --name zhubook -p 3000:3000 \
--memory=512m --cpus=1 \
--restart unless-stopped \
-e ADMIN_PASSWORD=*** \
zhubook:latest
轻量服务器 2C2G 建议 内存上限 512MB~768MB,避免 OOM 拖垮整机。
与 Nginx 反代
容器只监听 3000,宿主机 Nginx:
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
备案后加 Certbot 或腾讯云 SSL 即可上 HTTPS。
小结
生产镜像目标:小、非 root、可探测、无密钥在层里。多阶段 + standalone 是 Next.js 官方推荐路径,与当前 ZhuBook 的 PM2 部署可平滑切换。
相关阅读
- 备案期间的开发与部署指南2026-05-19
- PM2 + Nginx 部署 Next.js:从构建到开机自启2026-05-13
- Node.js API 的 JWT 认证:签发、校验与安全清单2026-05-14
本站评论 (0)
- 暂无评论,来说第一句吧。