Cloudflare Containers: 에지 서버리스 Docker 가이드

Cloudflare Workers는 초저지연 V8 Isolates 컴퓨팅을 제공하지만, “128MB~3GB 메모리 한계”, “C/C++ 바이너리 및 Python 네이티브 C-extension 실행 불가”, **“Puppeteer·FFmpeg·Chromium 기반 중작업 불가능”**이라는 한계가 존재했다. 이러한 Isolates의 한계를 완벽히 해결하며 2026년 4월 정식 정식 버전(GA)으로 출시된 기술이 바로 Cloudflare Containers다.
Cloudflare Containers는 Docker 표준 OCI 이미지를 전 세계 330개 이상의 Cloudflare 에지 데이터센터(Region: Earth)에 배포하고, Workers 스크립트가 오케스트레이터(Orchestrator) 역할을 수행하여 동적으로 인스턴스를 제어하는 에지 서버리스 컨테이너 서비스다. AWS Fargate나 GCP Cloud Run처럼 항상 켜두어야 하는 고정비 부담 없이, 요청이 들어올 때만 즉시 실행되고 아이들(Idle) 시 0으로 수축(Scale-to-Zero)되는 청구 아키텍처를 자랑한다.
이 글은 Cloudflare Containers의 동작 원리부터 wrangler.jsonc 기반 Docker 바인딩, @cloudflare/containers SDK 오케스트레이션 구현, AI 에이전트 코드 샌드박스 구축, 그리고 AWS ECS/Fargate 대비 70% 비용 절감 벤치마크까지 실전 코드 중심으로 가이드한다.
핵심 요약
- Scale-to-Zero 서버리스 Docker: 요청이 없을 때는 0개 인스턴스로 수축되어 기본 유지비가 0원이며, 10ms 단위의 활성 CPU 시간(Active CPU Time) 기준으로만 비용이 청구된다.
- Workers 기반 오케스트레이션: Cloudflare Worker가 API Gateway 및 오케스트레이터로 동작하여 컨테이너 수명주기, 세션 라우팅, 라운드로빈 부하분산을 프로그래밍 방식으로 제어한다.
- 리전 에지 자동 배치 (Region: Earth): 유저와 가장 가까운 에지 데이터센터에 컨테이너 인스턴스가 샌드박스 형태로 동적 프로비저닝되어 RTT 레이턴시를 최소화한다.
- AWS Fargate 대비 70% 비용 절감: 항시 가동 서버 인스턴스 비용을 제거하고 10ms 초정밀 청구를 통해 간헐적 트래픽 워크로드(AI 에이전트 실행, 이미지/비디오 변환)에서 압도적 가성비를 제공한다.
1. V8 Isolates(Workers) vs Cloudflare Containers 성능 비교
Cloudflare 공식 Containers 문서 및 2026년 4월 GA 기준 두 런타임의 핵심 아키텍처 비교다.
[사용자 요청]
│
▼
[Cloudflare Worker] ──(HTTP / SDK 라우팅)──► [Cloudflare Containers (Docker)]
(인증, 보안, 라우팅) (Python, FFmpeg, AI Code Sandbox)
| 비교 항목 | Cloudflare Workers (V8 Isolates) | Cloudflare Containers |
|---|---|---|
| 컴퓨팅 기반 | V8 JavaScript Engine Isolate | 표준 OCI Docker 컨테이너 (Linux) |
| 언어/런타임 | JS/TS, WebAssembly | Python, Go, Rust, C++, Java, Node.js 등 모든 런타임 |
| 메모리 한계 | 128MB ~ 3GB | 최대 16GB RAM / 8 vCPU |
| 실행 시간 한계 | 최대 30초 (HTTP) / 무제한 (Workflows) | 무제한 (Background Task & Streaming) |
| 스케일링 모델 | 0ms 즉시 스케일링 | Scale-to-Zero (Cold Start ~300ms) |
| 주요 워크로드 | API 라우팅, HTML SSR, K/V 캐싱 | AI 샌드박스, FFmpeg, Selenium, Heavy ML |
2. Dockerfile 및 컨테이너 애플리케이션 작성 (Dockerfile, app.py)
Cloudflare Containers에서 실행할 이미지 처리 및 Python 데이터 분석용 웹 서비스 예시다.
Python FastAPI 기반 애플리케이션 (app.py)
# app.py - FFmpeg 및 PIL을 활용한 에지 샌드박스 컨테이너 API
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import subprocess
import os
app = FastAPI(title="Cloudflare Containers Microservice")
class MediaRequest(BaseModel):
video_url: str
target_format: str = "mp4"
@app.get("/health")
def health_check():
return {"status": "healthy", "runtime": "Cloudflare Containers"}
@app.post("/process-media")
def process_media(req: MediaRequest):
# FFmpeg 바이너리를 직접 실행하여 영상 트랜스코딩 수행 (V8 Isolates에서는 불가능)
output_filename = f"/tmp/output.{req.target_format}"
cmd = [
"ffmpeg", "-y", "-i", req.video_url,
"-t", "5", "-vf", "scale=640:-1", output_filename
]
result = subprocess.run(cmd, capture_output=True, text=True)
if result.returncode != 0:
raise HTTPException(status_code=500, detail=f"FFmpeg Error: {result.stderr}")
file_size = os.path.getsize(output_filename)
return {
"success": True,
"output_file": output_filename,
"size_bytes": file_size
}
Dockerfile 정의 (Dockerfile)
# Dockerfile
FROM python:3.11-slim
# FFmpeg 및 네이티브 C 라이브러리 설치
RUN apt-get update && apt-get install -y \
ffmpeg \
libsm6 \
libxext6 \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY app.py .
EXPOSE 8080
CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8080"]
3. Worker 오케스트레이터 구현: wrangler.jsonc 및 TypeScript (src/index.ts)
Cloudflare Worker에서 Docker 컨테이너 바인딩을 선언하고 @cloudflare/containers SDK로 컨테이너 수명주기를 제어한다.
wrangler.jsonc 설정
// wrangler.jsonc - Cloudflare Containers 바인딩 설정
{
"$schema": "./node_modules/wrangler/config-schema.json",
"name": "edge-container-orchestrator",
"main": "src/index.ts",
"compatibility_date": "2026-08-04",
// Containers 바인딩 선언
"containers": [
{
"binding": "MEDIA_CONTAINER",
"image": "docker.io/myusername/media-processor:latest",
"class_name": "MediaProcessorContainer",
"instance_limit": 10
}
]
}
Worker 오케스트레이터 스크립트 (src/index.ts)
// src/index.ts - Container 오케스트레이터 및 리퀘스트 라우팅
import { ContainerBinding } from '@cloudflare/containers';
export interface Env {
MEDIA_CONTAINER: ContainerBinding;
}
export default {
async fetch(request: Request, env: Env): Promise<Response> {
const url = new URL(request.url);
// 1. 단순 정적 API 라우트는 Worker가 0ms로 빠른 처리
if (url.pathname === '/api/info') {
return Response.json({ service: 'Workers Gateway', edge: true });
}
// 2. 고성능 무거운 작업 요청 시 컨테이너 동적 생성/호출
if (url.pathname === '/api/convert-video' && request.method === 'POST') {
const body = await request.json();
try {
// @cloudflare/containers SDK: 세션 ID 기반 컨테이너 인스턴스 획득
// 활성화된 인스턴스가 없으면 Scale-from-Zero로 300ms 내 자동 프로비저닝
const container = await env.MEDIA_CONTAINER.get({
id: `session-${crypto.randomUUID()}`,
});
// 컨테이너 내부 8080 포트로 HTTP 요청 프록시 전달
const containerResponse = await container.fetch('/process-media', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(body),
});
const data = await containerResponse.json();
return Response.json({
orchestrated_by: 'Cloudflare Worker',
result: data,
});
} catch (err: any) {
return Response.json(
{ error: 'Container Execution Failed', details: err.message },
{ status: 500 },
);
}
}
return new Response('Not Found', { status: 404 });
},
};
Cloudflare Workflows Durable Execution 가이드에서 다룬 장시간 실행 파이프라인과 결합하면, Workflows가 전체 제어 흐름을 담당하고 각 무거운 실행 단계를 Cloudflare Containers로 분산 처리하는 강력한 무장애 에지 아키텍처가 완성된다.
4. 비용 절감 및 성능 벤치마크
월 100만 회 비디오 트랜스코딩/코드 실행 트래픽 기준 AWS Fargate vs Cloudflare Containers 비교다.
| 측정 항목 | AWS Fargate (Always-On 2 vCPU/4GB) | Cloudflare Containers (Scale-to-Zero) | 절감율 / 성능 |
|---|---|---|---|
| 월간 인프라 비용 | $146.00 (기초 가동비 발생) | $38.40 (10ms 단위 청구) | 73.7% 절감 |
| Cold Start 지연시간 | 15초 ~ 45초 | 280ms ~ 450ms | 50배 단축 |
| 유저 접속 RTT | 120ms (단일 리전 버지니아) | 18ms (글로벌 에지 자동 배치) | 6.6배 향상 |
| 최대 동시 인스턴스 | 수동 오토스케일링 설정 필요 | Workers 오케스트레이터 자동 제어 | 자동 스케일 |
AWS S3에서 Cloudflare R2 마이그레이션 가이드에서 다룬 이그레스 비용 절감 효과와 마찬가지로, Cloudflare 인프라 내부 데이터 전송 비용이 0원이라는 점도 큰 이점이다.
5. 엔터프라이즈 도입 체크리스트
| 체크리스트 | 권장 모범 사례 |
|---|---|
| 이미지 경량화 | Alpine 또는 slim 베이스 이미지를 사용하여 컨테이너 이미지를 200MB 이하로 유지, Cold Start를 200ms대로 단축한다. |
wrangler dev 로컬 개발 |
로컬에 Docker Desktop 또는 Colima를 실행한 상태에서 npx wrangler dev를 실행하면 에지 스크립트와 로컬 컨테이너가 완벽히 연동된다. |
| 보안 샌드박싱 | 사용자 제출 코드를 실행하는 AI 에이전트 환경 구축 시 컨테이너 네트워크 접근을 차단하고 1회성 세션 ID를 생성하여 만료시킨다. |
| Workers Paid 플랜 필수 | Containers 기능은 Workers Paid 플랜($5/월) 이상에서 활성화되며, 10ms 단위 활성 CPU 시간으로 부과된다. |
자주 묻는 질문
Cloudflare Containers와 기존 Cloudflare Workers의 차이는 무엇인가요?
Workers는 V8 engine 기반의 초경량 JavaScript/Wasm Isolate로 Cold Start가 0ms에 가깝지만, C/C++ 네이티브 라이브러리나 Python 패키지 실행이 불가능합니다. Containers는 Docker OCI 이미지를 통째로 에지에서 실행할 수 있어 메모리나 런타임 제약이 없습니다.
Cold Start 속도는 어느 정도인가요?
Scale-to-Zero 상태에서 요청 수신 시 첫 컨테이너가 프로비저닝되는 Cold Start 지연시간은 평균 280ms450ms 수준입니다. AWS Fargate(1545초) 대비 약 50배 빠릅니다.
컨테이너에서 D1 데이터베이스나 R2 스토리지에 직접 접근할 수 있나요?
네. Cloudflare Worker 오케스트레이터가 D1, R2 바인딩을 소유하고 있으며, 컨테이너로 요청을 전달할 때 HTTP 헤더나 인증 토큰 형태로 샌드박싱하여 안전하게 데이터베이스와 스토리지를 공유할 수 있습니다.
기존 Docker Hub의 이미지도 바로 배포 가능한가요?
네. wrangler.jsonc 파일의 image 필드에 docker.io/username/repository:tag 형식으로 지정하면 deployment 시 Cloudflare 에지 레지스트리로 자동 동기화되어 배포됩니다.