Docker 를 이용한 Flask 앱 프로덕션 모드 실행 방법

DockerBeginner
지금 연습하기

소개

Docker 는 Flask 기반 웹 애플리케이션을 포함한 다양한 웹 애플리케이션 배포에 인기 있는 선택이 되었습니다. 이 튜토리얼에서는 Docker 를 사용하여 Flask 애플리케이션을 Docker 화하고 Docker 에서 프로덕션 모드로 실행하는 방법을 안내합니다. 이 문서를 마치면 Docker 를 활용하여 프로덕션 환경에서 Flask 앱을 배포하는 방법에 대한 확실한 이해를 얻게 될 것입니다.

Docker 이해

Docker 는 개발자가 컨테이너 환경에서 애플리케이션을 구축, 배포 및 실행할 수 있도록 지원하는 인기 있는 오픈소스 플랫폼입니다. 애플리케이션과 모든 종속성을 단일 컨테이너에 패키징하여 서로 다른 컴퓨팅 환경 간에 애플리케이션을 쉽게 이동할 수 있도록 합니다.

Docker 란 무엇인가요?

Docker 는 개발자가 컨테이너에서 애플리케이션을 구축, 배포 및 실행할 수 있도록 지원하는 소프트웨어 플랫폼입니다. 컨테이너는 애플리케이션 실행에 필요한 코드, 런타임, 시스템 도구 및 라이브러리 등 모든 것을 포함하는 경량, 독립적이고 실행 가능한 패키지입니다. 컨테이너는 서로 그리고 호스트 운영 체제와 격리되어 일관되고 안정적인 애플리케이션 배포를 보장합니다.

Docker 의 장점

  1. 이식성: Docker 컨테이너는 개발자의 랩톱에서 프로덕션 서버까지 다양한 컴퓨팅 환경에서 일관되게 실행될 수 있습니다. 이는 기반 인프라에 관계없이 애플리케이션이 동일한 방식으로 동작한다는 것을 보장합니다.
  2. 확장성: Docker 는 필요에 따라 컨테이너를 추가하거나 제거하여 수요에 따라 애플리케이션을 확장하거나 축소하기 쉽게 합니다.
  3. 효율성: Docker 컨테이너는 기존 가상 머신보다 경량이며 컴퓨팅 리소스를 더 효율적으로 사용할 수 있습니다.
  4. 일관성: Docker 는 애플리케이션과 그 종속성이 함께 패키징되어 "내 컴퓨터에서는 작동합니다"라는 문제를 해결하고 다양한 환경에서 일관된 동작을 보장합니다.

Docker 아키텍처

Docker 아키텍처는 다음과 같은 주요 구성 요소로 구성됩니다.

graph TD A[Docker Client] --> B[Docker Daemon] B --> C[Docker Images] B --> D[Docker Containers] B --> E[Docker Networking] B --> F[Docker Storage]
  1. Docker Client: Docker 클라이언트는 Docker 와 상호 작용하기 위한 주요 사용자 인터페이스입니다. 사용자는 Docker 데몬에 컨테이너를 구축, 실행 및 관리하는 명령을 내릴 수 있습니다.
  2. Docker Daemon: Docker 데몬은 이미지, 컨테이너, 네트워크 및 볼륨과 같은 Docker 객체의 생성, 수정 및 삭제를 관리하는 백엔드 서비스입니다.
  3. Docker Images: Docker 이미지는 Docker 컨테이너를 만드는 설계도입니다. 애플리케이션 코드, 라이브러리, 종속성 및 애플리케이션 실행에 필요한 모든 파일을 포함합니다.
  4. Docker Containers: Docker 컨테이너는 Docker 이미지의 실행 인스턴스입니다. 격리되고 경량이며 휴대 가능한 환경으로 애플리케이션을 실행합니다.
  5. Docker Networking: Docker 는 컨테이너가 서로 그리고 외부 세계와 통신할 수 있도록 내장 네트워킹 기능을 제공합니다.
  6. Docker Storage: Docker 는 볼륨 및 바인드 마운트를 포함한 다양한 스토리지 옵션을 제공하여 컨테이너와 관련된 지속적인 데이터를 관리합니다.

Docker 아키텍처와 주요 구성 요소를 이해하는 것은 애플리케이션 개발 및 배포 프로세스에서 Docker 를 효과적으로 사용하고 관리하는 데 필수적입니다.

Flask 애플리케이션 Docker 화

이 섹션에서는 Docker 를 사용하여 Flask 애플리케이션을 컨테이너화하는 방법을 배웁니다.

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 애플리케이션 Docker 화

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 을 자세히 살펴보겠습니다.

  1. FROM python:3.9-slim: 이는 이 경우 Python 3.9 이미지의 slim 버전인 Docker 컨테이너의 기본 이미지를 지정합니다.
  2. WORKDIR /app: 이는 컨테이너 내부의 작업 디렉토리를 /app으로 설정합니다.
  3. COPY requirements.txt .: 이는 requirements.txt 파일을 컨테이너의 작업 디렉토리로 복사합니다.
  4. RUN pip install --no-cache-dir -r requirements.txt: 이는 requirements.txt 파일에 명시된 Python 종속성을 설치합니다.
  5. COPY . .: 이는 전체 애플리케이션 코드 ( app.py 포함) 를 컨테이너의 작업 디렉토리로 복사합니다.
  6. CMD ["python", "app.py"]: 이는 컨테이너가 시작될 때 실행할 명령을 지정하며, Python 인터프리터를 사용하여 app.py 스크립트를 실행하는 것입니다.

Docker 컨테이너 구축 및 실행

이제 Docker 이미지를 구축하고 컨테이너를 실행해 보겠습니다.

  1. Docker 이미지 구축:
    docker build -t labex-flask-app .
  2. Docker 컨테이너 실행:
    docker run -p 5000:5000 labex-flask-app

-p 5000:5000 옵션은 호스트의 포트 5000 을 컨테이너의 포트 5000 으로 매핑하여 로컬 머신에서 Flask 애플리케이션에 액세스할 수 있도록 합니다.

컨테이너를 실행한 후 웹 브라우저를 열고 http://localhost:5000으로 이동하면 "Hello, LabEx!" 메시지가 표시됩니다.

축하합니다! Docker 를 사용하여 Flask 애플리케이션을 성공적으로 컨테이너화했습니다.

프로덕션 모드에서 Flask 앱 실행

Flask 애플리케이션을 프로덕션 환경에서 실행할 때는 내장 개발 서버 대신 프로덕션용 서버를 사용하는 것이 중요합니다. 이 섹션에서는 Docker 를 사용하여 Flask 애플리케이션을 프로덕션 모드로 실행하는 방법을 배웁니다.

프로덕션 서버 선택

Flask 애플리케이션을 실행하기 위해 사용할 수 있는 여러 프로덕션용 웹 서버가 있습니다. 예를 들어 Gunicorn, uWSGI, Waitress 등이 있습니다. 이 예제에서는 Python 애플리케이션에 널리 사용되는 인기 있는 웹 서버인 Gunicorn 을 사용합니다.

Dockerfile 수정

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"]

주요 변경 사항은 다음과 같습니다.

  1. Gunicorn 웹 서버를 설치하기 위해 RUN pip install gunicorn을 추가했습니다.
  2. CMD 명령을 Gunicorn 을 사용하여 Flask 애플리케이션을 시작하도록 변경했습니다. "gunicorn", "--bind", "0.0.0.0:5000", "app:app" 명령은 Gunicorn 이 애플리케이션을 0.0.0.0:5000 주소에 바인딩하고 app.py 파일의 app 객체를 WSGI 애플리케이션으로 사용하도록 지시합니다.

프로덕션용 Docker 컨테이너 구축 및 실행

이제 Docker 이미지를 구축하고 프로덕션 모드로 컨테이너를 실행해 보겠습니다.

  1. Docker 이미지 구축:
    docker build -t labex-flask-app-prod .
  2. Docker 컨테이너 실행:
    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 기반 웹 애플리케이션을 프로덕션 환경에 배포할 수 있습니다.