Whisper Docker 설정: Docker에서 OpenAI Whisper를 실행하는 완전 가이드

Whisper Docker 설정: Docker에서 OpenAI Whisper를 실행하는 완전 가이드

Eric King

Eric King

Author


소개

OpenAI Whisper를 Docker 컨테이너에서 실행하면 일관되고 격리된 환경을 제공하여 배포를 단순화하고 “내 컴퓨터에서는 된다”는 문제를 줄일 수 있습니다. Docker를 사용하면 다음이 가능합니다.
  • 어디서나 동일하게 배포 – Docker를 지원하는 모든 플랫폼에서 같은 컨테이너 실행
  • 의존성 격리 – 시스템 패키지와의 충돌 방지
  • 쉬운 확장 – 여러 컨테이너로 병렬 처리
  • 버전 관리 – 특정 Whisper 버전과 설정 고정
  • 배포 단순화 – 한 번의 명령으로 전체 스택 실행
이 가이드는 기본 컨테이너부터 GPU 지원이 포함된 프로덕션 준비 구성까지, Docker에서 Whisper를 설정하는 데 필요한 내용을 모두 다룹니다.

Whisper에 Docker를 쓰는 이유

컨테이너화의 이점

1. 일관성
  • 개발·스테이징·프로덕션에서 동일한 환경
  • 의존성 충돌 없음
  • 재현 가능한 빌드
2. 이식성
  • Docker가 있는 환경이면 어디서나 실행
  • 서버 간 마이그레이션이 쉬움
  • 특정 클라우드에 묶이지 않는 배포
3. 격리
  • 호스트 시스템에 영향 최소화
  • 제거가 간단(컨테이너만 삭제)
  • 격리를 통한 보안 이점
4. 확장성
  • 수평 확장이 용이
  • 컨테이너 간 로드 밸런싱
  • 컨테이너별 리소스 제한
5. DevOps 연동
  • CI/CD 파이프라인과 잘 맞음
  • Kubernetes 배포에 적합
  • 클라우드 컨테이너 서비스와 궁합이 좋음

사전 요구 사항

시작하기 전에 다음을 갖추세요.
  • Docker 설치(버전 20.10 이상)
  • Docker Compose(선택, 다중 컨테이너 구성 시)
  • NVIDIA Docker(선택, GPU 사용 시)
  • Docker 명령에 대한 기본 지식

Docker 설치

macOS:
# Install Docker Desktop from docker.com
# Or using Homebrew
brew install --cask docker
Ubuntu/Debian:
sudo apt update
sudo apt install docker.io docker-compose
sudo systemctl start docker
sudo systemctl enable docker
Windows: docker.com에서 Docker Desktop을 다운로드하세요.

설치 확인

docker --version
docker-compose --version

Whisper용 기본 Dockerfile

간단한 Whisper Dockerfile부터 시작합니다.
FROM python:3.10-slim

# Set working directory
WORKDIR /app

# Install system dependencies
RUN apt-get update && apt-get install -y \
    ffmpeg \
    git \
    && rm -rf /var/lib/apt/lists/*

# Install Python dependencies
RUN pip install --no-cache-dir \
    openai-whisper \
    torch \
    torchaudio

# Copy application code (if you have custom scripts)
# COPY . .

# Set default command
CMD ["whisper", "--help"]

이미지 빌드

docker build -t whisper:latest .

기본 컨테이너 실행

docker run --rm whisper:latest whisper --version

API 서버가 포함된 Dockerfile

프로덕션에서는 API 서버가 필요한 경우가 많습니다. 더 완전한 Dockerfile 예시입니다.
FROM python:3.10-slim

WORKDIR /app

# Install system dependencies
RUN apt-get update && apt-get install -y \
    ffmpeg \
    git \
    curl \
    && rm -rf /var/lib/apt/lists/*

# Install Python dependencies
RUN pip install --no-cache-dir \
    openai-whisper \
    torch \
    torchaudio \
    fastapi \
    uvicorn \
    python-multipart

# Create directories for audio and output
RUN mkdir -p /app/audio /app/output

# Copy application code
COPY app.py .
COPY requirements.txt .

# Expose API port
EXPOSE 8000

# Health check
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
    CMD curl -f http://localhost:8000/health || exit 1

# Run API server
CMD ["uvicorn", "app.py:app", "--host", "0.0.0.0", "--port", "8000"]

API 서버 예시(app.py)

from fastapi import FastAPI, File, UploadFile
from fastapi.responses import JSONResponse
import whisper
import os

app = FastAPI()

# Load Whisper model (can be configured via env)
model_name = os.getenv("WHISPER_MODEL", "base")
model = whisper.load_model(model_name)

@app.get("/health")
def health():
    return {"status": "healthy"}

@app.post("/transcribe")
async def transcribe(file: UploadFile = File(...)):
    # Save uploaded file
    file_path = f"/app/audio/{file.filename}"
    with open(file_path, "wb") as f:
        content = await file.read()
        f.write(content)
    
    # Transcribe
    result = model.transcribe(file_path)
    
    # Clean up
    os.remove(file_path)
    
    return JSONResponse(content={
        "text": result["text"],
        "language": result["language"]
    })

requirements.txt

fastapi==0.104.1
uvicorn[standard]==0.24.0
python-multipart==0.0.6
openai-whisper
torch
torchaudio

Docker Compose 설정

여러 서비스로 구성된 전체 스택에는 Docker Compose를 사용합니다.

docker-compose.yml

version: '3.8'

services:
  whisper-api:
    build: .
    container_name: whisper-api
    ports:
      - "8000:8000"
    volumes:
      - ./audio:/app/audio
      - ./output:/app/output
    environment:
      - WHISPER_MODEL=base
      - CUDA_VISIBLE_DEVICES=0
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s

  # Optional: Redis for queue management
  redis:
    image: redis:7-alpine
    container_name: whisper-redis
    ports:
      - "6379:6379"
    volumes:
      - redis-data:/data
    restart: unless-stopped

volumes:
  redis-data:

Docker Compose로 실행

# Start services
docker-compose up -d

# View logs
docker-compose logs -f whisper-api

# Stop services
docker-compose down

Docker에서 GPU 지원

GPU 가속을 사용하려면 NVIDIA Container Toolkit(NVIDIA Docker) 런타임이 필요합니다.

NVIDIA Docker 설치

Ubuntu/Debian:
# Add NVIDIA Docker repository
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | \
    sudo tee /etc/apt/sources.list.d/nvidia-docker.list

# Install
sudo apt-get update
sudo apt-get install -y nvidia-docker2
sudo systemctl restart docker

GPU 지원 Dockerfile

FROM nvidia/cuda:11.8.0-cudnn8-runtime-ubuntu22.04

WORKDIR /app

# Install Python
RUN apt-get update && apt-get install -y \
    python3.10 \
    python3-pip \
    ffmpeg \
    git \
    curl \
    && rm -rf /var/lib/apt/lists/*

# Install Python dependencies with CUDA support
RUN pip3 install --no-cache-dir \
    openai-whisper \
    torch \
    torchaudio \
    --index-url https://download.pytorch.org/whl/cu118

# Install API dependencies
RUN pip3 install --no-cache-dir \
    fastapi \
    uvicorn \
    python-multipart

COPY app.py .
EXPOSE 8000

CMD ["uvicorn", "app.py:app", "--host", "0.0.0.0", "--port", "8000"]

GPU로 실행

# Using docker run
docker run --gpus all -p 8000:8000 whisper-gpu:latest

# Using docker-compose

GPU용 docker-compose.yml

version: '3.8'

services:
  whisper-api:
    build: .
    container_name: whisper-api-gpu
    runtime: nvidia
    environment:
      - NVIDIA_VISIBLE_DEVICES=all
    ports:
      - "8000:8000"
    volumes:
      - ./audio:/app/audio
      - ./output:/app/output
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities: [gpu]

프로덕션용 최적화 Dockerfile

최적화가 적용된 프로덕션 준비 Dockerfile 예시입니다.
# Multi-stage build for smaller image
FROM python:3.10-slim as builder

WORKDIR /app

# Install build dependencies
RUN apt-get update && apt-get install -y \
    gcc \
    g++ \
    git \
    && rm -rf /var/lib/apt/lists/*

# Install Python packages
COPY requirements.txt .
RUN pip install --user --no-cache-dir -r requirements.txt

# Final stage
FROM python:3.10-slim

WORKDIR /app

# Install runtime dependencies only
RUN apt-get update && apt-get install -y \
    ffmpeg \
    curl \
    && rm -rf /var/lib/apt/lists/* \
    && apt-get clean

# Copy Python packages from builder
COPY --from=builder /root/.local /root/.local

# Make sure scripts in .local are usable
ENV PATH=/root/.local/bin:$PATH

# Create non-root user for security
RUN useradd -m -u 1000 whisper && \
    mkdir -p /app/audio /app/output && \
    chown -R whisper:whisper /app

USER whisper

# Copy application code
COPY --chown=whisper:whisper app.py .
COPY --chown=whisper:whisper requirements.txt .

EXPOSE 8000

HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \
    CMD curl -f http://localhost:8000/health || exit 1

CMD ["uvicorn", "app.py:app", "--host", "0.0.0.0", "--port", "8000"]

멀티 스테이지 빌드의 이점

  • 더 작은 이미지 – 최종 이미지에는 런타임 의존성만 포함
  • 더 빠른 빌드 – 빌드 의존성을 별도로 캐시
  • 보안 강화 – 비 root 사용자, 공격 표면 축소

환경 변수 구성

환경 변수로 Docker 설정을 유연하게 만듭니다.

Dockerfile

FROM python:3.10-slim

WORKDIR /app

RUN apt-get update && apt-get install -y \
    ffmpeg \
    git \
    curl \
    && rm -rf /var/lib/apt/lists/*

RUN pip install --no-cache-dir \
    openai-whisper \
    torch \
    torchaudio \
    fastapi \
    uvicorn \
    python-multipart

COPY app.py .

# Environment variables with defaults
ENV WHISPER_MODEL=base
ENV MAX_FILE_SIZE=100MB
ENV LOG_LEVEL=INFO

EXPOSE 8000

CMD ["uvicorn", "app.py:app", "--host", "0.0.0.0", "--port", "8000"]

환경 변수가 포함된 docker-compose.yml

version: '3.8'

services:
  whisper-api:
    build: .
    ports:
      - "8000:8000"
    volumes:
      - ./audio:/app/audio
      - ./output:/app/output
    environment:
      - WHISPER_MODEL=small
      - MAX_FILE_SIZE=200MB
      - LOG_LEVEL=DEBUG
      - CUDA_VISIBLE_DEVICES=0
    env_file:
      - .env
    restart: unless-stopped

.env 파일

WHISPER_MODEL=small
MAX_FILE_SIZE=200MB
LOG_LEVEL=INFO
CUDA_VISIBLE_DEVICES=0

볼륨 관리

적절한 볼륨 구성으로 데이터를 영구 저장할 수 있습니다.

볼륨이 포함된 docker-compose.yml

version: '3.8'

services:
  whisper-api:
    build: .
    ports:
      - "8000:8000"
    volumes:
      # Bind mount for development
      - ./audio:/app/audio
      - ./output:/app/output
      
      # Named volume for model cache (persists across containers)
      - whisper-models:/root/.cache/whisper
      
      # Config volume
      - ./config:/app/config:ro
    environment:
      - WHISPER_MODEL=base

volumes:
  whisper-models:
    driver: local

이점

  • 모델 캐시 – 한 번 다운로드하면 컨테이너 간 재사용
  • 데이터 지속성 – 컨테이너를 재시작해도 출력 파일 유지
  • 구성 유연성 – 이미지를 다시 빌드하지 않고 설정 변경

헬스 체크와 모니터링

헬스 체크가 포함된 Dockerfile

FROM python:3.10-slim

WORKDIR /app

RUN apt-get update && apt-get install -y \
    ffmpeg \
    curl \
    && rm -rf /var/lib/apt/lists/*

RUN pip install --no-cache-dir \
    openai-whisper \
    fastapi \
    uvicorn

COPY app.py .

# Health check endpoint
HEALTHCHECK --interval=30s \
            --timeout=10s \
            --start-period=40s \
            --retries=3 \
            CMD curl -f http://localhost:8000/health || exit 1

EXPOSE 8000
CMD ["uvicorn", "app.py:app", "--host", "0.0.0.0", "--port", "8000"]

헬스 체크 엔드포인트

from fastapi import FastAPI
import whisper

app = FastAPI()
model = whisper.load_model("base")

@app.get("/health")
def health():
    try:
        # Quick test transcription
        return {"status": "healthy", "model": "base"}
    except Exception as e:
        return {"status": "unhealthy", "error": str(e)}, 503

일반적인 사용 사례

사용 사례 1: 개발 환경

version: '3.8'

services:
  whisper-dev:
    build:
      context: .
      dockerfile: Dockerfile.dev
    volumes:
      - .:/app
      - /app/__pycache__
    ports:
      - "8000:8000"
    environment:
      - WHISPER_MODEL=tiny
      - DEBUG=true
    command: uvicorn app.py:app --reload --host 0.0.0.0 --port 8000

사용 사례 2: 큐가 있는 프로덕션

version: '3.8'

services:
  whisper-api:
    build: .
    ports:
      - "8000:8000"
    environment:
      - REDIS_URL=redis://redis:6379
      - WHISPER_MODEL=small
    depends_on:
      - redis
      - worker

  worker:
    build: .
    command: python worker.py
    environment:
      - REDIS_URL=redis://redis:6379
      - WHISPER_MODEL=small
    volumes:
      - ./audio:/app/audio
    depends_on:
      - redis

  redis:
    image: redis:7-alpine
    volumes:
      - redis-data:/data

volumes:
  redis-data:

사용 사례 3: 다중 모델 구성

version: '3.8'

services:
  whisper-fast:
    build: .
    ports:
      - "8001:8000"
    environment:
      - WHISPER_MODEL=tiny
      - PORT=8000

  whisper-balanced:
    build: .
    ports:
      - "8002:8000"
    environment:
      - WHISPER_MODEL=base
      - PORT=8000

  whisper-accurate:
    build: .
    ports:
      - "8003:8000"
    environment:
      - WHISPER_MODEL=large
      - PORT=8000

모범 사례

1. 구체적인 베이스 이미지 사용

나쁜 예:
FROM python:latest
좋은 예:
FROM python:3.10-slim

2. 레이어 최소화

나쁜 예:
RUN apt-get update
RUN apt-get install -y ffmpeg
RUN apt-get install -y git
좋은 예:
RUN apt-get update && apt-get install -y \
    ffmpeg \
    git \
    && rm -rf /var/lib/apt/lists/*

3. .dockerignore 사용

.dockerignore를 만듭니다.
__pycache__
*.pyc
*.pyo
*.pyd
.Python
.env
.venv
venv/
.git
.gitignore
README.md
*.md
.DS_Store

4. 리소스 제한 설정

services:
  whisper-api:
    build: .
    deploy:
      resources:
        limits:
          cpus: '2'
          memory: 4G
        reservations:
          cpus: '1'
          memory: 2G

5. 헬스 체크 사용

프로덕션 컨테이너에는 항상 헬스 체크를 포함하세요.
HEALTHCHECK --interval=30s --timeout=10s CMD curl -f http://localhost:8000/health || exit 1

6. 비 root 사용자

RUN useradd -m -u 1000 whisper
USER whisper

7. 모델 캐시

다운로드한 모델은 볼륨으로 캐시합니다.
volumes:
  - whisper-models:/root/.cache/whisper

일반적인 문제 해결

문제 1: 컨테이너가 즉시 종료됨

증상: 시작 직후 종료됨
해결:
# Check logs
docker logs <container-id>

# Run interactively to debug
docker run -it whisper:latest /bin/bash

문제 2: GPU를 사용할 수 없음

증상: 컨테이너에서 GPU가 감지되지 않음
해결:
# Verify NVIDIA Docker
docker run --rm --gpus all nvidia/cuda:11.8.0-base-ubuntu22.04 nvidia-smi

# Check runtime
docker info | grep -i runtime

문제 3: 메모리 부족

증상: 컨테이너가 메모리 부족으로 실패
해결:
# Increase memory limit
deploy:
  resources:
    limits:
      memory: 8G

문제 4: 모델 다운로드가 느리거나 매번 발생

증상: 컨테이너를 시작할 때마다 모델을 다시 받음
해결:
# Use volume for model cache
volumes:
  - whisper-models:/root/.cache/whisper

문제 5: 권한 거부

증상: 볼륨에 쓸 수 없음
해결:
# Fix permissions in Dockerfile
RUN chown -R whisper:whisper /app

성능 최적화

1. 모델 사전 로드

Dockerfile에서 빌드 시 모델을 받습니다.
# Download model during build
RUN python -c "import whisper; whisper.load_model('base')"

2. faster-whisper 사용

성능 향상을 위해 faster-whisper를 사용합니다.
RUN pip install --no-cache-dir faster-whisper

3. 멀티스레딩

워커 프로세스를 구성합니다.
CMD ["uvicorn", "app.py:app", "--host", "0.0.0.0", "--port", "8000", "--workers", "4"]

4. 리소스 할당

부하에 맞게 CPU와 메모리를 할당합니다.
deploy:
  resources:
    limits:
      cpus: '4'
      memory: 8G

보안 고려 사항

1. 공식 베이스 이미지 사용

FROM python:3.10-slim  # Official Python image

2. 취약점 스캔

docker scan whisper:latest

3. 이미지 업데이트

베이스 이미지와 의존성을 정기적으로 업데이트합니다.
FROM python:3.10-slim  # Use latest patch version
RUN pip install --upgrade pip

4. 네트워크 접근 제한

services:
  whisper-api:
    build: .
    networks:
      - internal
    # No external ports if accessed via reverse proxy

결론

Whisper를 Docker로 패키징하면 음성-텍스트 변환을 견고하고 확장 가능하게 운영할 수 있습니다. 핵심 요약은 다음과 같습니다.
  1. 단순하게 시작 – 기본 Dockerfile부터
  2. Docker Compose 활용 – 다중 서비스 스택 단순화
  3. GPU 활성화 – 프로덕션 성능이 필요할 때
  4. 모범 사례 준수 – 보안, 최적화, 모니터링
  5. 충분히 테스트 – 프로덕션 배포 전
Docker를 올바르게 구성하면 로컬 개발부터 클라우드 프로덕션까지 환경에 관계없이 Whisper를 일관되게 배포할 수 있습니다.

다음 단계

  • 첫 컨테이너 빌드 – 기본 Dockerfile로 시작
  • GPU 지원 추가 – NVIDIA GPU가 있는 경우
  • Docker Compose 구성 – 전체 애플리케이션 스택용
  • 클라우드 배포 – ECS, GKE, AKS 등 컨테이너 서비스
추가 배포 전략은 Whisper Cloud DeploymentWhisper API vs Local Deployment 가이드를 참고하세요.

지금 무료로 체험하기

지금 바로 저희 AI 음성·오디오·영상 서비스를 체험해 보세요! 고정밀 음성-텍스트 전사, 다국어 번역, 지능형 화자 분리를 제공할 뿐 아니라, 동영상 자동 자막 생성, 오디오·영상 콘텐츠의 스마트 편집, 음성·영상 동기 분석까지 지원합니다. 회의 기록, 숏폼 영상 제작, 팟캐스트 제작 등 모든 상황을 완전히 커버합니다. 지금 무료 체험을 시작해 보세요!

온라인 사운드 to 텍스트무료 사운드 to 텍스트사운드 텍스트 변환기사운드 to 텍스트 MP3사운드 to 텍스트 WAV사운드 to 텍스트 (타임스탬프 포함)회의용 사운드-텍스트 변환Sound to Text Multi Language사운드 to 텍스트 자막WAV를 텍스트로 변환음성 텍스트 변환온라인 음성 텍스트 변환음성 텍스트 변환MP3 텍스트 변환음성 녹음을 텍스트로 변환온라인 음성 입력타임스탬프가 있는 음성 텍스트 변환실시간 음성 텍스트 변환긴 오디오 음성 텍스트 변환비디오 음성 텍스트 변환YouTube 음성 텍스트 변환동영상 편집 음성 텍스트 변환자막 음성 텍스트 변환팟캐스트 음성 텍스트 변환인터뷰 음성 텍스트 변환인터뷰 오디오 텍스트 변환녹음 음성 텍스트 변환회의 음성 텍스트 변환강의 음성 텍스트 변환음성 메모 텍스트 변환다국어 음성 텍스트 변환정확한 음성 텍스트 변환빠른 음성 텍스트 변환Premiere Pro 음성 텍스트 변환 대안DaVinci 음성 텍스트 변환 대안VEED 음성 텍스트 변환 대안InVideo 음성 텍스트 변환 대안Otter.ai 음성 텍스트 변환 대안Descript 음성 텍스트 변환 대안Trint 음성 텍스트 변환 대안Rev 음성 텍스트 변환 대안Sonix 음성 텍스트 변환 대안Happy Scribe 음성 텍스트 변환 대안Zoom 음성 텍스트 변환 대안Google Meet 음성 텍스트 변환 대안Microsoft Teams 음성 텍스트 변환 대안Fireflies.ai 음성 텍스트 변환 대안Fathom 음성 텍스트 변환 대안FlexClip 음성 텍스트 변환 대안Kapwing 음성 텍스트 변환 대안Canva 음성 텍스트 변환 대안긴 오디오 음성 텍스트 변환AI 음성 텍스트 변환무료 음성 텍스트 변환광고 없는 음성 텍스트 변환시끄러운 오디오 음성 텍스트 변환시간이 있는 음성 텍스트 변환오디오에서 자막 생성팟캐스트 전사 온라인고객 통화 전사TikTok 음성을 텍스트로TikTok 오디오를 텍스트로YouTube 음성 텍스트 변환YouTube 오디오 텍스트 변환음성 메모 텍스트 변환WhatsApp 음성 메시지 텍스트 변환Telegram 음성 메시지 텍스트 변환Discord 통화 전사Twitch 음성 텍스트 변환Skype 음성 텍스트 변환Messenger 음성 텍스트 변환LINE 음성 메시지 텍스트 변환Vlog 전사 텍스트 변환설교 오디오 텍스트 변환음성 텍스트 변환오디오 텍스트 변환음성 노트 텍스트 변환음성 입력회의 음성 입력YouTube 음성 입력말해서 입력핸즈프리 입력음성을 단어로음성을 단어로온라인 음성 텍스트 변환Online Transcription Software회의 음성 텍스트 변환빠른 음성 텍스트 변환Real Time Speech to TextLive Transcription AppTikTok 음성 텍스트 변환TikTok 음성 텍스트 변환말한 것을 글로음성을 텍스트로Talk to Text FreeTalk to Text OnlineTalk to Text for YouTubeTalk to Text for SubtitlesTalk to Text for Content CreatorsTalk to Text for Meetings오디오를 타이핑으로소리를 텍스트로음성 작성 도구음성 작성 도구음성 입력법률 전사 도구의료 음성 받아쓰기 도구일본어 오디오 전사한국어 회의 전사회의 전사 도구회의 오디오 텍스트 변환강의 텍스트 변환기강의 오디오 텍스트 변환동영상 텍스트 전사TikTok 자막 생성기콜센터 전사Reels 오디오 텍스트 변환 도구MP3 텍스트 전사WAV 파일 텍스트 전사CapCut 음성 텍스트 변환CapCut 음성 텍스트 변환Voice to Text in English영어 오디오 텍스트 변환Voice to Text in SpanishVoice to Text in French프랑스어 오디오 텍스트 변환Voice to Text in German독일어 오디오 텍스트 변환Voice to Text in Japanese일본어 오디오 텍스트 변환Voice to Text in Korean한국어 오디오 텍스트 변환Voice to Text in PortugueseVoice to Text in ArabicVoice to Text in ChineseVoice to Text in HindiVoice to Text in RussianWeb Voice Typing ToolVoice Typing Website