·运维与云·4 分钟阅读

Docker 部署 Node.js 生产服务:多阶段构建与安全基线

分享X微博

为什么个人站也值得容器化

  • 环境一致:本地 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 部署可平滑切换。

相关阅读

本站评论 (0)

  • 暂无评论,来说第一句吧。