Run any Dockerfile on Vercel
TL;DR · AI 摘要
Vercel 现在支持通过 Dockerfile.vercel 部署任何容器化服务,实现自动扩展和按需计费。
核心要点
- 使用 Dockerfile.vercel 可部署 Go/Rails/Spring Boot 等后端服务,无需本地运行容器
- Fluid compute 按实际 CPU 使用时间计费,闲置服务器不产生费用
- 每个 Git 提交自动生成独立预览链接,支持一键部署
结构提纲
按章节快速跳转。
- §引言
Vercel 现支持通过 Dockerfile 部署容器化服务,提供自动扩展和按需计费功能。
- ·核心机制
通过 Dockerfile.vercel 定义构建流程,Vercel 自动构建、存储并部署镜像。
- ›部署示例
Go 服务示例展示如何通过环境变量 $PORT 实现端口绑定和容器启动。
- ·部署优势
提供预览部署、双向自动扩展、精准计费和全栈统一部署等核心能力。
- ›计费模式
Fluid compute 按实际执行时间计费,避免闲置资源浪费。
- ·适用场景
支持所有监听 $PORT 的 HTTP 服务,包括 Java/PHP 等传统后端技术。
思维导图
用一张图看清主题之间的关系。
查看大纲文本(无障碍 / 无 JS 友好)
- Vercel 容器部署
- 部署流程
- Dockerfile.vercel 定义
- 两阶段构建镜像
- Fluid compute 部署
- 核心优势
- 双向自动扩展
- 精准 CPU 计费
- 全栈统一部署
- 支持框架
- Go
- Rails
- Spring Boot
- PHP
金句 / Highlights
值得收藏与分享的关键句。
Vercel 的 Fluid compute 按实际运行时间计费,闲置服务器不产生费用
Dockerfile.vercel 采用两阶段构建,生成仅 3MB 的 Alpine 镜像
每个 Git 提交自动生成独立预览链接,支持无提交直接部署
在 Vercel 上运行任何 Dockerfile - Vercel
你有一个运行在容器中的服务器。也许是 Go 服务、Rails 应用、Spring Boot API,或者通过 nginx 的 Web 服务器。它使用 HTTP 协议,监听某个端口,只需要一个运行环境即可。
在项目中添加一个 Dockerfile.vercel 文件,Vercel 会为你构建、存储、部署并自动扩展该镜像,你只需为代码实际使用的 CPU 支付费用。无需本地运行守护进程、设置镜像仓库或管理集群。
链接到标题:工作原理
以下是一个用 Go 编写的简单 HTTP 服务器,监听 $PORT 端口:
main.go
1
package main
2
3
import (
4
"fmt"
5
"net/http"
6
"os"
7
)
8
9
func main() {
10
port := os.Getenv("PORT")
11
if port == "" {
12
port = "80"
13
}
14
15
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
16
fmt.Fprintln(w, "Hello from a container on Vercel 👋")
17
})
18
19
http.ListenAndServe(":"+port, nil)
20
}一个最小的 HTTP 服务器,从 $PORT 读取端口并响应每个请求。
添加一个 Dockerfile.vercel 文件来构建镜像并运行:
Dockerfile.vercel
1
FROM
golang:1.24-alpine
AS
build
2
WORKDIR
/src
3
COPY
. .
4
RUN
go build -o /server main.go
5
6
FROM
alpine:3.20
7
COPY
--from
=
build
/server /server
8
CMD
[
"/server"
]一个两阶段构建,先编译二进制文件,然后复制到最小的 Alpine 镜像中运行。
然后部署:
▲ vercel deploy
Vercel CLI
✓ 从 Dockerfile.vercel 构建镜像
✓ 已存储镜像到你的项目仓库
✓ 已部署到 Fluid compute
生产环境: https://my-server.vercel.app一条命令即可构建镜像、存储并发送到 Fluid compute,然后输出生产环境 URL。
就是这样。只需两个文件,你就可以立即运行。每次 Git 提交都会重新构建镜像并提供新的预览 URL。或者运行 vercel 部署而无需提交代码。
我们用 Go 作为示例,但任何技术栈都可以使用。Rails、Spring Boot、Express、Laravel、ASP.NET、FastAPI 以及通过 nginx 的 Web 服务器都可以用相同方式部署。唯一规则是你的服务器必须监听 $PORT(默认 80 端口)。如果它使用 HTTP 协议,就能部署。是的,甚至 Java 和 PHP 都可以。
链接到标题:你将获得什么
在 Vercel 上的容器是头等公民。它与你的前端和其他 Vercel 服务运行在相同的平台和计算资源上。
- 每次推送都有预览部署:每个提交都会获得一个独立的 URL,你可以打开、分享并回滚。
- 双向自动扩展:流量增加时自动扩展,流量减少时自动缩减。你无需估算并发数或管理服务器规模。
- 活动 CPU 计费:Fluid compute 按代码实际运行时间计费,空闲服务器(如等待慢查询或上游 API)不会消耗 CPU。你为执行时间付费,而非墙钟时间。
- 内置可观测性:容器的日志、追踪和指标与你部署的其他服务共享同一仪表盘。
- 一个项目,一个域名:你的容器与前端和其他服务并存,通过 Vercel 网络私密通信。你的全栈应用作为一个部署发布。
链接到标题:专为快速启动而设计
容器的价值取决于它响应第一个请求所需的时间。
当 Vercel 构建你的镜像时,会将其存储为优化的启动镜像——容器磁盘的压缩快照,专为快速启动而设计。
当容器启动时,我们会按需流式传输该快照并进行解压缩,而不是在任何操作运行前下载整个镜像。您的服务器可以在完整镜像下载完成前就开始处理请求,因此较大的镜像无需先完成下载。
实例运行后,Fluid compute会保持其处于激活状态并从中处理多个请求,而不是为每个请求启动新的实例。您将获得热服务器的响应速度,同时仅需支付闲置时休眠状态的费用。
每个容器都是无状态进程:接收请求、返回响应,不保存任何中间状态。持久化状态存储在您连接的后端服务中,例如来自Vercel Marketplace的数据库或缓存。由于实例不保存任何需要持久化的数据,Vercel可以在流量到达时添加实例,在流量停止时退役实例。我们也在近期即将推出与容器绑定的持久化存储方案。
链接到标题 为什么现在?
我们的首个平台允许您通过单条命令部署Dockerfile。这发生在十年前,当时这个理念是正确的,但实现该理念的基础设施尚未成熟。
过去几年中,我们一直在构建处理该问题的基础组件。这些组件支持您在Vercel上运行的所有内容:构建、函数、沙箱以及现在容器。所有内容都根据流量自动扩展,您只需为实际使用的CPU付费。现在容器已成为一等公民,与所有其他服务运行在相同的系统中。
框架检测是我们的入口。当我们识别出您的框架时,会读取您的代码并推导出应用所需的基础设施,因为代码本身已经描述了它应该执行的操作。对于大多数应用来说,这是最快的部署方式。Dockerfile适用于其他场景:需要系统库(如FFmpeg或Chromium)的服务、尚未支持自动检测的框架,或您希望以现有运行方式原样部署的应用。Dockerfile是描述程序构建方式的通用方法,因此当没有可读取的框架时,我们可以直接处理它。
围绕您的Dockerfile的所有操作都无需配置。您只需指向镜像,构建、镜像仓库、发布、扩展和URL都会自动完成。
链接到标题 后端服务回归
您的后端服务现在以与前端相同的方式部署:一次推送、一次预览、一个平台。我们迫不及待想看到您构建的内容。
阅读文档或部署示例以开始使用。