Docker로 파이썬 앱을 컨테이너화하는 방법
Docker는 파이썬 애플리케이션을 OS에 독립적인 컨테이너로 감싸 배포하는 기술입니다.
Python 코드, 라이브러리, 설정까지 하나의 이미지로 패키징하면 어디서든 동일한 환경으로 실행할 수 있습니다.
1. 기본 프로젝트 구조
myapp/
├── app.py
├── requirements.txt
└── Dockerfile
2. app.py 예제
from flask import Flask
app = Flask(__name__)
@app.route("/")
def home():
return "Hello, Docker!"
3. requirements.txt
flask==2.3.2
4. Dockerfile 작성
# Python 이미지 기반
FROM python:3.10-slim
# 작업 디렉토리 생성
WORKDIR /app
# 의존성 복사 및 설치
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 코드 복사
COPY . .
# 앱 실행
CMD ["python", "app.py"]
Dockerfile은 앱 실행을 위한 일련의 명령어를 정의한 파일입니다.CMD
는 컨테이너가 실행될 때 기본으로 실행할 명령입니다.
5. Docker 이미지 빌드 & 실행
# 이미지 빌드
docker build -t myapp .
# 컨테이너 실행
docker run -p 5000:5000 myapp
GitHub Actions로 Docker 이미지 자동 빌드 및 배포하기
CI/CD 자동화를 통해 코드 푸시 시 Docker 이미지를 자동 빌드하고
Docker Hub에 배포하거나, EC2/서버에 자동 푸시하는 작업도 가능합니다.
1. Docker Hub 연동을 위한 GitHub Secret 등록
- GitHub Repository → Settings → Secrets → Actions
- DOCKER_USERNAME, DOCKER_PASSWORD 등록
2. GitHub Actions 워크플로우 예시
📁 .github/workflows/docker-build.yml
name: Build and Push Docker Image
on:
push:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout Code
uses: actions/checkout@v3
- name: Set up Docker
uses: docker/setup-buildx-action@v2
- name: Login to DockerHub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Build and Push
uses: docker/build-push-action@v5
with:
context: .
push: true
tags: ${{ secrets.DOCKER_USERNAME }}/myapp:latest
해석:
- 코드를 푸시하면 자동으로 Docker 이미지를 빌드
- Docker Hub에
myapp:latest
태그로 푸시됨 - 비밀번호는 절대 노출되지 않도록 GitHub Secrets에 등록 필수
3. 배포 서버에서 자동 Pull 및 재시작
# 서버에서 주기적으로 최신 이미지 Pull
docker pull yourname/myapp:latest
# 기존 컨테이너 중지 및 새로 실행
docker stop myapp && docker rm myapp
docker run -d --name myapp -p 80:5000 yourname/myapp:latest
이 과정을 cron
이나 watchtower
로 자동화하면 완전 자동 배포가 가능합니다.
실전 활용을 위한 팁
1. .dockerignore로 이미지 최적화
__pycache__/
*.pyc
*.log
.env
.dockerignore
파일을 추가하면 불필요한 파일이 이미지에 포함되지 않아 용량이 줄고 속도도 향상됩니다.
2. 멀티스테이지 빌드로 경량 이미지 만들기
FROM python:3.10-slim AS base
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
FROM base
COPY . .
CMD ["python", "app.py"]
첫 단계에서 빌드 후, 두 번째 단계에서 필요한 결과만 복사하여 경량 이미지를 만들 수 있습니다.
특히 빌드 툴이나 테스트 도구가 많은 경우 유용합니다.
3. private registry 또는 AWS ECR로 배포
- AWS CLI 또는 GitHub Actions에 ECR 인증 설정 가능
- 회사 내부 서버 혹은 보안 환경에서 안전하게 배포 가능