1. 1. 自动部署: Vercel & Docker
    1. 1.1. 引言
    2. 1.2. Vercel
      1. 1.2.1. 前端构建
        1. 1.2.1.1. ✅ “前端开发”已经变了
        2. 1.2.1.2. ✅ 什么是前端框架?
        3. 1.2.1.3. ✅ 为什么要“构建”?
      2. 1.2.2. Node.js 与 npm:前端构建的“幕后发动机”
        1. 1.2.2.1. ✅ Node.js:让 JavaScript 跑出浏览器
        2. 1.2.2.2. ✅ npm:Node 的“包管理器”
        3. 1.2.2.3. ✅ package.json:项目的说明书
        4. 1.2.2.4. ✅ Vue、React、Hexo 都是 Node 项目?
        5. 1.2.2.5. ✅ 通俗类比:Node.js 与 npm 像什么?
        6. 1.2.2.6. ✅ 一图总结:构建流程总览
      3. 1.2.3. 前端部署:从构建结果到“线上可访问”
        1. 1.2.3.1. ✅ 一套典型的部署流程通常包括:
        2. 1.2.3.2. 🧠 看起来简单,其实很复杂
        3. 1.2.3.3. 🧩 举个例子,你可能只是想做一件事:
        4. 1.2.3.4. ✅ 所以,自动化部署的需求就出现了
      4. 1.2.4. Vercel:自动部署的“轨道空间站”
        1. 1.2.4.1. ✅ 如何使用 Vercel 实现自动部署?
        2. 1.2.4.2. 🎯 开发者的关注点回归“开发本身”
        3. 1.2.4.3. 🛰️ 类比一下:Vercel 就像是“轨道空间站”
        4. 1.2.4.4. ⚠️ Vercel 的适用边界
        5. 1.2.4.5. 🧠 为什么前端框架几乎都依赖 Node.js?
    3. 1.3. Docker
      1. 1.3.1. 🐳 Docker 使用:一个能在任何地方运行应用的“快捷方式”
        1. 1.3.1.1. ✅ 平时我们怎么安装一个程序?
        2. 1.3.1.2. 💭 有没有可能,程序配置好之后,可以“一次打包,到处运行”?
        3. 1.3.1.3. 📝 示例:一条命令运行一个日记系统
      2. 1.3.2. 🧱 镜像 vs 容器:Docker 的核心概念
        1. 1.3.2.1. 📦 镜像从哪里来?
        2. 1.3.2.2. 🤯 如果不用 Docker,要怎么部署一个应用?
      3. 1.3.3. 🛠️ Docker 创建:把自己的程序变成“可运行的镜像”
        1. 1.3.3.1. 📦 什么是 Dockerfile?
        2. 1.3.3.2. 🔧 示例:C++ 程序镜像构建
        3. 1.3.3.3. 🐍 示例:Python 项目的 Dockerfile(更简单)
      4. 1.3.4. 🧠 Docker 容器 ≈ 太空殖民舱
        1. 1.3.4.1. 🌐 容器 = 星球上的基地,脱离“地形”运行
        2. 1.3.4.2. 🤖 AI × Docker:未来的黄金拍档

自动部署-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
2
3
4
5
6
7
8
9
10
11
<template>
<div>{{ message }}</div>
</template>

<script>
export default {
data() {
return { message: 'Hello' }
}
}
</script>

看起来简单直观,但它其实只是框架的源码格式,浏览器并不能直接理解这种 .vue 文件。


✅ 为什么要“构建”?

浏览器只能识别 HTML、CSS 和 JavaScript,它并不懂 .vue.jsx.ts 等格式。

所以我们需要一个构建过程来把框架源码“翻译”为浏览器能执行的最终产物。这一过程通常由构建工具(如 Vite、Webpack)完成。

执行下面这条命令:

1
npm run build

构建工具就会将 .vue 文件编译为:

1
2
3
4
<div>Hello</div>
<script>
// 构建后的 JavaScript 逻辑
</script>

这就是所谓的“前端构建” —— 把开发时的框架源码打包成可部署的 HTML 页面和资源文件。

Node.js 与 npm:前端构建的“幕后发动机”

在前端构建流程中,我们经常会使用这样的命令:

1
npm run build

那么问题来了:这里的 npmnode 到底是什么?它们为什么总在现代前端项目中出现?


✅ 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,主要功能包括:

  • 安装依赖包(如 vuereacthexo
  • 执行项目脚本(如 npm run devnpm run build
  • 管理项目依赖(写在 package.json 中)

✅ package.json:项目的说明书

每个基于 npm 的项目中,都会有一个 package.json 文件,它是项目的核心描述文件,定义了:

  • 依赖库(dependencies)
  • 构建脚本(scripts)
  • 项目名称、版本、作者等元信息

例如:

1
2
3
4
5
6
7
8
9
10
{
"name": "my-vue-site",
"scripts": {
"dev": "vite",
"build": "vite build"
},
"dependencies": {
"vue": "^3.0.0"
}
}

你就可以运行:

1
2
npm run dev     # 启动开发服务器
npm run build # 构建静态网页

✅ 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
2
3
4
5
6
7
8
9
你的源码:Vue 组件(.vue

构建工具:Vite / Webpack(Node.js 工具)

Node.js 环境 + npm 依赖库

输出静态网页:HTML + CSS + JS

部署上线:Vercel / Docker / Nginx 等

你已经看到了,Node.js 和 npm 是现代前端项目的“底座”,而构建工具、框架、部署平台等技术,都建立在它们之上协同工作。

前端部署:从构建结果到“线上可访问”

当我们完成前端构建之后(生成了 HTML、CSS、JS 等静态资源文件),如果想让别人可以通过浏览器访问我们的页面,仅有构建结果还远远不够。我们还需要完成一整套上线部署流程。


✅ 一套典型的部署流程通常包括:

  1. 上传打包产物到服务器(通常是 dist/public/ 目录)
  2. 配置域名解析(DNS):将你购买的域名指向服务器 IP
  3. 申请并部署 SSL 证书:实现 HTTPS 加密访问,提升安全性
  4. 配置 Web 服务(如 Nginx):设置静态资源路径、反向代理、URL 路由等
  5. 可选:启用 CDN 加速(如 Cloudflare):提升全球访问速度,减少服务器压力

这整套流程,才算是完成了“前端上线”的最后一步。


🧠 看起来简单,其实很复杂

对于企业项目来说,这一套流程往往由专业的 运维团队(DevOps) 执行,前端工程师只需提交构建好的文件。

但对于个人开发者或小团队而言,事情就不那么轻松了:

  • 你得学习服务器的基本使用(Linux 命令、Nginx 配置)
  • 手动上传和配置项目,可能一不小心就出错
  • 每次修改代码,都要:
    • 重新打包
    • 重新上传
    • 可能还要重启服务 / 清除缓存 / 刷新 CDN

而对于只是想快速上线一个小页面、个人作品集、博客或原型演示的开发者来说,这一套流程确实“太重了”。


🧩 举个例子,你可能只是想做一件事:

“我写了个 Vue 页面,想让朋友扫码访问一下”

但为了实现这个小目标,你却可能需要接触:

  • 阿里云或腾讯云控制台
  • Linux SSH 命令
  • nginx 配置文件
  • Let's Encrypt 证书生成
  • DNS 设置界面
  • 文件同步工具或 CI 流程

这不光“费劲”,还可能会打击刚入门的开发热情。


✅ 所以,自动化部署的需求就出现了

能不能有一种方式:

  • 自动上传并托管构建结果?
  • 自动配置 HTTPS?
  • 自动绑定域名甚至启用 CDN?
  • 每次 push 代码后自动触发构建和部署?

这正是 Vercel、Netlify 等平台试图解决的问题 —— 它们把“部署”这件事变成了:

你只管写代码,部署交给我。

Vercel:自动部署的“轨道空间站”

ChatGPT Image 2025年4月13日 13_31_20 ChatGPT Image 2025年4月13日 13_34_25

Vercel 是一个专为前端项目设计的自动化部署平台,它的使命就是让前端部署像推送代码一样简单、高效、几乎零配置。

在传统部署中,我们要手动上传构建结果、配置域名、处理 SSL、部署 CDN 等一大堆事情。但有了 Vercel,这一切都变得轻而易举。


✅ 如何使用 Vercel 实现自动部署?

Vercel 支持超过 30 种主流前端框架(如 Vue、React、Next.js、Svelte 等),部署流程极其简单:

  1. 将项目上传至 GitHub / GitLab / Bitbucket
  2. 在 Vercel 控制台创建项目,绑定代码仓库
  3. 设置构建命令与输出目录(通常自动识别,无需手动配置)
  4. 点击部署,数秒后网站上线 🎉

之后,每当你执行一次 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
2
3
4
5
docker run -d \
--name memos \
-p 5230:5230 \
-v memos-data:/var/opt/memos \
neosmemo/memos:stable

这条命令的作用是:

  • 创建并运行一个名为 memos 的容器
  • 将容器的 5230 端口映射到本地
  • 将数据持久化到 memos-data 卷中
  • 使用镜像 neosmemo/memos:stable

然后你就可以在浏览器中访问:

1
http://localhost:5230

就这么简单,不需要手动安装、配置数据库、不需要搞依赖管理,应用就能直接用了。

image-20250413151334419


🧱 镜像 vs 容器:Docker 的核心概念

理解 Docker 的关键是两个核心名词:

名词 说明
镜像 (Image) 类似“安装包”,包含运行程序所需的一切:操作系统、工具、应用本体
容器 (Container) 镜像运行后的“实例”,就像正在使用的软件,独立、隔离、可删除

镜像本身是静态的模板,不会自动运行;只有你通过 docker run 启动镜像,才会创建一个活生生的容器。每一个容器就像一个单独的运行隔离舱,他们可以单独运行,不互相影响。

image-20250413144021121


📦 镜像从哪里来?

就像 Python 有 PyPI、Node 有 npm,Docker 也有一个巨大的镜像仓库 —— 👉 Docker Hub

你可以从里面直接下载官方或社区提供的镜像:

1
2
3
docker pull python
docker pull mysql
docker pull nginx

甚至还有像 neosmemo/memos 这样的开源小众项目镜像,都可以一键运行。


🤯 如果不用 Docker,要怎么部署一个应用?

比如我们想不借助 Docker,手动安装 Memos,步骤可能是这样的:

  1. ⬇️ 从 GitHub 下载 Memos 的二进制可执行文件
  2. 🛠️ 配置权限、数据库路径
  3. 📂 创建数据存储结构(如 SQLite 文件)
  4. 🔄 设置开机自启动或守护进程(Systemd / PM2)
  5. 💾 安装额外依赖或补丁(不同系统/架构可能还要重新编译)

不仅复杂,而且一不小心就会出错、漏步骤、版本不一致……


✅ 而用 Docker,只需要:

1
docker run -d -p 5230:5230 neosmemo/memos:stable

就等于:

  • 下载程序 ✅
  • 建好运行环境 ✅
  • 设置好网络端口 ✅
  • 启动服务 ✅
  • 数据持久化 ✅
  • 想停 / 想删 / 想迁移都一条命令搞定 ✅

甚至你还可以用 Portainer 或 Docker Desktop 图形界面,像拖动 App 一样点几下就部署成功。

🛠️ Docker 创建:把自己的程序变成“可运行的镜像”

使用 Docker 不仅可以拉取现成的镜像来运行别人的项目,你也可以将自己写的程序打包成镜像,让任何人都能一键运行。

这一过程的核心,就是编写一份叫做 Dockerfile 的文件。


📦 什么是 Dockerfile?

Dockerfile 就像一份“构建说明书”,告诉 Docker:

我要基于哪个系统,安装哪些依赖,拷贝哪些代码,执行哪些构建和运行指令。

你可以把它想象成是在一台全新安装的操作系统上,手动执行的命令,只不过这些都被自动化和程序化了。


✅ 一个典型的构建过程包括:

  1. 选择基础系统(如 Debian、Ubuntu、Python)
  2. 安装系统级依赖(如编译器、动态库等)
  3. 拷贝源码到容器中
  4. 编译或构建程序
  5. 设置启动命令(容器运行后默认执行的指令)

🔧 示例:C++ 程序镜像构建

假设你有一个简单的 C++ 项目,使用了 libcurl 访问 API。

📁 项目结构如下:

1
2
3
hello-cpp/
├── main.cpp
└── (可选) CMakeLists.txt

📄 Dockerfile 内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 第一步:选择一个基础系统
FROM debian:bullseye

# 第二步:安装编译器和依赖库
RUN apt-get update && apt-get install -y \
g++ \
libcurl4-openssl-dev \
&& rm -rf /var/lib/apt/lists/*

# 第三步:设置工作目录并拷贝代码
WORKDIR /app
COPY . .

# 第四步:编译 C++ 程序
RUN g++ main.cpp -o app -lcurl

# 第五步:设置容器启动时执行的命令
CMD ["./app"]

你可以用以下命令构建镜像并运行:

1
2
docker build -t hello-cpp .
docker run --rm hello-cpp

🐍 示例:Python 项目的 Dockerfile(更简单)

1
2
3
4
5
6
7
8
9
FROM python:3.11-slim

WORKDIR /app
COPY . .

# 安装依赖(可选)
RUN pip install -r requirements.txt

CMD ["python", "main.py"]

✅ 构建镜像能带来什么?

  • ✔️ 完整封装你的运行环境(包括操作系统 + 依赖 + 可执行程序)
  • ✔️ 保证在任意平台都能“跑得起来”
  • ✔️ 不再需要写冗长的“安装说明文档”
  • ✔️ 支持版本控制、自动化部署、团队协作
  • ✔️ 比虚拟机轻巧,比 Conda 更通用
构建对象 类比
Dockerfile “装系统+配环境”的操作记录
构建出来的镜像 已经装好的系统快照
容器(Container) 运行中的那台“装好系统的机器”

Dockerfile 是你告诉“新装的电脑”如何一步步变成你的工作环境,镜像就是那台配置完毕的机器快照,容器就是它真正跑起来的时候。

🧠 Docker 容器 ≈ 太空殖民舱

ChatGPT Image 2025年4月13日 15_06_52 e323a63c-8a10-4219-9ec5-c9240e680e43

Docker 就像是一艘艘携带完整生态的太空殖民舱


  • 🧩 镜像(Image):就像一份标准化的“殖民计划书”,里面列好了你要带去星球的一切内容:基础系统(如 Ubuntu)、运行环境、依赖库、工具、应用本体……就像为星际探险准备的全套配置文档。
  • 🚀 容器(Container):则是这份计划书“实际落地”后的殖民基地。它被部署、运行,拥有独立的空间、自主的行为,不受外部星球(操作系统)的限制,你可以部署一座,也可以部署上百座,每一个容器都是独立的小宇宙。
  • 📐 Dockerfile:是“殖民舱设计图纸”,它定义了要装哪些模块、设备、环境系统 —— 构建环境的每一步都清晰可控,版本可复现,历史可追踪。

🌐 容器 = 星球上的基地,脱离“地形”运行

在地球部署一个服务,要考虑系统兼容性、环境差异等问题,但 Docker 容器不受这些限制。你可以把它部署到:

  • 🌍 地球(Windows)
  • 🌕 月球(macOS)
  • 🔴 火星(Linux)

无论宿主系统是什么,容器里的世界始终一致: 比如一个 Ubuntu 系统 + Python 解释器 + Redis + AI 模型 ✅

容器内部自成一格,容器外部自由迁移。


🤖 AI × Docker:未来的黄金拍档

当人类进入多星球时代,我们不仅需要运输水、食物、氧气,还要运输计算与智能

未来的 AI,很可能就是以 Docker 容器的形式存在:

  • 🧠 每个容器封装一套特定能力(自然语言处理、图像识别、飞船导航)
  • 🌐 可部署在任意地点(空间站、机器人、边缘设备)
  • 🔄 统一管理、远程升级、版本回滚、安全隔离

这就像我们为 AI 提供了一个又一个“数字化生命舱”,让智能不受硬件、地域限制,自由穿梭星际。

💡 Docker 就像人类与 AI 携带的“数字殖民舱”,它封装了我们的操作系统、程序、依赖、逻辑、乃至文化 —— 让我们可以把这些数字资产,在遥远星球中复制、运行、生长。