Docker는 파이썬 개발자들에게 매우 유용한 도구입니다.
애플리케이션을 컨테이너로 패키징하여 환경에 구애받지 않고 실행할 수 있기 때문에, 개발 및 배포 과정이 훨씬 수월해집니다.
이번 블로그에서는 간단한 파이썬 프로그램을 Docker로 컨테이너화하는 방법을 소개하고, 이를 초보자가 이해할 수 있도록 단계별로 설명하겠습니다.
1. 프로젝트 개요
이번 예제는 간단한 Flask 웹 애플리케이션을 Docker 컨테이너로 실행하는 방법을 다룹니다.
Flask는 파이썬으로 작성된 경량 웹 프레임워크로, 매우 직관적이고 간단합니다.
1.1 프로젝트 디렉토리 구조
프로젝트 디렉토리 구조는 다음과 같습니다.
docker-python-flask/
│
├── app/
│ ├── Dockerfile
│ ├── requirements.txt
│ └── app.py
├── docker-compose.yml
└── README.md
2. 파이썬 프로그램 작성
2.1 Flask 애플리케이션 작성
우선 Flask로 간단한 웹 애플리케이션을 작성해보겠습니다.
app/app.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return "안녕하세요! Docker로 실행된 Flask 웹 애플리케이션입니다."
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
이 코드는 기본 경로 '/'로 접속할 때 "안녕하세요! Docker로 실행된 Flask 웹 애플리케이션입니다."라는 메시지를 반환하는 간단한 서버입니다.
host='0.0.0.0' 설정을 통해 외부에서 접근할 수 있도록 되어 있습니다.
2.2 Flask 의존성 설정
Flask 애플리케이션을 실행하기 위해 필요한 파이썬 패키지를 명시하는 파일인 requirements.txt 파일을 작성합니다.
app/requirements.txt
Flask==2.0.1
이 파일은 애플리케이션에서 필요한 의존성 라이브러리 버전을 명시합니다. 이 예제에서는 Flask 2.0.1을 사용합니다.
3. 파이썬 프로그램 컨테이너화
파이썬 프로그램을 컨테이너로 만들기 위해 Dockerfile을 작성합니다.
3.1 Dockerfile 작성
Dockerfile은 Docker 컨테이너를 빌드하기 위한 설정 파일입니다. 파이썬 애플리케이션을 컨테이너로 실행할 수 있도록 다음과 같은 내용을 작성합니다.
app/Dockerfile
# 베이스 이미지로 파이썬 3.9 사용
FROM python:3.9-slim
# 작업 디렉토리 설정
WORKDIR /app
# 의존성 파일 복사 및 설치
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
# 애플리케이션 파일 복사
COPY . .
# Flask 애플리케이션 실행
CMD ["python", "app.py"]
- FROM python:3.9-slim: 파이썬 3.9가 설치된 경량 버전의 이미지를 베이스로 사용합니다.
- WORKDIR: /app 디렉토리를 작업 디렉토리로 설정합니다.
- COPY requirements.txt ./: requirements.txt 파일을 컨테이너로 복사하고 의존성을 설치합니다.
- RUN pip install --no-cache-dir: 의존성 설치 시 캐시를 사용하지 않도록 설정해 이미지 크기를 줄입니다.
- COPY . .: 현재 디렉토리의 모든 파일을 컨테이너의 /app 디렉토리로 복사합니다.
- CMD ["python", "app.py"]: 컨테이너가 시작될 때 app.py 파일을 실행하여 Flask 애플리케이션을 시작합니다.
4. Docker Compose로 컨테이너 관리
여러 컨테이너를 동시에 관리하거나, 컨테이너 설정을 쉽게 관리하기 위해 Docker Compose를 사용할 수 있습니다. 이 예제에서는 docker-compose.yml 파일을 작성해 Flask 애플리케이션을 실행해 보겠습니다.
4.1 Docker Compose 파일 작성
docker-compose.yml
version: '3'
services:
web:
build: ./app
ports:
- "5000:5000"
environment:
- FLASK_ENV=development
이 docker-compose.yml 파일은 단일 web 서비스를 정의하며, 다음과 같은 설정을 포함합니다:
- build: ./app: app 디렉토리의 Dockerfile을 기반으로 이미지를 빌드합니다.
- ports: "5000:5000": 호스트 머신의 5000번 포트를 컨테이너의 5000번 포트에 매핑합니다.
- environment: FLASK_ENV=development: Flask 애플리케이션을 개발 모드로 실행합니다.
4.2 Docker Compose로 컨테이너 실행
이제 Docker Compose를 사용해 Flask 애플리케이션을 실행할 수 있습니다. 프로젝트 루트 디렉토리에서 다음 명령어를 실행합니다.
docker-compose up --build
이 명령어는 Flask 애플리케이션을 Docker로 빌드하고, 컨테이너를 실행합니다.
5. 결과 확인
컨테이너가 성공적으로 실행되면, 브라우저에서 http://localhost:5000에 접속할 수 있습니다. 웹 페이지에 다음과 같은 메시지가 표시됩니다
안녕하세요! Docker로 실행된 Flask 웹 애플리케이션입니다.
이 메시지는 Flask 애플리케이션이 정상적으로 실행되었음을 나타냅니다.
Flask 애플리케이션은 MySQL, PostgreSQL 등 다른 데이터베이스와 연결하는 것도 가능합니다.
6. Docker 컨테이너 최적화 및 관리 팁
- 멀티스테이지 빌드(Multi-stage Build) 사용: 필요하지 않은 빌드 관련 파일을 최종 이미지에서 제외하고, 애플리케이션 크기를 줄일 수 있습니다.
- 환경 변수 관리: docker-compose.yml에서 환경 변수를 직접 설정하는 대신, .env 파일을 사용해 관리할 수 있습니다.
- Docker 볼륨 사용: 파일 시스템의 변경 사항을 유지하려면 Docker 볼륨을 사용해 데이터를 저장할 수 있습니다.
이 블로그에서는 Flask 웹 애플리케이션을 Docker로 컨테이너화하는 실전 예제를 살펴보았습니다.
Docker는 파이썬 애플리케이션을 패키징하여, 개발 및 배포 환경에서 동일하게 실행할 수 있도록 도와주는 강력한 도구입니다.
Flask 외에도 Django, FastAPI 등 다양한 파이썬 웹 프레임워크에도 적용할 수 있으니, Docker를 활용해 더욱 유연한 개발 환경을 만들어 보세요.
구독!! 공감과 댓글은 저에게 큰 힘이 됩니다.
Starting Google Play App Distribution! "Tester Share" for Recruiting 20 Testers for a Closed Test.
Tester Share [테스터쉐어] - Google Play 앱
Tester Share로 Google Play 앱 등록을 단순화하세요.
play.google.com