Streamlit docker로 배포하기
Streamlit docker로 배포하기
Streamlit은 데이터를 시각화하고 웹 애플리케이션을 만들기 위한 강력한 프레임워크입니다. 간단한 명령어로 애플리케이션을 실행할 수 있지만, 배포할 때는 다양한 환경에 맞춰 앱을 안정적으로 동작시키기 위한 자동화가 필요합니다. 특히 Docker를 사용하면 애플리케이션을 컨테이너로 패키징해 배포 환경과 관계없이 일관된 실행 환경을 유지할 수 있습니다. 이 글에서는 Streamlit 앱을 Docker를 이용해 배포 자동화하는 방법을 단계별로 설명하겠습니다.
1. Docker의 장점
Docker는 컨테이너 기반의 가상화 기술로, 애플리케이션과 모든 종속성을 하나의 이미지로 패키징해 다른 환경에서도 동일하게 실행할 수 있도록 도와줍니다. Docker를 사용하면 다음과 같은 이점이 있습니다:
- 일관된 환경: 개발 환경과 배포 환경 간의 불일치를 방지.
- 간편한 배포: 컨테이너를 사용해 빠르고 쉽게 애플리케이션을 배포.
- 이식성: 모든 환경에서 동일하게 작동하는 이미지 생성.
2. Streamlit 앱의 예시
먼저, 배포할 Streamlit 앱을 준비합니다. 예시로, 간단한 대시보드를 만들어보겠습니다.
app.py
import streamlit as st
import pandas as pd
"My Streamlit App")
st.title(
= {'Category': ['A', 'B', 'C'], 'Values': [100, 150, 200]}
data = pd.DataFrame(data)
df
'Category')) st.bar_chart(df.set_index(
위 코드는 간단한 막대 차트를 렌더링하는 Streamlit 앱입니다.
3. Dockerfile 작성
Docker를 사용해 애플리케이션을 컨테이너화하려면 Dockerfile을 작성해야 합니다. 이 파일은 Docker 이미지 생성 과정을 정의하는 스크립트입니다.
Dockerfile
# Step 1: 베이스 이미지로 Python 3.9 사용
FROM python:3.9-slim
# Step 2: 작업 디렉토리 설정
WORKDIR /app
# Step 3: 필요한 라이브러리 설치
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Step 4: 애플리케이션 소스 복사
COPY . .
# Step 5: Streamlit 설정 파일 복사 (선택 사항)
COPY ./config.toml ~/.streamlit/config.toml
# Step 6: Docker 컨테이너가 실행될 때 Streamlit 앱 실행
CMD ["streamlit", "run", "app.py", "--server.port=8501", "--server.address=0.0.0.0"]
설명:
FROM
: Python 3.9의 경량 버전 이미지를 사용합니다.WORKDIR
: Docker 컨테이너 내에서 작업 디렉토리를 설정합니다.COPY
: 애플리케이션 파일(app.py
등)을 Docker 이미지 내로 복사합니다.RUN pip install
:requirements.txt
파일을 사용하여 필요한 Python 패키지를 설치합니다.CMD
: 컨테이너 실행 시 Streamlit 서버를 시작하는 명령을 지정합니다.
requirements.txt
애플리케이션에서 필요한 패키지를 requirements.txt
에 명시합니다.
streamlit pandas
4. Docker 이미지 빌드
Dockerfile과 애플리케이션 코드가 준비되었으면, Docker 이미지를 빌드할 수 있습니다.
터미널에서 다음 명령어를 실행해 Docker 이미지를 생성합니다:
docker build -t my-streamlit-app .
my-streamlit-app
: 생성할 Docker 이미지의 이름입니다..
: 현재 디렉토리의 Dockerfile을 사용하여 이미지를 빌드합니다.
5. Docker 컨테이너 실행
이미지 빌드가 완료되면, Docker 컨테이너를 실행하여 애플리케이션을 테스트할 수 있습니다.
docker run -p 8501:8501 my-streamlit-app
-p 8501:8501
: Docker 컨테이너의 8501 포트를 호스트 머신의 8501 포트로 매핑합니다.my-streamlit-app
: 앞에서 빌드한 Docker 이미지의 이름입니다.
이 명령어를 실행한 후, 웹 브라우저에서 http://localhost:8501
로 접속하면 Streamlit 애플리케이션을 확인할 수 있습니다.
6. Streamlit 설정 파일 추가 (선택 사항)
Streamlit의 기본 설정을 변경하려면, .streamlit/config.toml
파일을 사용하여 설정을 지정할 수 있습니다.
config.toml
[server]
headless = true
port = 8501
enableCORS = false
위 설정 파일은 CORS(Cross-Origin Resource Sharing)를 비활성화하고, 서버가 headless 모드에서 실행되도록 지정합니다. 이 파일은 Dockerfile에서 복사하여 사용할 수 있습니다.
COPY ./config.toml ~/.streamlit/config.toml
7. Docker Compose로 여러 서비스 배포 자동화
만약 Streamlit 앱과 함께 데이터베이스나 기타 서비스도 배포해야 한다면, Docker Compose를 사용하여 여러 서비스를 동시에 관리할 수 있습니다.
docker-compose.yml
version: '3'
services:
streamlit:
build: .
ports:
- "8501:8501"
volumes:
- .:/app
environment:
- STREAMLIT_SERVER_PORT=8501
설명:
build: .
: 현재 디렉토리의 Dockerfile을 사용하여 이미지를 빌드합니다.ports
: 컨테이너와 호스트의 포트를 매핑합니다.volumes
: 호스트의 파일을 컨테이너에 마운트하여 실시간 파일 변경 사항을 반영합니다.environment
: 환경 변수를 설정할 수 있습니다.
이제 다음 명령어로 Docker Compose를 실행하여 애플리케이션을 배포할 수 있습니다:
docker-compose up
8. 배포 자동화
Docker와 CI/CD 도구를 결합하면, 코드 변경 시마다 자동으로 이미지를 빌드하고 배포할 수 있습니다. 예를 들어, GitHub Actions 또는 GitLab CI/CD와 같은 툴을 사용하면 새로운 커밋이 발생할 때마다 자동으로 다음과 같은 작업을 수행할 수 있습니다:
- Docker 이미지 빌드: 최신 코드로 이미지를 생성.
- 이미지 푸시: Docker Hub 또는 다른 레지스트리에 이미지를 푸시.
- 서버 배포: 최신 이미지를 서버에서 실행.
9. 클라우드 배포
Docker로 만든 이미지를 클라우드 환경에 배포하는 방법에는 여러 가지가 있습니다:
- AWS ECS (Elastic Container Service): Docker 컨테이너를 관리할 수 있는 AWS 서비스입니다.
- Google Cloud Run: 컨테이너화된 애플리케이션을 Google Cloud에서 실행할 수 있습니다.
- Azure App Service: Docker 이미지를 사용해 Azure에 애플리케이션을 배포할 수 있습니다.
이러한 클라우드 서비스는 Docker 이미지를 가져와 자동으로 애플리케이션을 실행하고, 자동 확장 기능 등을 제공하여 애플리케이션 성능을 최적화할 수 있습니다.
마무리
Docker를 이용한 Streamlit 앱 배포는 일관된 환경에서 안정적으로 애플리케이션을 실행할 수 있게 해줍니다. 위에서 설명한 단계를 통해 Streamlit 앱을 Docker로 컨테이너화하고, 로컬 환경에서 실행하거나 클라우드 서비스로 배포할 수 있습니다. Docker Compose와 같은 도구를 사용하면 여러 서비스와의 통합 배포도 간편해집니다.