自动部署-Vercel & Docker
自动部署: Vercel & Docker
引言
在 GitHub 上,经常能遇到一些有趣的的开源项目:比如一个博客生成器、 或是一个通过大模型 API 构建的智能助手界面(比如 Next-Web),或是某个好看的服务面板,或者是小游戏、AI 模型可视化工具,这些项目往往都会在 README 中提供类似这样的一句话:
✅ 一键部署到 Vercel
✅ Docker 镜像已发布,支持容器化运行
于是,我们会看到一些熟悉又陌生的关键词频繁出现:Vercel、Docker、部署、自动构建... 这篇博客就是对 Docker 以及 Vercel 基本图像的介绍。
Vercel
前端构建
简单来说,Vercel 是一个云平台,专注于前端框架的自动化构建与部署。在正式介绍 Vercel 之前,我们需要先回顾一下现代前端开发的背景 —— 特别是「为什么前端不再是写完 HTML 文件就能直接用」。
✅ “前端开发”已经变了
许多人对前端的第一印象,可能还停留在大学计算机基础课上学到的网页制作: 写几个 .html
文件、配上 CSS 样式、用 <script>
写点交互逻辑,然后双击 HTML 文件就能打开页面。
但实际上,今天的前端早已不再是简单的静态页面开发。随着项目复杂度上升、交互需求增多,我们早已从「纯手写 HTML」的模式,过渡到使用各种前端框架来开发 UI。
✅ 什么是前端框架?
前端框架(如 Vue、React、Svelte 等)提供了一整套工具集,来帮助我们更高效地构建页面,包括:
- 组件系统:页面被拆分为可复用的模块(如按钮、搜索框、导航栏),就像类对象一样调用
- 响应式数据绑定:当数据变化时,页面内容会自动更新
- 高性能渲染机制:通过虚拟 DOM、编译优化等方式提升性能
- 模块组织:逻辑、样式、模板各自独立、结构清晰
比如在 Vue 中,我们写的代码看起来像这样:
1 | <template> |
看起来简单直观,但它其实只是框架的源码格式,浏览器并不能直接理解这种 .vue
文件。
✅ 为什么要“构建”?
浏览器只能识别 HTML、CSS 和 JavaScript,它并不懂 .vue
、.jsx
、.ts
等格式。
所以我们需要一个构建过程来把框架源码“翻译”为浏览器能执行的最终产物。这一过程通常由构建工具(如 Vite、Webpack)完成。
执行下面这条命令:
1 | npm run build |
构建工具就会将 .vue
文件编译为:
1 | <div>Hello</div> |
这就是所谓的“前端构建” —— 把开发时的框架源码打包成可部署的 HTML 页面和资源文件。
Node.js 与 npm:前端构建的“幕后发动机”
在前端构建流程中,我们经常会使用这样的命令:
1 | npm run build |
那么问题来了:这里的 npm
和 node
到底是什么?它们为什么总在现代前端项目中出现?
✅ Node.js:让 JavaScript 跑出浏览器
JavaScript 是世界上最流行的脚本语言之一,也是网页中各种交互逻辑的主角。但它最初只能在浏览器中运行,用来给网页添加交互效果。
后来,开发者希望 JavaScript 不只是“网页里的语言”,还可以像 Python、Ruby 一样运行在服务器、终端里 —— 于是,Node.js 就诞生了。
Node.js 是一个让 JavaScript 在浏览器之外运行的环境。
有了 Node.js,我们可以在命令行中运行 JS 程序:
1 | node hello.js |
Node.js 不仅可以跑代码,它还拥有强大的生态系统,能让 JS 在服务器端、构建工具、命令行工具中大显身手。
✅ npm:Node 的“包管理器”
有了运行环境,还需要安装和管理各种工具包,这时候就轮到 npm(Node Package Manager) 出场了。
npm 是 Node.js 自带的包管理器,作用类似于 Python 中的 pip
,主要功能包括:
- 安装依赖包(如
vue
、react
、hexo
) - 执行项目脚本(如
npm run dev
、npm run build
) - 管理项目依赖(写在
package.json
中)
✅ package.json:项目的说明书
每个基于 npm 的项目中,都会有一个 package.json
文件,它是项目的核心描述文件,定义了:
- 依赖库(dependencies)
- 构建脚本(scripts)
- 项目名称、版本、作者等元信息
例如:
1 | { |
你就可以运行:
1 | npm run dev # 启动开发服务器 |
✅ Vue、React、Hexo 都是 Node 项目?
没错。现代前端框架(如 Vue、React),以及 Hexo 这类静态博客工具,都是运行在 Node.js 环境上的应用。
你写的 .vue
源文件,其实是一种高级语言模板,必须经过构建工具(Vite、Webpack、Vue CLI 等)编译、打包,最终生成浏览器能识别的 HTML/CSS/JS。
而这些构建工具本身就是:
- 基于 Node.js 编写的命令行工具
- 通过
npm
安装和管理 - 运行在 Node 环境中
✅ 通俗类比:Node.js 与 npm 像什么?
概念 | 类比(Python) | 说明 |
---|---|---|
Node.js | Python 本体 | 提供运行环境 |
npm | pip | 安装依赖库 |
Vite/Webpack | pandas/Flask 等工具库 | 构建、打包、服务功能 |
package.json | requirements.txt + 脚本启动器 | 依赖描述 + 构建命令配置 |
所以你看到的 npm run build
,其实本质上就是:
1 | node path/to/build-tool.js |
也就类似于:
1 | python -m your_script |
✅ 一图总结:构建流程总览
1 | 你的源码:Vue 组件(.vue) |
你已经看到了,Node.js 和 npm 是现代前端项目的“底座”,而构建工具、框架、部署平台等技术,都建立在它们之上协同工作。
前端部署:从构建结果到“线上可访问”
当我们完成前端构建之后(生成了 HTML、CSS、JS 等静态资源文件),如果想让别人可以通过浏览器访问我们的页面,仅有构建结果还远远不够。我们还需要完成一整套上线部署流程。
✅ 一套典型的部署流程通常包括:
- 上传打包产物到服务器(通常是
dist/
或public/
目录) - 配置域名解析(DNS):将你购买的域名指向服务器 IP
- 申请并部署 SSL 证书:实现 HTTPS 加密访问,提升安全性
- 配置 Web 服务(如 Nginx):设置静态资源路径、反向代理、URL 路由等
- 可选:启用 CDN 加速(如 Cloudflare):提升全球访问速度,减少服务器压力
这整套流程,才算是完成了“前端上线”的最后一步。
🧠 看起来简单,其实很复杂
对于企业项目来说,这一套流程往往由专业的 运维团队(DevOps) 执行,前端工程师只需提交构建好的文件。
但对于个人开发者或小团队而言,事情就不那么轻松了:
- 你得学习服务器的基本使用(Linux 命令、Nginx 配置)
- 手动上传和配置项目,可能一不小心就出错
- 每次修改代码,都要:
- 重新打包
- 重新上传
- 可能还要重启服务 / 清除缓存 / 刷新 CDN
而对于只是想快速上线一个小页面、个人作品集、博客或原型演示的开发者来说,这一套流程确实“太重了”。
🧩 举个例子,你可能只是想做一件事:
“我写了个 Vue 页面,想让朋友扫码访问一下”
但为了实现这个小目标,你却可能需要接触:
- 阿里云或腾讯云控制台
- Linux SSH 命令
- nginx 配置文件
- Let's Encrypt 证书生成
- DNS 设置界面
- 文件同步工具或 CI 流程
这不光“费劲”,还可能会打击刚入门的开发热情。
✅ 所以,自动化部署的需求就出现了
能不能有一种方式:
- 自动上传并托管构建结果?
- 自动配置 HTTPS?
- 自动绑定域名甚至启用 CDN?
- 每次 push 代码后自动触发构建和部署?
这正是 Vercel、Netlify 等平台试图解决的问题 —— 它们把“部署”这件事变成了:
你只管写代码,部署交给我。
Vercel:自动部署的“轨道空间站”
![]() |
![]() |
---|
Vercel 是一个专为前端项目设计的自动化部署平台,它的使命就是让前端部署像推送代码一样简单、高效、几乎零配置。
在传统部署中,我们要手动上传构建结果、配置域名、处理 SSL、部署 CDN 等一大堆事情。但有了 Vercel,这一切都变得轻而易举。
✅ 如何使用 Vercel 实现自动部署?
Vercel 支持超过 30 种主流前端框架(如 Vue、React、Next.js、Svelte 等),部署流程极其简单:
- 将项目上传至 GitHub / GitLab / Bitbucket
- 在 Vercel 控制台创建项目,绑定代码仓库
- 设置构建命令与输出目录(通常自动识别,无需手动配置)
- 点击部署,数秒后网站上线 🎉
之后,每当你执行一次 git push
,Vercel 都会自动:
- 检测代码变更
- 重新构建项目
- 并将最新版本自动部署到公网
这就是现代前端“持续集成 / 持续部署(CI/CD)”的真实体验。
🎯 开发者的关注点回归“开发本身”
使用 Vercel 后,开发者无需再关心:
- 构建命令是否正确
- 部署流程是否顺利
- HTTPS 证书是否过期
- CDN 是否配置到位
你只需要专注于组件逻辑、UI 架构、交互体验,其他的一切都交给平台自动完成。
🛰️ 类比一下:Vercel 就像是“轨道空间站”
你把代码打包好发送上去,Vercel 自动完成:
- 构建:分析源码,打包为可部署的 HTML / JS / CSS
- 部署:上传至 CDN 节点,自动配置 HTTPS
- 供电:自动扩缩容、资源托管,保障高可用
- 通讯:打通全球网络,推送到多个区域的 CDN 边缘节点
- 广播:生成可公开访问的网址,任何设备、任何人都能访问
Vercel = 一座全自动的前端轨道基地,你只需要发射,其他都不操心。
⚠️ Vercel 的适用边界
Vercel 的构建流程是基于 Node.js 生态构建的。因此:
- ✅ 它完美支持基于 Node.js 的前端框架(Vue、React、Next.js 等)
- ❌ 但 不支持运行非 Node 后端语言项目(如 Python 的 Flask / FastAPI,或 C++/Rust 编写的服务)
这并不是限制,而是设计选择:Vercel 的目标就是前端自动化,而非通用服务器平台。
🧠 为什么前端框架几乎都依赖 Node.js?
因为:
- 构建工具(Vite、Webpack、Babel)都是 Node.js 写的
- 包管理(npm/yarn/pnpm)是 Node.js 社区的核心工具
- JavaScript 本身就是前端通用语言,Node 让它能在开发和服务端同时工作
Node.js 已经成为现代前端项目不可分割的一部分,你写前端的同时,也是在使用 Node 技术栈。
🪐 介绍完了 Vercel 这座轨道空间站,我们该回到地面 —— 前端的部署已经自动化了,那么后端和通用服务怎么办?这就是接下来我们要聊的另一个宇宙级工具:Docker。
Docker
🐳 Docker 使用:一个能在任何地方运行应用的“快捷方式”
Docker 是一个开源的容器平台,可以将一个应用程序及其所有依赖,打包进一个轻量、可移植的“容器”中。这个容器可以在任何支持 Docker 的系统上运行,彻底解决了“在我电脑上能跑但在你电脑上跑不了”的问题。
✅ 平时我们怎么安装一个程序?
我们通常的安装流程是这样的:
- 下载操作系统对应的安装包(Windows/macOS/Linux)
- 选择安装目录、配置环境变量
- 输入管理员权限、等待安装完成
- 有时还会报错:“缺少 DLL 文件”或 “找不到 rc.exe”等依赖问题
- 安装完发现只能在本机运行,到另一台电脑又得重来一遍……
这就是现实开发者的日常:一个程序跑起来,往往需要一整套环境、依赖、配置…… 而且过程繁琐、易出错。
💭 有没有可能,程序配置好之后,可以“一次打包,到处运行”?
就像小时候在微机课上我们天真地以为:
“把自己家电脑桌面上的快捷方式复制到学校电脑上,就能启动同一个软件。”
虽然当时并不现实,但今天,Docker 帮我们实现了这个梦想。
Docker 就是那种真正能跑的“快捷方式”。只要你有 Docker 环境,哪怕是全新的电脑、一台服务器,甚至树莓派,一行命令就能跑起完整应用。
📝 示例:一条命令运行一个日记系统
比如我们想运行一个开源的轻量级笔记系统 Memos,安装了 Docker 之后只需要一条命令:
1 | docker run -d \ |
这条命令的作用是:
- 创建并运行一个名为
memos
的容器 - 将容器的
5230
端口映射到本地 - 将数据持久化到
memos-data
卷中 - 使用镜像
neosmemo/memos:stable
然后你就可以在浏览器中访问:
1 | http://localhost:5230 |
就这么简单,不需要手动安装、配置数据库、不需要搞依赖管理,应用就能直接用了。
🧱 镜像 vs 容器:Docker 的核心概念
理解 Docker 的关键是两个核心名词:
名词 | 说明 |
---|---|
镜像 (Image) | 类似“安装包”,包含运行程序所需的一切:操作系统、工具、应用本体 |
容器 (Container) | 镜像运行后的“实例”,就像正在使用的软件,独立、隔离、可删除 |
镜像本身是静态的模板,不会自动运行;只有你通过 docker run
启动镜像,才会创建一个活生生的容器。每一个容器就像一个单独的运行隔离舱,他们可以单独运行,不互相影响。
📦 镜像从哪里来?
就像 Python 有 PyPI、Node 有 npm,Docker 也有一个巨大的镜像仓库 —— 👉 Docker Hub
你可以从里面直接下载官方或社区提供的镜像:
1 | docker pull python |
甚至还有像 neosmemo/memos
这样的开源小众项目镜像,都可以一键运行。
🤯 如果不用 Docker,要怎么部署一个应用?
比如我们想不借助 Docker,手动安装 Memos,步骤可能是这样的:
- ⬇️ 从 GitHub 下载 Memos 的二进制可执行文件
- 🛠️ 配置权限、数据库路径
- 📂 创建数据存储结构(如 SQLite 文件)
- 🔄 设置开机自启动或守护进程(Systemd / PM2)
- 💾 安装额外依赖或补丁(不同系统/架构可能还要重新编译)
不仅复杂,而且一不小心就会出错、漏步骤、版本不一致……
✅ 而用 Docker,只需要:
1 | docker run -d -p 5230:5230 neosmemo/memos:stable |
就等于:
- 下载程序 ✅
- 建好运行环境 ✅
- 设置好网络端口 ✅
- 启动服务 ✅
- 数据持久化 ✅
- 想停 / 想删 / 想迁移都一条命令搞定 ✅
甚至你还可以用 Portainer 或 Docker Desktop 图形界面,像拖动 App 一样点几下就部署成功。
🛠️ Docker 创建:把自己的程序变成“可运行的镜像”
使用 Docker 不仅可以拉取现成的镜像来运行别人的项目,你也可以将自己写的程序打包成镜像,让任何人都能一键运行。
这一过程的核心,就是编写一份叫做 Dockerfile
的文件。
📦 什么是 Dockerfile?
Dockerfile 就像一份“构建说明书”,告诉 Docker:
我要基于哪个系统,安装哪些依赖,拷贝哪些代码,执行哪些构建和运行指令。
你可以把它想象成是在一台全新安装的操作系统上,手动执行的命令,只不过这些都被自动化和程序化了。
✅ 一个典型的构建过程包括:
- 选择基础系统(如 Debian、Ubuntu、Python)
- 安装系统级依赖(如编译器、动态库等)
- 拷贝源码到容器中
- 编译或构建程序
- 设置启动命令(容器运行后默认执行的指令)
🔧 示例:C++ 程序镜像构建
假设你有一个简单的 C++ 项目,使用了 libcurl
访问 API。
📁 项目结构如下:
1 | hello-cpp/ |
📄 Dockerfile 内容如下:
1 | # 第一步:选择一个基础系统 |
你可以用以下命令构建镜像并运行:
1 | docker build -t hello-cpp . |
🐍 示例:Python 项目的 Dockerfile(更简单)
1 | FROM python:3.11-slim |
✅ 构建镜像能带来什么?
- ✔️ 完整封装你的运行环境(包括操作系统 + 依赖 + 可执行程序)
- ✔️ 保证在任意平台都能“跑得起来”
- ✔️ 不再需要写冗长的“安装说明文档”
- ✔️ 支持版本控制、自动化部署、团队协作
- ✔️ 比虚拟机轻巧,比 Conda 更通用
构建对象 | 类比 |
---|---|
Dockerfile |
“装系统+配环境”的操作记录 |
构建出来的镜像 | 已经装好的系统快照 |
容器(Container) | 运行中的那台“装好系统的机器” |
Dockerfile 是你告诉“新装的电脑”如何一步步变成你的工作环境,镜像就是那台配置完毕的机器快照,容器就是它真正跑起来的时候。
🧠 Docker 容器 ≈ 太空殖民舱
![]() |
![]() |
---|
Docker 就像是一艘艘携带完整生态的太空殖民舱。
- 🧩 镜像(Image):就像一份标准化的“殖民计划书”,里面列好了你要带去星球的一切内容:基础系统(如 Ubuntu)、运行环境、依赖库、工具、应用本体……就像为星际探险准备的全套配置文档。
- 🚀 容器(Container):则是这份计划书“实际落地”后的殖民基地。它被部署、运行,拥有独立的空间、自主的行为,不受外部星球(操作系统)的限制,你可以部署一座,也可以部署上百座,每一个容器都是独立的小宇宙。
- 📐 Dockerfile:是“殖民舱设计图纸”,它定义了要装哪些模块、设备、环境系统 —— 构建环境的每一步都清晰可控,版本可复现,历史可追踪。
🌐 容器 = 星球上的基地,脱离“地形”运行
在地球部署一个服务,要考虑系统兼容性、环境差异等问题,但 Docker 容器不受这些限制。你可以把它部署到:
- 🌍 地球(Windows)
- 🌕 月球(macOS)
- 🔴 火星(Linux)
无论宿主系统是什么,容器里的世界始终一致: 比如一个 Ubuntu 系统 + Python 解释器 + Redis + AI 模型 ✅
容器内部自成一格,容器外部自由迁移。
🤖 AI × Docker:未来的黄金拍档
当人类进入多星球时代,我们不仅需要运输水、食物、氧气,还要运输计算与智能。
未来的 AI,很可能就是以 Docker 容器的形式存在:
- 🧠 每个容器封装一套特定能力(自然语言处理、图像识别、飞船导航)
- 🌐 可部署在任意地点(空间站、机器人、边缘设备)
- 🔄 统一管理、远程升级、版本回滚、安全隔离
这就像我们为 AI 提供了一个又一个“数字化生命舱”,让智能不受硬件、地域限制,自由穿梭星际。
💡 Docker 就像人类与 AI 携带的“数字殖民舱”,它封装了我们的操作系统、程序、依赖、逻辑、乃至文化 —— 让我们可以把这些数字资产,在遥远星球中复制、运行、生长。