2026 Vercel Docker 完整教學:從 Container Registry 到 Fluid Compute 與 Sandbox 全面解析

2026 年 7 月 Vercel 發布了最新的 Docker 支援指南,涵蓋 Vercel Container Registry (VCR)、Fluid Compute 容器函式、Vercel Sandbox、多服務部署。本文完整翻譯與實作教學。

  • Dennis
  • 5 分鐘閱讀
2026 Vercel Docker 完整教學:從 Container Registry 到 Fluid Compute 與 Sandbox 全面解析

2026 Vercel Docker 完整教學

原文:Running Docker on Vercel(2026/7/13 更新) 作者:Ben Sabic @ Vercel Knowledge Base


Vercel 對 Docker 的支援在 2026 年迎來了重大更新。從 Container Registry 到 Fluid Compute 容器化部署,Vercel 現在提供了四種 Docker 整合方式:

面向用途
Vercel Functions(Fluid Compute)將容器化應用部署為自動擴展的 Serverless Function
Vercel Container Registry (VCR)儲存、推送與拉取 OCI 映像檔
Vercel Sandbox在隔離環境中測試映像檔與執行容器化依賴服務
Local Development在本地端使用 Docker 重現建置環境

本文將逐一介紹每一種方式。


1️⃣ 部署容器映像檔為 Vercel Function

這是 Docker on Vercel 的主要使用場景。只要在專案根目錄放一個 Dockerfile.vercel(或 Containerfile.vercel),Vercel 就會自動建置映像檔、儲存到 VCR,並以自動擴展的 Function 形式提供服務。

計費方式採用 Active CPU 定價——只有在你的程式碼實際運算時才收費,閒置時自動縮減至零。

何時該用 Docker 而非 Framework Auto-Detect?

  • 你的應用依賴系統函式庫(如 FFmpeg、Chromium)
  • 你用的框架 Vercel 還不支援自動偵測
  • 你希望應用在不同環境中完全一致地執行

快速開始:一個 Dockerfile.vercel

# Dockerfile.vercel
FROM node:26-alpine

RUN npm i -g srvx
WORKDIR /app
COPY server.ts .

# srvx 預設監聽 $PORT
CMD ["srvx", "--prod"]

對應的 server.ts

export default {
  fetch(req: Request) {
    return Response.json({ ip: req.headers.get("x-forwarded-for") })
  }
}

靜態網站也同樣簡單——用 FROM nginx:alpine 並把檔案複製到 /usr/share/nginx/html 即可。

部署指令:

vercel deploy

或直接推送到連結的 Git 倉庫。


2️⃣ 多服務部署

你可以在一個專案中部署多個容器化應用,透過 vercel.json 定義 services 和 rewrites:

{
  "services": {
    "frontend": {
      "root": "frontend/",
      "entrypoint": "Dockerfile.vercel"
    },
    "backend": {
      "root": "backend/",
      "entrypoint": "Dockerfile.vercel"
    }
  },
  "rewrites": [
    { "source": "/api/(.*)", "destination": { "service": "backend" } },
    { "source": "/(.*)", "destination": { "service": "frontend" } }
  ]
}

關鍵行為

行為說明
Port 解析容器預設監聽 port 80,可透過環境變數 PORT 覆蓋
縮減策略生產環境 5 分鐘無流量、Preview 30 秒無流量即縮減至零。縮減前發送 SIGTERM,30 秒緩衝期
可觀測性stdout/stderr 日誌廣播至所有進行中的請求;Vercel Observability 指標與一般 Function 相同
定價與限制容器映像檔 Function 遵循與其他 Vercel Function 相同的 Active CPU 定價模式與限制

3️⃣ Vercel Container Registry (VCR)

VCR 是 Vercel 內建的 OCI 映像檔倉庫,主機位址為 vcr.vercel.com,支援 Docker Registry HTTP API v2,所以 docker pushdocker pulldocker tag 完全相容。

完整映像檔參考格式:

vcr.vercel.com/team-slug/project-slug/my-repository:latest

認證與推送

Vercel 在建置環境中自動提供 VERCEL_OIDC_TOKEN。本地端使用需先執行:

vercel link
vercel env pull

然後登入並推送:

printf '%s' "$VERCEL_OIDC_TOKEN" | docker login vcr.vercel.com \
  --username oidc \
  --password-stdin

docker push vcr.vercel.com/team-slug/project-slug/my-repository:latest

Vercel 建議使用 Docker Buildx 搭配 zstd 壓縮 來優化推送效能。


4️⃣ Vercel Sandbox 與 Docker

Vercel Sandbox 提供隔離的 Linux 環境,與 Docker 有兩種整合方式:

方式 A:在 Sandbox 內執行 Docker

Sandbox 是 Firecracker microVM,擁有自己的核心與檔案系統,且有 sudo 權限,所以可以在內部啟動 Docker daemon。

import { vercelSandbox } from "@vercel/sandbox";

// 安裝 Docker
await vercelSandbox.runCommand({
  sudo: true,
  cmd: "dnf",
  args: ["install", "-y", "docker"],
});

// 啟動 Docker daemon(背景執行)
await vercelSandbox.runCommand({
  sudo: true, cmd: "dockerd", detached: true
});

// 等待 Docker 就緒
await vercelSandbox.runCommand({
  sudo: true,
  cmd: "sh",
  args: ["-lc", "until sudo docker info >/dev/null 2>&1; do sleep 1; done"],
});

// 執行 Redis 容器
await vercelSandbox.runCommand({
  sudo: true,
  cmd: "docker",
  args: ["run", "--rm", "-d", "--name", "redis", "redis:alpine"],
});

// 測試連線
await vercelSandbox.runCommand({
  sudo: true,
  cmd: "docker",
  args: ["exec", "redis", "redis-cli", "PING"],
});

啟用 Persistent Sandbox 後,Docker 安裝與已拉取的映像檔會跨 session 保留。

⚠️ 注意:容器內 HTTPS 憑證問題

Sandbox 內的容器擁有自己的檔案系統與信任存儲,不會繼承 Sandbox 的 proxy CA 憑證。如果容器內需要發送 HTTPS 請求,必須手動掛載憑證:

# 掛載 Vercel proxy CA 憑證到容器內
docker run -v /etc/pki/ca-trust/source/anchors/vercel-proxy-ca.pem:/usr/local/share/ca-certificates/vercel-proxy-ca.crt ...

Debian/Ubuntu 用 update-ca-certificates,Amazon Linux/Fedora/RHEL 用 update-ca-trust

方式 B:從自訂映像檔啟動 Sandbox

將你的映像檔推送到 VCR,然後直接從該映像檔啟動 Sandbox:

const sandbox = await vercelSandbox.create({
  image: "my-repository:latest",
});

Sandbox 啟動時就會包含你映像檔中的所有套件與工具。


5️⃣ 本地端 Docker 開發

Docker 在本地開發中也扮演重要角色。要用 Docker 在本地端測試容器映像檔:

docker build -f Dockerfile.vercel -t my-app .
docker run -p 3000:3000 my-app

若要驗證 Vercel 建置流程,可先執行 vercel build,再執行 vercel deploy --prebuilt,這樣只上傳 .vercel/output 目錄而不需要傳送原始碼。

對於使用零配置框架的專案(如 Next.js),也可以透過 Dockerfile 鎖定依賴版本,確保跨機器建置環境一致。Next.js 官方提供了 Dockerfile 範例


6️⃣ Next.js + Docker 實戰:完整範例

這邊整合官方範例與最新的 standalone 模式,展示一個生產級的 Dockerfile:

next.config.ts

const nextConfig = {
  output: "standalone",  // ← 啟用獨立輸出模式,大幅縮小映像檔
};
export default nextConfig;

Dockerfile(實際部署用,非 Dockerfile.vercel)

# Stage 1: Build
FROM node:22-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

# Stage 2: Runner(極小化)
FROM node:22-alpine AS runner
WORKDIR /app

ENV NODE_ENV=production
ENV PORT=3000
ENV HOSTNAME="0.0.0.0"

RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nextjs

COPY --from=builder --chown=nextjs:nodejs /app/public ./public
RUN mkdir .next && chown nextjs:nodejs .next
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static

USER nextjs
EXPOSE 3000
CMD ["node", "server.js"]

建置與執行:

docker build -t my-next-app .
docker run -p 3000:3000 my-next-app

7️⃣ 使用場景決策樹

你想在 Vercel 用 Docker?
├─ 我要部署一個 containerized 應用
│  └─ 放 Dockerfile.vercel → vercel deploy ✅
├─ 我需要多個服務(frontend + backend)
│  └─ 用 vercel.json 定義 services + rewrites ✅
├─ 我要測試/運行容器(CI/CD, 測試依賴)
│  └─ 用 Vercel Sandbox:
│     ├─ 需要自訂環境 → 推 VCR → boot from image
│     └─ 需要跑 Redis/Postgres → sandbox 內裝 Docker
└─ 我要儲存/分享 container images
   └─ 推送到 VCR(vcr.vercel.com/...)

資源與下一步

資源連結
Container Images 文件vercel.com/docs/container-images
Vercel Container Registryvercel.com/docs/container-registry
Vercel Sandboxvercel.com/docs/sandbox
Next.js Dockerfile 範例github.com/vercel/next.js/examples/with-docker
Vercel Servicesvercel.com/docs/services

本教學根據 2026/7/13 發布的 Vercel 官方 KB 指南編寫,內容以原文為準。