FastAPI + Streamlit 프로젝트를 Docker로 실행하는 상세 가이드입니다.
- 각 운영체제에 맞는 Docker를 설치되어 있다고 가정합니다.
- 설치가 되어 있지 않은 경우, 다음 문서를 참고해주세요.
docker --version
docker-compose --version# 이미지 빌드 및 컨테이너 시작
docker-compose up --build
# 백그라운드 실행
docker-compose up -d- Streamlit 프론트엔드: http://localhost:8501
- FastAPI 백엔드: http://localhost:8000
- API 문서: http://localhost:8000/docs
# 컨테이너 중지
docker-compose down
# 컨테이너 중지 및 볼륨 삭제
docker-compose down -v# 컨테이너 시작 (포그라운드)
docker-compose up
# 컨테이너 시작 (백그라운드)
docker-compose up -d
# 이미지 재빌드 후 시작
docker-compose up --build
# 컨테이너 중지
docker-compose down
# 컨테이너 중지 + 볼륨 삭제
docker-compose down -v
# 컨테이너 재시작
docker-compose restart# 백엔드만 시작
docker-compose up backend
# 프론트엔드만 시작
docker-compose up frontend
# 백엔드만 재시작
docker-compose restart backend
# 프론트엔드만 재시작
docker-compose restart frontend
# 백엔드만 중지
docker-compose stop backend# 모든 서비스 로그 (실시간)
docker-compose logs -f
# 백엔드 로그만
docker-compose logs -f backend
# 프론트엔드 로그만
docker-compose logs -f frontend
# 최근 100줄만 보기
docker-compose logs --tail=100 backend# 실행 중인 컨테이너 확인
docker-compose ps
# 상세 정보 확인
docker-compose ps -a
# 리소스 사용량 확인
docker stats# 백엔드 컨테이너 셸 접속
docker-compose exec backend /bin/bash
# 프론트엔드 컨테이너 셸 접속
docker-compose exec frontend /bin/bash
# Python 인터프리터 실행
docker-compose exec backend python
# 명령어 실행
docker-compose exec backend ls -la# 이미지 재빌드 (캐시 무시)
docker-compose build --no-cache
# 특정 서비스만 빌드
docker-compose build backend
# 이미지 목록 확인
docker images
# 사용하지 않는 이미지 삭제
docker image prune -a프로젝트에 포함된 Makefile을 사용하면 더 간편하게 Docker를 관리할 수 있습니다.
# 도움말 보기
make help
# 이미지 빌드
make build
# 프로덕션 모드 시작
make up
# 또는
make prod
# 개발 모드 시작 (코드 자동 반영)
make dev
# 컨테이너 중지
make down
# 컨테이너 재시작
make restart
# 로그 확인
make logs
# 백엔드 로그
make logs-backend
# 프론트엔드 로그
make logs-frontend
# 컨테이너 상태
make ps
# 모든 것 삭제 (주의!)
make clean
# 백엔드 셸 접속
make shell-backend
# 프론트엔드 셸 접속
make shell-frontend# 1. 프로젝트 시작
make build
make up
# 2. 로그 확인
make logs
# 3. 개발 중 재시작이 필요할 때
make restart
# 4. 종료
make down
# 5. 완전히 정리 (주의: 모든 데이터 삭제)
make clean# docker-compose.yml 사용
docker-compose up
# 또는
make prod특징:
- 최적화된 이미지
- 코드가 컨테이너에 복사됨
- 코드 변경 시 재빌드 필요
- 안정적인 운영 환경
# docker-compose.dev.yml 사용
docker-compose -f docker-compose.dev.yml up
# 또는
make dev특징:
- 볼륨 마운트로 코드 자동 반영
- Hot-reload 지원
- 빠른 개발 사이클
- 디버깅 용이
개발 모드에서 코드 변경:
- 로컬에서 코드 수정
- 저장하면 자동으로 서버 재시작
- 브라우저 새로고침하여 확인
┌─────────────────────────────────────┐
│ fastapi_streamlit_network │
│ │
│ ┌──────────────┐ ┌─────────────┐ │
│ │ backend │ │ frontend │ │
│ │ (FastAPI) │◄─┤ (Streamlit) │ │
│ │ :8000 │ │ :8501 │ │
│ └──────┬───────┘ └──────┬──────┘ │
│ │ │ │
└─────────┼─────────────────┼─────────┘
│ │
localhost:8000 localhost:8501
프론트엔드에서 백엔드 접근:
# 컨테이너 내부에서
API_URL = "http://backend:8000"
# 호스트에서
API_URL = "http://localhost:8000"# 네트워크 목록 확인
docker network ls
# 네트워크 상세 정보
docker network inspect fastapi_streamlit_network
# 네트워크 재생성
docker-compose down
docker network prune
docker-compose up문제:
Error starting userland proxy: listen tcp4 0.0.0.0:8000: bind: address already in use
해결:
# Mac/Linux
lsof -ti:8000 | xargs kill -9
lsof -ti:8501 | xargs kill -9
# Windows (PowerShell)
Get-Process -Id (Get-NetTCPConnection -LocalPort 8000).OwningProcess | Stop-Process -Force또는 docker-compose.yml에서 포트 변경:
ports:
- "8001:8000" # 호스트:컨테이너문제: 의존성 설치 중 오류
해결:
# 캐시 없이 재빌드
docker-compose build --no-cache
# Python 버전 확인 (Dockerfile)
# FROM python:3.11-slim
# requirements.txt 버전 확인문제: 컨테이너 상태가 Restarting
해결:
# 로그 확인
docker-compose logs backend
# 헬스체크 문제일 수 있음
# docker-compose.yml에서 헬스체크 일시 비활성화문제: 프론트엔드에서 "API 서버에 연결할 수 없습니다"
해결:
# 1. 백엔드 컨테이너 상태 확인
docker-compose ps
# 2. 백엔드 로그 확인
docker-compose logs backend
# 3. 네트워크 확인
docker network inspect fastapi_streamlit_network
# 4. 환경 변수 확인
docker-compose exec frontend env | grep API
# 5. 헬스체크 대기
# depends_on: service_healthy가 설정되어 있으면
# 백엔드가 준비될 때까지 기다림문제: 코드를 수정했는데 변경사항이 보이지 않음
해결:
# 프로덕션 모드: 재빌드 필요
docker-compose down
docker-compose up --build
# 개발 모드 사용 (권장)
docker-compose -f docker-compose.dev.yml up문제: Docker 메모리 제한
해결:
# Docker Desktop 설정에서 메모리 증가
# Settings > Resources > Memory
# 또는 docker-compose.yml에서 제한 설정
services:
backend:
deploy:
resources:
limits:
memory: 512M문제: 데이터가 남아있거나 꼬임
해결:
# 볼륨 포함 완전 삭제
docker-compose down -v
# 모든 볼륨 삭제 (주의!)
docker volume prune
# 특정 볼륨만 삭제
docker volume rm <volume_name>문제: 네트워크 생성 실패
해결:
# 기존 네트워크 삭제
docker network rm fastapi_streamlit_network
# 사용하지 않는 네트워크 정리
docker network prune# 터미널 분할하여 각각 모니터링
# 터미널 1
docker-compose logs -f backend
# 터미널 2
docker-compose logs -f frontend# 파일 구조 확인
docker-compose exec backend ls -la
# 특정 파일 내용 보기
docker-compose exec backend cat main.py
# 파일 복사 (컨테이너 -> 호스트)
docker cp fastapi_backend:/app/main.py ./main_backup.pydocker-compose.yml에 추가:
services:
postgres:
image: postgres:15
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: mydb
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
- app_network
volumes:
postgres_data:.env 파일 생성:
BACKEND_PORT=8000
FRONTEND_PORT=8501docker-compose.yml에서 사용:
services:
backend:
ports:
- "${BACKEND_PORT}:8000"# 멀티 스테이지 빌드
FROM python:3.11-slim as builder
WORKDIR /app
COPY requirements.txt .
RUN pip wheel --no-cache-dir --no-deps --wheel-dir /app/wheels -r requirements.txt
FROM python:3.11-slim
WORKDIR /app
COPY --from=builder /app/wheels /wheels
RUN pip install --no-cache /wheels/*
COPY . .
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]문제가 해결되지 않으면 이슈를 등록해주세요! 🐛