effidevFlutter · Cloudflare 엣지 · 클라우드 비용 최적화
한국어

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

Cloudflare Containers 기반 서버리스 Docker 및 Workers 오케스트레이션 아키텍처

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 에지 레지스트리로 자동 동기화되어 배포됩니다.