Docker 本地部署 CSR 前端项目完整指南

文章目录

    • 一、前言
    • [二、为什么使用 Docker 部署前端项目](#二、为什么使用 Docker 部署前端项目)
    • 三、准备工作
      • [3.1 安装 Docker Desktop](#3.1 安装 Docker Desktop)
      • [3.2 配置 Docker 镜像加速器(可选但推荐)](#3.2 配置 Docker 镜像加速器(可选但推荐))
    • 四、项目结构和配置文件详解
      • [4.1 Dockerfile](#4.1 Dockerfile)
      • [4.2 nginx.conf](#4.2 nginx.conf)
      • [4.3 docker-compose.yml](#4.3 docker-compose.yml)
      • [4.4 .dockerignore](#4.4 .dockerignore)
    • 五、部署步骤
      • [方法一:使用 Docker Compose(推荐)](#方法一:使用 Docker Compose(推荐))
        • [1. 进入项目目录](#1. 进入项目目录)
        • [2. 构建并启动容器](#2. 构建并启动容器)
        • [3. 验证部署](#3. 验证部署)
        • [4. 访问应用](#4. 访问应用)
        • [5. 停止容器](#5. 停止容器)
      • [方法二:使用 Docker 命令](#方法二:使用 Docker 命令)
        • [1. 构建镜像](#1. 构建镜像)
        • [2. 运行容器](#2. 运行容器)
        • [3. 管理容器](#3. 管理容器)
    • 六、常见问题与解决方案
      • [问题 1:无法连接到 Docker Hub](#问题 1:无法连接到 Docker Hub)
      • [问题 2:ESLint 配置文件找不到](#问题 2:ESLint 配置文件找不到)
      • [问题 3:端口被占用](#问题 3:端口被占用)
      • [问题 4:容器启动后无法访问](#问题 4:容器启动后无法访问)
      • [问题 5:修改代码后不生效](#问题 5:修改代码后不生效)
    • 七、容器管理最佳实践
    • 八、监控和日志

本文将详细介绍如何使用 Docker 在本地部署一个基于 Vue3 + Vite 的客户端渲染(CSR)前端项目,包括完整的配置文件、部署流程和常见问题解决方案。

一、前言

在现代前端开发中,Docker 已经成为项目部署的标准工具之一。通过 Docker,我们可以将前端应用及其运行环境打包成一个独立的容器,实现"一次构建,到处运行"的目标。本文将以一个 Vue3 项目为例,详细介绍如何使用 Docker 进行本地部署。

本项目使用的技术栈:

  • 前端框架:Vue 3.4.21
  • 构建工具:Vite 5.2.0
  • UI 框架:Element Plus 2.5.3
  • 包管理器:pnpm 10.7.0
  • 容器化:Docker + Docker Compose
  • Web 服务器:Nginx (Alpine)

二、为什么使用 Docker 部署前端项目

优势

  1. 环境一致性:开发、测试、生产环境完全一致,避免"在我机器上能跑"的问题
  2. 快速部署:一条命令即可完成部署,无需手动配置 Nginx
  3. 易于维护:配置文件化,版本可控
  4. 资源隔离:容器之间相互独立,互不影响
  5. 易于扩展:可以轻松实现负载均衡和水平扩展

适用场景

  • 本地开发环境搭建
  • 团队协作开发
  • CI/CD 流程
  • 生产环境部署
  • 微服务架构

三、准备工作

3.1 安装 Docker Desktop

Windows 用户

验证安装

powershell 复制代码
docker --version
docker-compose --version

3.2 配置 Docker 镜像加速器(可选但推荐)

在中国大陆,访问 Docker Hub 可能较慢,建议配置国内镜像源。

打开 Docker Desktop → Settings → Docker Engine,添加以下配置:

json 复制代码
{
  "builder": {
    "gc": {
      "defaultKeepStorage": "20GB",
      "enabled": true
    }
  },
  "experimental": false,
  "registry-mirrors": ["https://docker.m.daocloud.io", "https://docker.1panel.live", "https://hub.rat.dev"]
}

如图所示:

点击 Apply & Restart 重启 Docker。

四、项目结构和配置文件详解

前端项目结构

主要添加:Dockerfile、docker-compose.yml、nginx.conf、.dockerignore文件

复制代码
vue3/
├── src/                    # 源代码目录
├── public/                 # 静态资源
├── dist/                   # 构建输出目录(自动生成)
├── node_modules/           # 依赖包
├── package.json            # 项目配置
├── vite.config.ts          # Vite 配置
├── Dockerfile              # Docker 镜像构建文件
├── docker-compose.yml      # Docker Compose 配置
├── nginx.conf              # Nginx 服务器配置
└── .dockerignore           # Docker 忽略文件

配置文件详解

4.1 Dockerfile

Dockerfile 采用多阶段构建策略,分为构建阶段和运行阶段,可以显著减小最终镜像体积。

dockerfile 复制代码
# 多阶段构建

# 第一阶段:构建应用
FROM node:18-alpine AS builder

# 设置工作目录
WORKDIR /app

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

# 安装 pnpm
RUN npm install -g pnpm@10.7.0

# 安装依赖
RUN pnpm install --frozen-lockfile

# 复制项目文件
COPY . .

# 构建项目
RUN pnpm run build

# 第二阶段:运行应用
FROM nginx:alpine

# 复制自定义 nginx 配置
COPY nginx.conf /etc/nginx/conf.d/default.conf

# 从构建阶段复制构建产物到 nginx 目录
COPY --from=builder /app/dist /usr/share/nginx/html/vue3

# 暴露端口
EXPOSE 80

# 启动 nginx
CMD ["nginx", "-g", "daemon off;"]

关键点解析

  1. 多阶段构建

    • 第一阶段使用 node:18-alpine 构建应用
    • 第二阶段使用 nginx:alpine 运行应用
    • 最终镜像只包含 Nginx 和静态文件,体积约 50-100MB
  2. 依赖安装优化

    • 先复制 package.json,利用 Docker 缓存机制
    • 使用 --frozen-lockfile 确保依赖版本一致
  3. 轻量级基础镜像

    • 使用 Alpine Linux,镜像体积更小

4.2 nginx.conf

Nginx 配置文件负责处理 HTTP 请求和静态文件服务。

nginx 复制代码
server {
    listen 80;
    server_name localhost;

    # 设置根目录
    root /usr/share/nginx/html;

    # 开启 gzip 压缩
    gzip on;
    gzip_vary on;
    gzip_min_length 1024;
    gzip_types text/plain text/css text/xml text/javascript
               application/x-javascript application/xml+rss
               application/javascript application/json;

    # 处理 /vue3/ 路径
    location /vue3/ {
        alias /usr/share/nginx/html/vue3/;
        try_files $uri $uri/ /vue3/index.html;

        # 设置缓存策略
        location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
            expires 1y;
            add_header Cache-Control "public, immutable";
        }
    }

    # 处理根路径,重定向到 /vue3/
    location = / {
        return 301 /vue3/;
    }

    # 错误页面
    error_page 404 /vue3/index.html;

    # 健康检查端点
    location /health {
        access_log off;
        return 200 "healthy\n";
        add_header Content-Type text/plain;
    }
}

配置亮点

  1. 支持 Vue Router History 模式

    • try_files $uri $uri/ /vue3/index.html 确保所有路由都指向 index.html
  2. Gzip 压缩

    • 减少传输数据量,提升加载速度
  3. 静态资源缓存

    • 对 JS、CSS、图片等资源设置 1 年缓存
    • 使用 immutable 标记,浏览器永不重新验证
  4. 健康检查端点

    • /health 端点用于监控服务状态

4.3 docker-compose.yml

Docker Compose 简化了容器的管理和编排。

yaml 复制代码
version: "3.8"

services:
  vue3-app:
    # 构建配置
    build:
      context: .
      dockerfile: Dockerfile

    # 容器名称
    container_name: vue3-app

    # 端口映射 (主机端口:容器端口)
    ports:
      - "8080:80"

    # 重启策略
    restart: unless-stopped

    # 环境变量(可选)
    environment:
      - NODE_ENV=production

    # 网络配置(可选)
    networks:
      - vue3-network

# 网络配置(可选)
networks:
  vue3-network:
    driver: bridge

配置说明

  • build: 指定 Dockerfile 位置
  • container_name: 自定义容器名称
  • ports: 将容器的 80 端口映射到主机的 8080 端口
  • restart: 容器退出时自动重启(除非手动停止)
  • networks: 创建独立网络,便于容器间通信

4.4 .dockerignore

排除不需要复制到镜像中的文件,减小镜像体积。

复制代码
node_modules
dist
.git
.gitignore
.vscode
*.md
*.log
.DS_Store
Thumbs.db

注意 :不要排除 .eslintrc.cjs.eslintignore,因为构建过程可能需要这些文件。

五、部署步骤

方法一:使用 Docker Compose(推荐)

这是最简单的方式,适合大多数场景。

1. 进入项目目录
powershell 复制代码
cd d:\MyProjects\vue3
2. 构建并启动容器
powershell 复制代码
docker-compose up -d --build

参数说明

  • up: 启动服务
  • -d: 后台运行(detached mode)
  • --build: 构建镜像

如图所示:


外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

部署成功!

3. 验证部署
powershell 复制代码
# 查看容器状态
docker ps

# 查看容器日志
docker-compose logs -f

# 健康检查
Invoke-WebRequest -Uri http://localhost:8080/health -UseBasicParsing

如图所示

4. 访问应用

打开浏览器访问:http://localhost:8080/vue3/

如图所示

5. 停止容器
powershell 复制代码
# 停止并删除容器
docker-compose down

# 只停止容器(不删除)
docker-compose stop

方法二:使用 Docker 命令

如果需要更细粒度的控制,可以使用原生 Docker 命令。

1. 构建镜像
powershell 复制代码
docker build -t vue3-app:latest .
2. 运行容器
powershell 复制代码
docker run -d -p 8080:80 --name vue3-app vue3-app:latest
3. 管理容器
powershell 复制代码
# 查看日志
docker logs -f vue3-app

# 停止容器
docker stop vue3-app

# 启动已停止的容器
docker start vue3-app

# 重启容器
docker restart vue3-app

# 删除容器
docker rm vue3-app

六、常见问题与解决方案

问题 1:无法连接到 Docker Hub

错误信息

复制代码
failed to fetch oauth token: Post "https://auth.docker.io/token": dial tcp 108.160.172.1:443: connectex

解决方案

配置国内镜像加速器(参见 #3.2 配置 Docker 镜像加速器)。

问题 2:ESLint 配置文件找不到

错误信息

复制代码
[vite-plugin-eslint] No ESLint configuration found in /app/src.

解决方案

.dockerignore 中移除 .eslintrc.cjs.eslintignore

diff 复制代码
node_modules
dist
.git
.gitignore
.vscode
-.eslintignore
-.eslintrc.cjs
*.md
*.log
.DS_Store
Thumbs.db

问题 3:端口被占用

错误信息

复制代码
Bind for 0.0.0.0:8080 failed: port is already allocated

解决方案

修改 docker-compose.yml 中的端口映射:

yaml 复制代码
ports:
  - "8081:80" # 改为其他端口

问题 4:容器启动后无法访问

排查步骤

  1. 检查容器是否正在运行:

    powershell 复制代码
    docker ps
  2. 查看容器日志:

    powershell 复制代码
    docker logs vue3-app
  3. 检查 Nginx 配置:

    powershell 复制代码
    docker exec -it vue3-app cat /etc/nginx/conf.d/default.conf
  4. 验证文件是否正确复制:

    powershell 复制代码
    docker exec -it vue3-app ls -la /usr/share/nginx/html/vue3/

问题 5:修改代码后不生效

原因:Docker 镜像是不可变的,代码修改后需要重新构建。

解决方案

powershell 复制代码
docker-compose down
docker-compose up -d --build

或使用一条命令:

powershell 复制代码
docker-compose up -d --build --force-recreate

七、容器管理最佳实践

日常开发流程

powershell 复制代码
# 1. 启动容器
docker-compose up -d

# 2. 查看日志
docker-compose logs -f

# 3. 代码修改后重新部署
docker-compose up -d --build

# 4. 停止容器
docker-compose down

容器生命周期管理

操作 Docker Compose Docker 命令
启动 docker-compose up -d docker start vue3-app
停止 docker-compose stop docker stop vue3-app
重启 docker-compose restart docker restart vue3-app
删除 docker-compose down docker rm vue3-app
查看日志 docker-compose logs -f docker logs -f vue3-app

资源清理

powershell 复制代码
# 删除停止的容器
docker container prune

# 删除未使用的镜像
docker image prune

# 清理所有未使用的资源
docker system prune -a

生产环境优化

  1. 移除 sourcemap

    修改 vite.config.ts

    typescript 复制代码
    build: {
      sourcemap: false,  // 生产环境不生成 sourcemap
    }
  2. 资源限制

    docker-compose.yml 中添加:

    yaml 复制代码
    services:
      vue3-app:
        deploy:
          resources:
            limits:
              cpus: "0.5"
              memory: 512M
  3. 健康检查

    yaml 复制代码
    services:
      vue3-app:
        healthcheck:
          test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost/health"]
          interval: 30s
          timeout: 10s
          retries: 3
  4. 日志管理

    yaml 复制代码
    services:
      vue3-app:
        logging:
          driver: "json-file"
          options:
            max-size: "10m"
            max-file: "3"

八、监控和日志

查看实时日志

powershell 复制代码
# Docker Compose
docker-compose logs -f

# Docker 命令
docker logs -f vue3-app

# 只查看最近 100 行
docker logs --tail 100 vue3-app

容器资源监控

powershell 复制代码
# 查看资源使用情况
docker stats vue3-app

# 查看容器详细信息
docker inspect vue3-app

👉点击进入 我的网站

相关推荐
CappuccinoRose6 小时前
模块化体系
前端·import·export·es modules
AIDANHANG6 小时前
放开靠时间戳对日志前先核请求ID跨服务传播与采样关联
前端·人工智能
二宝哥6 小时前
docker安装apisix
docker·容器·apisix
半生过往7 小时前
前端学 Java 课程笔记
java·前端·笔记
王da魔7 小时前
部署Kubernetes
云原生·容器·kubernetes
广州华水科技8 小时前
2026年单北斗GNSS变形监测系统推荐,破解水库安全监测难题
前端
独爱香菜9 小时前
Next.js 15 + Cloudflare Workers 实战:零中间件多语言 SEO 站点架构
前端
计算机魔术师9 小时前
DeepSeek、Qwen3比肩GPT-5,本地跑大模型的时代来了
前端
xcyxiner9 小时前
flutter wsl2安装记录(使用宿主机虚拟机)
前端·flutter
池以遇9 小时前
云原生高级——kubernetes的部署
云原生·容器·kubernetes