Docker本地部署SSR前端项目实战指南

 更新时间:2026年01月15日 09:49:36   作者:新节  
本文介绍了Docker本地部署SSR前端项目实战指南,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

这篇文档详细介绍如何将基于 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 Router:

yqzl/
├── 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.jsonpnpm-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 --from=deps /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 --from=builder /app/public ./public
COPY --from=builder /app/.next ./.next
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package.json ./package.json

EXPOSE 3000
CMD ["pnpm", "start"]

3.2 docker-compose.yml (编排与网络)

此文件定义了如何运行应用服务,特别是解决了容器连接宿主机数据库的问题。

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: yqzl-app
    ports:
      - "3000:3000"
    env_file:
      - .env
    environment:
      # 这里重写 MYSQL_HOST,使其指向宿主机
      # 在 Windows/Mac 的 Docker Desktop 中,host.docker.internal 指向宿主机
      - MYSQL_HOST=host.docker.internal
    extra_hosts:
      - "host.docker.internal:host-gateway"
    restart: always

networks:
  default:
    name: yqzl-network
  • host.docker.internal: 这是 Docker Desktop (Windows/Mac) 提供的特殊 DNS 名称,允许容器内部访问宿主机的网络服务 (如本地运行的 MySQL)。

3.3 next.config.ts (构建配置)

针对 Docker 环境,我们建议在构建时适当放宽检查,以避免因细微的 Lint 错误导致构建失败:

const nextConfig: NextConfig = {
  // ...
  eslint: {
    // 忽略构建时的 ESLint 错误,确保能够生成镜像
    ignoreDuringBuilds: true
  },
  typescript: {
    ignoreBuildErrors: true
  }
};

4. 为什么容器内不需要 Nginx?

在传统的 SPA (Single Page Application) 部署中,前端构建出的是静态 HTML/CSS/JS 文件,因此必须依赖 Nginx 或 Apache 这样的 Web Server 来提供文件服务。

但在 SSR (Next.js) 架构中,情况有所不同:

  1. Node.js 自带服务: Next.js 生产环境 (next start) 启动的是一个全功能的 Node.js HTTP 服务器。它不仅能处理 API 请求、服务端渲染动态页面,也能高效地托管 public 和 .next/static 中的静态资源。
  2. 架构解耦: 根据容器化的“单一职责原则”,应用容器应该只包含应用本身。
  3. 反向代理通常在外层: 如果需要 Nginx (用于 SSL 终止、负载均衡、gzip 压缩等),通常建议将其部署在容器外部 (作为宿主机服务或另一个独立的 Nginx 容器),作为整个系统的网关 (Gateway),而不是塞进应用容器里。

因此,直接在 Docker 中运行 pnpm start 是最简洁、高效且符合云原生理念的做法。

5. 部署步骤

  1. 准备环境:

    • 确保已安装 Docker Desktop for Windows
    • 确保本地 MySQL 服务已启动,且用户权限允许远程连接 (或至少允许 Docker 网段连接)。
  2. 配置环境:

    • 确保项目根目录存在 .env 文件,且包含正确的数据库凭证。
  3. 启动部署: 在项目根目录打开 PowerShell 或终端,运行:

    docker-compose up -d --build
    
    • -d: 后台运行。
    • --build: 强制重新构建镜像 (确保代码变更为最新)。
  4. 访问应用: 打开浏览器访问 http://localhost:3000

  5. 查看日志: 如果遇到问题,查看容器日志:

    docker-compose logs -f
    
  6. 停止服务:

    docker-compose down
    

到此这篇关于Docker本地部署SSR前端项目实战指南的文章就介绍到这了,更多相关Docker本地部署SSR项目 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Docker Desktop搭建RocketMQ的图文步骤

    Docker Desktop搭建RocketMQ的图文步骤

    RocketMQ支持发布/订阅模式和点对点模式,可以根据业务需求选择合适的消息模式,本文主要介绍了Docker Desktop搭建RocketMQ的图文步骤,感兴趣的可以了解一下
    2024-02-02
  • springboot整合docker部署实现两种构建Docker镜像方式

    springboot整合docker部署实现两种构建Docker镜像方式

    这篇文章主要介绍了springboot整合docker部署实现两种构建Docker镜像方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-04-04
  • docker(alpine+golang) 中 hosts 不生效问题解决方法

    docker(alpine+golang) 中 hosts 不生效问题解决方法

    这篇文章主要介绍了docker(alpine+golang) 中 hosts 不生效问题解决大全,本文给大家分享了三种解决方法,每种方法给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • Docker部署Nginx反向代理的坑与解决方案实战记录

    Docker部署Nginx反向代理的坑与解决方案实战记录

    这篇文章主要介绍了Docker部署Nginx反向代理的坑与解决方案的相关资料,通过本文的介绍,你可以掌握如何在Docker中部署Nginx作为反向代理,并解决了常见的报错问题,需要的朋友可以参考下
    2025-03-03
  • Docker使用Link在容器之间建立连接

    Docker使用Link在容器之间建立连接

    这篇文章主要介绍了Docker使用Link在容器之间建立连接的相关资料,需要的朋友可以参考下
    2016-10-10
  • docker容器因报错无法启动问题的检查及修复容器错误并重启

    docker容器因报错无法启动问题的检查及修复容器错误并重启

    随着容器技术的发展,现在很多的应用程序系统都会选择使用docker容器进行部署,下面这篇文章主要给大家介绍了关于docker容器因报错无法启动问题的检查及修复容器错误并重启的相关资料,需要的朋友可以参考下
    2023-03-03
  • docker中如何将jar包构建成镜像并执行

    docker中如何将jar包构建成镜像并执行

    这篇文章主要介绍了docker中如何将jar包构建成镜像并执行问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • docker搭建jenkins+maven代码构建部署平台

    docker搭建jenkins+maven代码构建部署平台

    本文主要介绍了docker搭建jenkins+maven代码构建部署平台,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-06-06
  • Docker-Compose搭建Spark集群的实现方法

    Docker-Compose搭建Spark集群的实现方法

    本文主要介绍了Docker-Compose搭建Spark集群的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • 使用Docker部署MySQL数据库的两种方法

    使用Docker部署MySQL数据库的两种方法

    在现代软件开发中,MySQL 是一种流行的关系数据库管理系统,因其可靠性和易用性受到广泛欢迎,通过 Docker,可以快速、便捷地部署和管理 MySQL 数据库实例,本文将介绍两种通过 Docker 部署 MySQL 的方法,需要的朋友可以参考下
    2024-10-10

最新评论