Vercel News

Run any Dockerfile on Vercel

8.5内容质量

TL;DR · AI 摘要

Vercel 现在支持通过 Dockerfile.vercel 部署任何容器化服务,实现自动扩展和按需计费。

核心要点

  • 使用 Dockerfile.vercel 可部署 Go/Rails/Spring Boot 等后端服务,无需本地运行容器
  • Fluid compute 按实际 CPU 使用时间计费,闲置服务器不产生费用
  • 每个 Git 提交自动生成独立预览链接,支持一键部署

结构提纲

按章节快速跳转。

  1. Vercel 现支持通过 Dockerfile 部署容器化服务,提供自动扩展和按需计费功能。

  2. 通过 Dockerfile.vercel 定义构建流程,Vercel 自动构建、存储并部署镜像。

  3. Go 服务示例展示如何通过环境变量 $PORT 实现端口绑定和容器启动。

  4. 提供预览部署、双向自动扩展、精准计费和全栈统一部署等核心能力。

  5. Fluid compute 按实际执行时间计费,避免闲置资源浪费。

  6. 支持所有监听 $PORT 的 HTTP 服务,包括 Java/PHP 等传统后端技术。

思维导图

用一张图看清主题之间的关系。

查看大纲文本(无障碍 / 无 JS 友好)
  • Vercel 容器部署
    • 部署流程
      • Dockerfile.vercel 定义
      • 两阶段构建镜像
      • Fluid compute 部署
    • 核心优势
      • 双向自动扩展
      • 精准 CPU 计费
      • 全栈统一部署
    • 支持框架
      • Go
      • Rails
      • Spring Boot
      • PHP

金句 / Highlights

值得收藏与分享的关键句。

#Vercel#Docker#部署#云原生#后端
打开原文

在 Vercel 上运行任何 Dockerfile - Vercel

你有一个运行在容器中的服务器。也许是 Go 服务、Rails 应用、Spring Boot API,或者通过 nginx 的 Web 服务器。它使用 HTTP 协议,监听某个端口,只需要一个运行环境即可。

在项目中添加一个 Dockerfile.vercel 文件,Vercel 会为你构建、存储、部署并自动扩展该镜像,你只需为代码实际使用的 CPU 支付费用。无需本地运行守护进程、设置镜像仓库或管理集群。

链接到标题:工作原理

以下是一个用 Go 编写的简单 HTTP 服务器,监听 $PORT 端口:

main.go

code
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

code
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 镜像中运行。

然后部署:

code
▲ 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都会自动完成。

链接到标题 后端服务回归

您的后端服务现在以与前端相同的方式部署:一次推送、一次预览、一个平台。我们迫不及待想看到您构建的内容。

阅读文档或部署示例以开始使用。