Docker 本地部署 SSR 前端项目实战指南
文章目录1. 项目技术栈2. 项目目录结构3. 核心配置文件详解3.1 Dockerfile (多阶段构建)3.2 docker-compose.yml (编排与网络)3.3 next.config.ts (构建配置)4. 为什么容器内不需要 Nginx5. 部署步骤这篇文档详细介绍如何将基于 Next.js 的银企直连前置机管理系统(我本地的项目)容器化并在本地使用Docker进行部署。1. 项目技术栈本项目采用现代化的 SSR (服务端渲染) 架构主要技术栈如下核心框架: Next.js 15 (App Router 架构) - 提供服务端渲染、API 路由和文件系统路由。前端库: React 18 - 构建用户界面。UI 组件库: Ant Design 5 - 企业级 React 组件库。样式方案: Tailwind CSS 4 Sass - 原子化 CSS 与预处理器结合。数据库交互: MySQL2 - Node.js 的 MySQL 驱动。认证方案: NextAuth.js - 完整的身份验证解决方案。包管理工具: pnpm - 高效的包管理器。注意数据库用的是我本地安装的MySQL里面已有数据省略了数据库相关的建库和建表。2. 项目目录结构项目的核心结构基于 Next.js App Routeryqzl/ ├── app/ # 应用主入口 (App Router) │ ├── api/ # 后端 API 接口定义 │ ├── auth/ # 认证相关页面 │ ├── components/ # 公共组件 (Sidebar, ConditionalLayout 等) │ ├── dashboard/ # 仪表盘页面 │ ├── documents/ # 文档管理模块 │ └── lib/ # 核心工具库 (如 mysql 数据库连接) ├── public/ # 静态资源 ├── types/ # TypeScript 类型定义 ├── Dockerfile # Docker 构建描述文件 ├── docker-compose.yml # 容器编排配置 ├── next.config.ts # Next.js 配置文件 └── .env # 环境变量 (敏感信息)3. 核心配置文件详解3.1 Dockerfile (多阶段构建)为了优化镜像体积和构建效率我们使用了 Docker 的多阶段构建 (Multi-stage build) 功能。Stage 1: deps: 仅复制package.json和pnpm-lock.yaml并安装依赖。利用 Docker 缓存层只要依赖不变此阶段会被缓存。Stage 2: builder: 复制源码并运行pnpm build进行编译。Stage 3: runner: 生产运行环境。基于node:20-alpine仅复制构建产物 (.next文件夹、public文件夹) 和必要的node_modules。dockerfile 完整配置:# 1. 基础镜像 FROM node:20-alpine AS base RUN npm install -g pnpm # 2. 依赖安装阶段 FROM base AS deps WORKDIR /app COPY package.json pnpm-lock.yaml ./ RUN pnpm install --frozen-lockfile # 3. 编译构建阶段 FROM base AS builder WORKDIR /app COPY --fromdeps /app/node_modules ./node_modules COPY . . # 提示如果 build 报错记得在 next.config.ts 中暂时关闭 ESLint 检查 RUN pnpm build # 4. 运行阶段 FROM base AS runner WORKDIR /app ENV NODE_ENV production # 关键配置允许从外部访问容器内的 3000 端口 ENV HOSTNAME 0.0.0.0 COPY --frombuilder /app/public ./public COPY --frombuilder /app/.next ./.next COPY --frombuilder /app/node_modules ./node_modules COPY --frombuilder /app/package.json ./package.json EXPOSE 3000 CMD [pnpm, start]3.2 docker-compose.yml (编排与网络)此文件定义了如何运行应用服务特别是解决了容器连接宿主机数据库的问题。services:app:build:context:.dockerfile:Dockerfilecontainer_name:yqzl-appports:-3000:3000env_file:-.envenvironment:# 这里重写 MYSQL_HOST使其指向宿主机# 在 Windows/Mac 的 Docker Desktop 中host.docker.internal 指向宿主机-MYSQL_HOSThost.docker.internalextra_hosts:-host.docker.internal:host-gatewayrestart:alwaysnetworks:default:name:yqzl-networkhost.docker.internal: 这是 Docker Desktop (Windows/Mac) 提供的特殊 DNS 名称允许容器内部访问宿主机的网络服务 (如本地运行的 MySQL)。3.3 next.config.ts (构建配置)针对 Docker 环境我们建议在构建时适当放宽检查以避免因细微的 Lint 错误导致构建失败constnextConfig:NextConfig{// ...eslint:{// 忽略构建时的 ESLint 错误确保能够生成镜像ignoreDuringBuilds:true},typescript:{ignoreBuildErrors:true}};4. 为什么容器内不需要 Nginx在传统的SPA (Single Page Application)部署中前端构建出的是静态HTML/CSS/JS文件因此必须依赖Nginx 或 Apache这样的Web Server来提供文件服务。但在SSR (Next.js)架构中情况有所不同Node.js 自带服务: Next.js 生产环境 (next start) 启动的是一个全功能的 Node.js HTTP 服务器。它不仅能处理 API 请求、服务端渲染动态页面也能高效地托管public和.next/static中的静态资源。架构解耦: 根据容器化的“单一职责原则”应用容器应该只包含应用本身。反向代理通常在外层: 如果需要 Nginx (用于 SSL 终止、负载均衡、gzip 压缩等)通常建议将其部署在容器外部(作为宿主机服务或另一个独立的 Nginx 容器)作为整个系统的网关 (Gateway)而不是塞进应用容器里。因此直接在 Docker 中运行pnpm start是最简洁、高效且符合云原生理念的做法。5. 部署步骤准备环境:确保已安装 Docker Desktop for Windows。确保本地 MySQL 服务已启动且用户权限允许远程连接 (或至少允许 Docker 网段连接)。配置环境:确保项目根目录存在.env文件且包含正确的数据库凭证。启动部署: 在项目根目录打开 PowerShell 或终端运行docker-compose up-d--build-d: 后台运行。--build: 强制重新构建镜像 (确保代码变更为最新)。访问应用: 打开浏览器访问http://localhost:3000。查看日志: 如果遇到问题查看容器日志docker-compose logs-f停止服务:docker-compose down 感谢阅读想了解更多 我的博客网站 | 记录思考分享干货 我的个人主页 | 关于我、开源项目

相关新闻

Flexsim中AGV锁死问题的根源分析与四大解决策略

Flexsim中AGV锁死问题的根源分析与四大解决策略

1. 项目概述:当AGV在Flexsim中“卡住不动”时如果你刚开始用Flexsim做物流仿真,特别是涉及到AGV(自动导引车)的模型,那么“锁死”或“死锁”这个问题,你大概率很快就会遇到。想象一下这个场景:你…

2026/8/26 13:05:22 阅读更多 →
nginx - 开启 gzip 压缩

nginx - 开启 gzip 压缩

文章目录一、 服务器端开启 Gzip 压缩二、 客户端开启 Gzip 压缩(也需要配置 nginx)三、总结1️. vite-plugin-compression 的作用2️. Nginx Gzip 压缩与插件的区别3️. 实际项目选择建议四、常见问题1️. Nginx 配置作用域规则2. gzip_static on; 的作…

2026/8/25 10:20:42 阅读更多 →
量化交易策略回测实战:从事件驱动架构到OpenClaw应用避坑指南

量化交易策略回测实战:从事件驱动架构到OpenClaw应用避坑指南

1. 项目概述:从“龙虾炒股”到策略回测的实战路径最近在和一些做量化交易的朋友交流时,经常听到“openclaw龙虾炒股”这个工具。很多刚入门的朋友,包括我自己最初接触时,都有个共同的困惑:策略代码写出来了&#xff0c…

2026/8/25 10:20:42 阅读更多 →

最新新闻

脑信号重建图像:从神经解码到生成模型的技术解析

脑信号重建图像:从神经解码到生成模型的技术解析

最近这几轮“大脑信号重建图像”的报道,很容易被标题拉扯到一个过度浪漫的位置。尤其是“Reading Minds Almost”这种说法,看的人会以为机器已经能像摄像机一样读取脑海里的画面。实际上,研究者面对的并不是一段段清晰的“脑内视频”&#xf…

2026/8/26 13:38:10 阅读更多 →
用 MCP Server 将错误信息变成知识接口,让大模型排错有据可依

用 MCP Server 将错误信息变成知识接口,让大模型排错有据可依

调试模型接口的时候,最让人烦躁的往往不是报错本身,而是报错之后那段“无效沟通”。你把 this models maximum context length is 1048576 tokens 这段错误贴给 AI 助手,它大概率会回一句“请减少输入内容”。这个回答没错,但等…

2026/8/26 13:38:10 阅读更多 →
Python实现 K-Means聚类(jupyter notebook)

Python实现 K-Means聚类(jupyter notebook)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/8/26 13:38:10 阅读更多 →
「干货分享」DevExpress常用控件——RichEditControl使用指南

「干货分享」DevExpress常用控件——RichEditControl使用指南

做WinForms的一般都知道,传统.NET界面有一个RichTextBox控件,这个是一个富文本控件,可以存储图片文字等内容,它有自己的文件格式RTF,在DevExpress控件组里面也有一个同等的控件,他的名字是RichEditControl&…

2026/8/26 13:38:10 阅读更多 →
基于MCP Server构建AI可查询的错误知识库:从协议到实践

基于MCP Server构建AI可查询的错误知识库:从协议到实践

把一段崩溃日志直接扔给大模型,它往往会回你一句“这可能是网络问题”——这个场景,很多开发者已经熟悉到麻木。原因倒也不难理解:大模型不是一个精确的检索系统,它对具体异常的理解来自训练数据里的概率分布,而不是你…

2026/8/26 13:38:10 阅读更多 →
DesktopAudio:macOS系统音频内录工具详解与实战

DesktopAudio:macOS系统音频内录工具详解与实战

这次我们来看一个 macOS 上的实用小工具:DesktopAudio。从名字就能看出来,它解决的是 Mac 用户长期以来的一个痛点——录制系统内部播放的声音。很多场景下我们需要把 Mac 正在播放的音频完整录下来,但 macOS 没有像 Windows 那样直接提供“立…

2026/8/26 13:37:08 阅读更多 →

日新闻

Python random 模块常用函数详解:从入门到实战

Python random 模块常用函数详解:从入门到实战

目录 1. 引言2. 准备工作3. 基础随机函数4. 序列相关函数5. 随机种子与复现6. 实战案例7. 注意事项8. 常见问题与排查9. 总结 1. 引言 摘要: 本文系统介绍 Python 标准库 random 模块中最常用的随机数生成函数。内容涵盖基础随机函数(random()、unifor…

2026/8/26 0:00:40 阅读更多 →
《Microsoft Sql server 2008 Internals》读书笔记--第三章Databases and Database Files(2)

《Microsoft Sql server 2008 Internals》读书笔记--第三章Databases and Database Files(2)

《Microsoft Sql server 2008 Internals》索引目录: 《Microsoft Sql server 2008 Internals》读书笔记--目录索引 在上篇文章中,主要介绍了创建数据库的基本语法和FileGroup的初步知识。需要注意的是: 关于FileGroup 如果你的系统是用Raid设备直接存…

2026/8/26 1:18:18 阅读更多 →
政务AI智能体怎么建?三种模式、三步路径与四个误区

政务AI智能体怎么建?三种模式、三步路径与四个误区

政务AI智能体已经从概念试点阶段,转入了政务服务的常态化落地应用;在实际使用过程中,它能自主理解办事需求、辅助完成填报申报、开展材料预审,并联动多个系统协同作业,真正嵌入到政务办理的全流程当中。但在落地推进过…

2026/8/26 1:18:18 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/25 3:38:12 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/25 3:38:18 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/25 3:38:23 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/26 3:50:20 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/25 10:31:12 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/26 1:24:05 阅读更多 →