소개
Docker 는 Flask 기반 웹 애플리케이션을 포함한 다양한 웹 애플리케이션 배포에 인기 있는 선택이 되었습니다. 이 튜토리얼에서는 Docker 를 사용하여 Flask 애플리케이션을 Docker 화하고 Docker 에서 프로덕션 모드로 실행하는 방법을 안내합니다. 이 문서를 마치면 Docker 를 활용하여 프로덕션 환경에서 Flask 앱을 배포하는 방법에 대한 확실한 이해를 얻게 될 것입니다.
Docker 는 Flask 기반 웹 애플리케이션을 포함한 다양한 웹 애플리케이션 배포에 인기 있는 선택이 되었습니다. 이 튜토리얼에서는 Docker 를 사용하여 Flask 애플리케이션을 Docker 화하고 Docker 에서 프로덕션 모드로 실행하는 방법을 안내합니다. 이 문서를 마치면 Docker 를 활용하여 프로덕션 환경에서 Flask 앱을 배포하는 방법에 대한 확실한 이해를 얻게 될 것입니다.
Docker 는 개발자가 컨테이너 환경에서 애플리케이션을 구축, 배포 및 실행할 수 있도록 지원하는 인기 있는 오픈소스 플랫폼입니다. 애플리케이션과 모든 종속성을 단일 컨테이너에 패키징하여 서로 다른 컴퓨팅 환경 간에 애플리케이션을 쉽게 이동할 수 있도록 합니다.
Docker 는 개발자가 컨테이너에서 애플리케이션을 구축, 배포 및 실행할 수 있도록 지원하는 소프트웨어 플랫폼입니다. 컨테이너는 애플리케이션 실행에 필요한 코드, 런타임, 시스템 도구 및 라이브러리 등 모든 것을 포함하는 경량, 독립적이고 실행 가능한 패키지입니다. 컨테이너는 서로 그리고 호스트 운영 체제와 격리되어 일관되고 안정적인 애플리케이션 배포를 보장합니다.
Docker 아키텍처는 다음과 같은 주요 구성 요소로 구성됩니다.
Docker 아키텍처와 주요 구성 요소를 이해하는 것은 애플리케이션 개발 및 배포 프로세스에서 Docker 를 효과적으로 사용하고 관리하는 데 필수적입니다.
이 섹션에서는 Docker 를 사용하여 Flask 애플리케이션을 컨테이너화하는 방법을 배웁니다.
먼저 간단한 Flask 애플리케이션을 생성해 보겠습니다. 새로운 디렉토리를 생성하고 터미널에서 해당 디렉토리로 이동합니다. 그런 다음 app.py라는 새 파일을 만들고 다음 내용으로 채웁니다.
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'Hello, LabEx!'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
이 Flask 애플리케이션은 "Hello, LabEx!"라는 메시지를 반환하는 단일 라우트를 가지고 있습니다.
Flask 애플리케이션을 컨테이너화하려면 Dockerfile 을 생성해야 합니다. Dockerfile이라는 새 파일을 만들고 다음 내용으로 채웁니다.
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "app.py"]
Dockerfile 을 자세히 살펴보겠습니다.
FROM python:3.9-slim: 이는 이 경우 Python 3.9 이미지의 slim 버전인 Docker 컨테이너의 기본 이미지를 지정합니다.WORKDIR /app: 이는 컨테이너 내부의 작업 디렉토리를 /app으로 설정합니다.COPY requirements.txt .: 이는 requirements.txt 파일을 컨테이너의 작업 디렉토리로 복사합니다.RUN pip install --no-cache-dir -r requirements.txt: 이는 requirements.txt 파일에 명시된 Python 종속성을 설치합니다.COPY . .: 이는 전체 애플리케이션 코드 ( app.py 포함) 를 컨테이너의 작업 디렉토리로 복사합니다.CMD ["python", "app.py"]: 이는 컨테이너가 시작될 때 실행할 명령을 지정하며, Python 인터프리터를 사용하여 app.py 스크립트를 실행하는 것입니다.이제 Docker 이미지를 구축하고 컨테이너를 실행해 보겠습니다.
docker build -t labex-flask-app .
docker run -p 5000:5000 labex-flask-app
-p 5000:5000 옵션은 호스트의 포트 5000 을 컨테이너의 포트 5000 으로 매핑하여 로컬 머신에서 Flask 애플리케이션에 액세스할 수 있도록 합니다.
컨테이너를 실행한 후 웹 브라우저를 열고 http://localhost:5000으로 이동하면 "Hello, LabEx!" 메시지가 표시됩니다.
축하합니다! Docker 를 사용하여 Flask 애플리케이션을 성공적으로 컨테이너화했습니다.
Flask 애플리케이션을 프로덕션 환경에서 실행할 때는 내장 개발 서버 대신 프로덕션용 서버를 사용하는 것이 중요합니다. 이 섹션에서는 Docker 를 사용하여 Flask 애플리케이션을 프로덕션 모드로 실행하는 방법을 배웁니다.
Flask 애플리케이션을 실행하기 위해 사용할 수 있는 여러 프로덕션용 웹 서버가 있습니다. 예를 들어 Gunicorn, uWSGI, Waitress 등이 있습니다. 이 예제에서는 Python 애플리케이션에 널리 사용되는 인기 있는 웹 서버인 Gunicorn 을 사용합니다.
Gunicorn 을 사용하여 Flask 애플리케이션을 프로덕션 모드로 실행하려면 Dockerfile 을 업데이트해야 합니다. Dockerfile의 내용을 다음과 같이 바꿉니다.
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
RUN pip install gunicorn
CMD ["gunicorn", "--bind", "0.0.0.0:5000", "app:app"]
주요 변경 사항은 다음과 같습니다.
RUN pip install gunicorn을 추가했습니다.CMD 명령을 Gunicorn 을 사용하여 Flask 애플리케이션을 시작하도록 변경했습니다. "gunicorn", "--bind", "0.0.0.0:5000", "app:app" 명령은 Gunicorn 이 애플리케이션을 0.0.0.0:5000 주소에 바인딩하고 app.py 파일의 app 객체를 WSGI 애플리케이션으로 사용하도록 지시합니다.이제 Docker 이미지를 구축하고 프로덕션 모드로 컨테이너를 실행해 보겠습니다.
docker build -t labex-flask-app-prod .
docker run -p 5000:5000 labex-flask-app-prod
이제 애플리케이션은 Gunicorn 을 사용하여 프로덕션 모드로 실행됩니다.
Flask 애플리케이션이 프로덕션 모드로 실행되는지 확인하려면 다음 명령을 사용하여 로그를 확인할 수 있습니다.
docker logs <container_id>
다음과 유사한 출력이 표시되어야 합니다.
[2023-04-11 12:34:56 +0000] [1] [INFO] Starting gunicorn 20.1.0
[2023-04-11 12:34:56 +0000] [1] [INFO] Listening at: http://0.0.0.0:5000 (1)
[2023-04-11 12:34:56 +0000] [1] [INFO] Using worker: sync
[2023-04-11 12:34:56 +0000] [8] [INFO] Booting worker with pid: 8
이것은 Flask 애플리케이션이 Gunicorn 웹 서버를 사용하여 프로덕션 모드로 실행됨을 확인시켜줍니다.
이 튜토리얼에서는 Docker 를 사용하여 Flask 애플리케이션을 프로덕션 모드로 실행하는 필수 단계를 다뤘습니다. Dockerfile 생성 및 Docker 이미지 구축을 포함하여 Flask 앱을 Docker 화하는 과정을 살펴보았습니다. 또한, Docker 컨테이너 내에서 Flask 앱을 프로덕션 모드로 실행하여 안정적이고 확장 가능한 배포를 보장하는 방법에 대해 논의했습니다. 이 가이드에서 설명된 절차를 따르면 Docker 를 효과적으로 활용하여 Flask 기반 웹 애플리케이션을 프로덕션 환경에 배포할 수 있습니다.