Docker打包并部署Next.js

前言

前一段时间公司需要快速开发一个AI项目,所以就不需要后端介入,让我们直接Next.jsORM写出来。这样确实不错,不用对接口,要什么你自己写,大大提升开发效率。

开发好了就需要部署,我就试了试。

跟传统的Web项目有点不一样。传统的 Web 项目在打包部署时,通常会将项目构建(build)生成的静态文件复制到一个 Nginx 容器中。该容器将自身 80 端口映射到宿主机的一个端口,然后宿主机上的 Nginx 实例通过反向代理将外部流量转发到这个宿主机端口,这样用户就可以通过网址来访问了。

Next.js 项目打包后,通常会将 build 阶段生成的 .next 文件夹、public 文件夹以及 package.json 等文件,一起复制到 Node.js 环境的容器中。接着,在容器内执行 npm run start 命令来启动应用。最后,将容器的启动端口(默认是 3000)映射到宿主机的一个端口,并利用宿主机上的 Nginx 实例作为反向代理,将外部流量转发到这个映射的宿主机端口。这样用户就可以通过网址来访问了。

正文

主要的有三个文件 .dockerignoreDockerfiledocker-compose.yml。在跟目录下传教这个三个文件

.dockerignore文件

.dockerignore 复制代码
.git
.gitignore
node_modules
.next
README.md
Dockerfile
.dockerignore

Dockerfile文件

sh 复制代码
FROM node:20-alpine as builder

WORKDIR /app

#复制package.json文件 和 pnpm-lock.yaml文件
COPY package.json pnpm-lock.yaml ./

RUN npm install -g pnpm

RUN npm config set registry https://registry.npmmirror.com/

#安装依赖
RUN --mount=type=cache,target=/root/.pnpm-store pnpm install

#复制项目文件
COPY . .

#构建项目
RUN pnpm run build

FROM node:20-alpine as runner

WORKDIR /app

RUN npm install -g pnpm

RUN npm config set registry https://registry.npmmirror.com/

ENV NODE_ENV=production

# 从builder复制package.json和lock文件
COPY --from=builder /app/package.json /app/pnpm-lock.yaml /app/.env.production /app/.env ./
# 复制 .next 文件夹
COPY --from=builder /app/.next ./.next
# 复制 public 文件夹
COPY --from=builder /app/public ./public
# 只安装生产依赖
RUN --mount=type=cache,target=/root/.pnpm-store pnpm install --prod

EXPOSE 3000

CMD ["pnpm", "start"]

docker-compose.yml文件

yml 复制代码
version: '3.8'

services:
  nextjs-app:
    build: .
    image: docker-next-app
    container_name: nextjs-app
    ports:
      - 3000:3000
    restart: always

最后,配置Nginx

.conf 复制代码
server {
    # 监听 80 端口,等待 HTTP 请求
    listen 80;
    # 你的域名
    server_name xxx.top;

    location / {
        # 将所有请求反向代理到 Next.js 应用
        # 这里的 3000 是你在 Docker Compose 文件中映射的宿主机端口
        proxy_pass http://localhost:3000;

        # 添加一些必要的请求头,以确保 Next.js 应用能正确处理请求
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

当你更新代码需要发版的时,只需要到服务器拉取项目代码,然后运行docker compose up -d --build。你嫌弃麻烦可以写一个脚本,这样只需要运行那个脚本就可以了。还可以用现成的部署工具可以看这篇文章 国产 Dev/Ops 工具 Jpom 的前端项目自动化部署实践,只要点击一下按钮就可以了。

结语

感兴趣的可以去试试

相关推荐
AI服务老曹7 分钟前
解耦异构算力:基于 Docker 与 GB28181/RTSP 的边缘计算 AI 视频管理平台架构设计与源码交付实践
人工智能·docker·边缘计算
weixin_4684668519 分钟前
Prometheus监控服务部署与实战指南
服务器·后端·python·docker·自动化·prometheus
Larcher1 小时前
JS 变量提升:代码没动,为什么执行顺序就变了?
前端·javascript·前端框架
yingyima1 小时前
MySQL 事件调度器速查:核心语法与实战代码
前端
GISer_Jing1 小时前
Claude Code多Agent架构深度剖析
前端·人工智能·架构·自动化
comphub1 小时前
comp-hub:让你的 Vue 业务组件真正"活"起来
前端
AI砖家1 小时前
Claude Code 跳过确认完全指南:让 AI 自己完成开发任务
前端·人工智能·python·ai编程·代码规范
KaMeidebaby2 小时前
卡梅德生物技术快报|Pull Down 实验在 lncRNA - 蛋白互作机制研究中的应用实例解析
大数据·前端·架构·spark·新浪微博
锋行天下2 小时前
让nginx网关扛下所有攻击
前端·后端·nginx