FastAPI + Docker 종합 가이드 (Medium)
Source: https://medium.com/@alidu143/containerizing-fastapi-app-with-docker-a-comprehensive-guide-416521b2457c Type: Article By: Alidu Abubakari Published: 2023-06-22 Valid as of: 2026-04-26
핵심 Takeaway
- FastAPI: 모던 고성능 Python 웹 프레임워크 (Starlette 기반 비동기 구조)
- 강점: 자동 타입 검증, 자동 Swagger UI + ReDoc 문서 생성, OAuth2/JWT/API Key 내장 보안
- Docker: 일관된 실행 환경으로 “내 컴퓨터에서는 잘 되는데”문제 해결 (이식성·재현성)
- 이미지 최적화: Python slim 베이스 + .dockerignore로 불필요 파일 제외 + RUN 명령 병합 (레이어 축소)
- 보안: 최신 베이스 이미지 사용 + 최소 권한 원칙 (non-root 사용자) + 이미지 스캔 (취약점)
- 네트워크 격리: Docker 내부 네트워크로 서비스 간 통신, 외부 접근 제한
- 배포 옵션: Local (Docker Desktop) → Orchestration (K8s, Docker Swarm) → Cloud (AWS ECS, Google GKE, Azure ACI)
상세 요약
FastAPI의 특징 및 장점
FastAPI란? 현대적이고 빠른 Python 웹 API 프레임워크. 비동기 입출력(I/O) 중심의 고성능 설계.
주요 강점:
| 특징 | 설명 |
|---|---|
| 성능 | Starlette의 비동기 재단 → 빠른 요청 처리 + 동시성 지원 |
| 타입 힌트 | Python 3.7+ 타입 힌트로 자동 유효성 검증 (JSON 구조 + 데이터형 확인) |
| 문서 생성 | /docs (Swagger UI) + /redoc (ReDoc) 자동 생성 (OpenAPI 기반) |
| 보안 | OAuth2, API Key, JWT 토큰 내장 지원 |
| 비동기 지원 | async def, await 문법으로 I/O 바운드 작업 효율화 |
| 테스트 | TestClient로 간단한 단위 테스트 |
개발 생산성:
- 보일러플레이트 코드 최소화
- 타입 검증 + 문서화가 통합되어 있어 별도 작업 불필요
Docker의 필요성과 이점
문제: “내 컴퓨터에서는 되는데?”
- 개발 환경(Mac/Windows) vs 프로덕션 환경(Linux) 상이
- 의존성 버전 차이 (Python 3.9 vs 3.11, 라이브러리 버전)
- 설정 파일, 환경변수 미처리
Docker의 해결책:
| 이점 | 설명 |
|---|---|
| 이식성 (Portability) | 같은 이미지 → 어디서나 동일한 실행 환경 (OS 무관) |
| 재현성 (Reproducibility) | Dockerfile = 인프라 코드화 → git으로 버전 관리 |
| 확장성 (Scalability) | 여러 컨테이너 인스턴스 병렬 실행 (부하 분산) |
| 의존성 격리 | 호스트 시스템과 독립적 → 충돌 없음 |
| DevOps 통합 | CI/CD 파이프라인에 자연스럽게 통합 (이미지 빌드 → 테스트 → 레지스트리 푸시) |
프로젝트 구조
표준 FastAPI 디렉토리 구조:
fastapi-docker-project/
├── main.py # 진입점 (또는 app/main.py)
├── requirements.txt # 의존성 목록
├── Dockerfile # 이미지 정의
├── .dockerignore # Docker 빌드에서 제외할 파일
└── app/ # 애플리케이션 모듈
├── __init__.py
└── routes.py # 엔드포인트 정의
Dockerfile 최적화 패턴
기본 Dockerfile:
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
EXPOSE 8080
CMD ["uvicorn", "fastapi:app", "--host", "0.0.0.0", "--port", "8080"]최적화 1: .dockerignore 활용
__pycache__
*.pyc
.git
.gitignore
.env
.venv/
tests/
README.md
효과: 빌드 컨텍스트 크기 축소 → 빌드 속도 개선
최적화 2: RUN 명령 병합
# ❌ 나쁜 예: 3개 레이어
RUN apt-get update
RUN apt-get install -y build-essential
RUN apt-get clean
# ✅ 좋은 예: 1개 레이어
RUN apt-get update && \
apt-get install -y build-essential && \
apt-get clean효과: 이미지 크기 축소 (중간 결과 저장 방지)
최적화 3: 베이스 이미지 선택
python:3.9: 전체 개발 환경 (용량 큼)python:3.9-slim: 필수만 포함 (더 가벼움) ← 권장python:3.9-alpine: 초소형 (호환성 문제 가능)
보안 고려사항
1. 최신 베이스 이미지 사용
FROM python:3.9-slim # 정기 업데이트- 보안 패치 포함
- 알려진 취약점 수정
2. 최소 권한 원칙 (Non-root User)
RUN useradd -m appuser
USER appuser컨테이너가 root로 실행되지 않도록 → 보안 강화
3. 이미지 스캔 (Vulnerability Scanning)
docker scan myimage- 의존성의 알려진 CVE 확인
- 위험 라이브러리 식별 및 업데이트
4. 네트워크 격리
- Docker 내부 네트워크: 서비스 간 통신 (외부 미노출)
- 필요한 포트만 노출 (예: 8080)
빌드 및 실행
이미지 빌드:
docker build -t fastapi-app .컨테이너 실행:
docker run -p 8000:8000 fastapi-app-p 8000:8000: 호스트 포트 8000 → 컨테이너 포트 8000
확인:
curl http://localhost:8000/docs # Swagger UI배포 옵션 (발전 순서)
1단계: Local
- Docker Desktop (Mac/Windows)
- Docker CLI (Linux)
2단계: Orchestration
- Kubernetes (K8s): 복잡하나 강력한 관리
- Docker Swarm: 간단한 대안
3단계: Cloud 서비스
- AWS ECS: 관리형 컨테이너 오케스트레이션
- Google GKE: Google Kubernetes Engine
- Azure ACI: Azure Container Instances
- Hugging Face Spaces: ML 모델 호스팅 (FastAPI 지원)
- Docker Hub: 이미지 저장소 + 간단한 배포
연결되는 위키 페이지
- containerization — 컨테이너화 개념 및 Docker 아키텍처
- fastapi — FastAPI 프레임워크 및 특징
- docker — Docker 도구 및 최적화 기법
- api-design — FastAPI API 설계 패턴
- uvicorn — ASGI 서버 (FastAPI 실행)