Docker 컨테이너에서 Flask 웹 서버 노출 방법

DockerBeginner
지금 연습하기

소개

이 튜토리얼에서는 Docker 컨테이너 내부에서 실행되는 Flask 웹 서버를 외부에 노출하는 방법을 살펴봅니다. 이 가이드를 마치면 Flask 애플리케이션을 구축하고, Docker 컨테이너에 패키징하며, 외부에서 접근할 수 있도록 만드는 방법을 배우게 될 것입니다. 웹 개발자이든 DevOps 엔지니어이든, 이 튜토리얼은 Flask 기반 프로젝트에 Docker 를 활용하는 지식을 갖추도록 도와줄 것입니다.

Docker 와 Flask 소개

Docker 란 무엇인가?

Docker 는 개발자가 컨테이너라는 일관되고 격리된 환경에서 애플리케이션을 구축, 배포 및 실행할 수 있도록 지원하는 오픈소스 플랫폼입니다. 컨테이너는 애플리케이션과 모든 종속성을 하나의 휴대 가능한 단위로 패키징하여, 기반 인프라에 관계없이 애플리케이션이 동일한 방식으로 실행되도록 보장합니다.

Flask 란 무엇인가?

Flask 는 파이썬용 가벼운 오픈소스 웹 프레임워크입니다. 사용하기 쉽고 시작하기 쉬워 웹 애플리케이션, API 및 마이크로서비스 구축에 인기 있는 선택입니다. Flask 는 라우팅, HTTP 요청 처리 및 템플릿 렌더링과 같은 작업을 처리하여 웹 애플리케이션을 생성하는 간단하고 유연한 방법을 제공합니다.

Flask 에 Docker 를 사용하는 이유는 무엇인가?

Docker 와 Flask 를 결합하면 다음과 같은 여러 가지 이점이 있습니다.

  1. 일관된 배포: Docker 컨테이너는 Flask 애플리케이션과 그 종속성이 함께 패키징되어 개발, 스테이징, 프로덕션과 같은 다양한 환경에서 애플리케이션을 일관되게 배포하기 쉽게 합니다.
  2. 확장성: Docker 의 컨테이너화는 컨테이너의 여러 인스턴스를 실행하여 Flask 애플리케이션을 쉽게 확장할 수 있도록 하여 증가하는 트래픽과 부하를 처리할 수 있도록 합니다.
  3. 격리: Docker 컨테이너는 Flask 애플리케이션과 그 종속성이 호스트 시스템 및 다른 애플리케이션과 격리되어 충돌 위험을 줄이고 애플리케이션의 보안성을 높입니다.
  4. 이식성: Docker 컨테이너는 다양한 플랫폼과 환경 간에 쉽게 공유 및 이동할 수 있어 Flask 애플리케이션을 개발, 테스트 및 배포하기가 더욱 용이합니다.

개발 환경 설정

Docker 와 Flask 를 시작하려면 시스템에 다음을 설치해야 합니다.

  • Docker: 공식 웹사이트 (https://www.docker.com/get-started) 에서 Docker 를 다운로드하여 설치할 수 있습니다.
  • Python: Flask 는 파이썬 웹 프레임워크이므로 시스템에 파이썬이 설치되어 있어야 합니다. 공식 웹사이트 (https://www.python.org/downloads/) 에서 파이썬을 다운로드할 수 있습니다.

Docker 와 파이썬을 설치하면 Flask 애플리케이션을 구축하고 Docker 컨테이너에 배포하기 시작할 수 있습니다.

graph TD A[Docker 설치] --> B[Python 설치] B --> C[Flask 애플리케이션 구축] C --> D[Docker 컨테이너에 Flask 배포]

Flask 웹 애플리케이션 구축

Flask 애플리케이션 생성

Flask 웹 애플리케이션을 생성하려면 다음 단계를 따르세요.

  1. Flask 설치: 터미널을 열고 다음 명령어를 실행하여 Flask 를 설치합니다.

    pip install flask
  2. Flask 애플리케이션 생성: 새로운 파이썬 파일 (예: app.py) 을 생성하고 다음 코드를 추가합니다.

    from flask import Flask
    
    app = Flask(__name__)
    
    @app.route('/')
    def index():
        return 'Hello, LabEx!'
    
    if __name__ == '__main__':
        app.run(host='0.0.0.0', port=5000)

    이 코드는 / 경로 하나만을 가진 기본 Flask 애플리케이션을 생성하며, 이 경로는 "Hello, LabEx!" 메시지를 반환합니다.

  3. Flask 애플리케이션 실행: 터미널에서 app.py 파일이 있는 디렉토리로 이동하고 다음 명령어를 실행합니다.

    python app.py

    이렇게 하면 Flask 개발 서버가 시작되고 애플리케이션은 http://localhost:5000/에서 사용 가능해집니다.

라우트 및 뷰 추가

Flask 애플리케이션에 더 많은 기능을 추가하려면 추가적인 라우트와 뷰를 생성할 수 있습니다.

from flask import Flask, render_template, request

app = Flask(__name__)

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/about')
def about():
    return render_template('about.html')

@app.route('/contact', methods=['GET', 'POST'])
def contact():
    if request.method == 'POST':
        ## 양식 제출 처리
        return '양식 제출 성공!'
    return render_template('contact.html')

이 예제에서는 세 가지 라우트 (/, /about, /contact) 를 추가했습니다. /는 홈페이지, /about은 정보 페이지, /contact는 연락처 양식 페이지입니다. 연락처 양식 라우트는 GET 및 POST 요청을 모두 처리하여 사용자가 양식을 보고 제출할 수 있도록 합니다.

템플릿 렌더링

Flask 는 Jinja2 템플릿 엔진을 사용하여 HTML 템플릿을 렌더링합니다. 프로젝트에 templates 디렉토리 (폴더) 를 생성하고 다음 파일을 추가합니다.

  • index.html:
    <!doctype html>
    <html>
      <head>
        <title>LabEx Flask 애플리케이션</title>
      </head>
      <body>
        <h1>LabEx Flask 애플리케이션에 오신 것을 환영합니다!</h1>
        <p>이것은 홈페이지입니다.</p>
      </body>
    </html>
  • about.html:
    <!doctype html>
    <html>
      <head>
        <title>정보 - LabEx Flask 애플리케이션</title>
      </head>
      <body>
        <h1>LabEx Flask 애플리케이션 정보</h1>
        <p>이것은 정보 페이지입니다.</p>
      </body>
    </html>
  • contact.html: (생략)

이러한 템플릿은 Flask 애플리케이션의 페이지에 대한 기본 구조를 제공합니다.

Docker 컨테이너에 Flask 배포

Dockerfile 생성

Docker 컨테이너에 Flask 애플리케이션을 배포하려면 Dockerfile 을 생성해야 합니다. Dockerfile 은 Docker 이미지를 구축하는 방법을 담은 텍스트 파일입니다.

다음은 Flask 애플리케이션을 위한 Dockerfile 예제입니다.

## 공식 Python 이미지를 기본 이미지로 사용
FROM python:3.9-slim

## 작업 디렉토리를 /app으로 설정
WORKDIR /app

## requirements 파일을 컨테이너로 복사
COPY requirements.txt .

## Python 종속성 설치
RUN pip install --no-cache-dir -r requirements.txt

## Flask 애플리케이션 코드를 컨테이너로 복사
COPY . .

## Flask 애플리케이션이 실행될 포트 노출
EXPOSE 5000

## Flask 애플리케이션 시작 명령 설정
CMD ["python", "app.py"]

이 Dockerfile 은 다음과 같은 작업을 수행합니다.

  1. 공식 Python 3.9 slim 이미지를 기본 이미지로 사용합니다.
  2. 작업 디렉토리를 /app으로 설정합니다.
  3. requirements.txt 파일을 컨테이너로 복사합니다.
  4. requirements.txt 파일에 나열된 Python 종속성을 설치합니다.
  5. Flask 애플리케이션 코드를 컨테이너로 복사합니다.
  6. Flask 개발 서버의 기본 포트인 5000 번 포트를 노출합니다.
  7. Flask 애플리케이션을 시작하는 명령을 설정합니다.

Docker 이미지 구축 및 실행

Docker 이미지를 구축하려면 Dockerfile 이 있는 동일한 디렉토리에서 다음 명령어를 실행합니다.

docker build -t labex-flask-app .

이렇게 하면 Dockerfile 의 지침에 따라 labex-flask-app이라는 Docker 이미지가 생성됩니다.

Docker 컨테이너를 실행하려면 다음 명령어를 사용합니다.

docker run -p 5000:5000 labex-flask-app

이렇게 하면 Docker 컨테이너가 시작되고 호스트의 5000 번 포트가 컨테이너의 5000 번 포트와 매핑되어 http://localhost:5000/에서 Flask 애플리케이션에 접근할 수 있게 됩니다.

Docker 컨테이너 확장 및 관리

Docker 컨테이너에 Flask 애플리케이션을 배포한 후에는 Docker 의 확장 및 관리 기능을 활용할 수 있습니다.

  • 확장: Docker Compose 또는 Kubernetes 와 같은 컨테이너 오케스트레이션 도구를 사용하거나 수동으로 Docker 컨테이너의 여러 인스턴스를 실행하여 Flask 애플리케이션을 쉽게 확장할 수 있습니다.
  • 모니터링: Docker 는 컨테이너의 상태와 성능을 모니터링하기 위한 내장 도구 및 통합 기능을 제공하여 프로덕션 환경에서 Flask 애플리케이션을 더욱 쉽게 관리할 수 있습니다.
  • 버전 관리 및 롤백: Docker 의 이미지 기반 접근 방식은 Flask 애플리케이션을 버전 관리하고 필요에 따라 롤백을 수행하기 쉽게 하여 더욱 안정적이고 신뢰할 수 있는 배포 프로세스를 보장합니다.

Docker 를 활용하면 Flask 애플리케이션이 다양한 환경에서 일관되게 배포 및 관리되어 개발, 테스트 및 프로덕션 라이프사이클을 간소화할 수 있습니다.

요약

이 튜토리얼에서는 Docker 컨테이너 내에서 실행되는 Flask 웹 서버를 노출하는 방법을 배웠습니다. Flask 애플리케이션을 Docker 컨테이너에 패키징함으로써 다양한 환경에서 일관되고 안정적인 배포를 보장할 수 있습니다. 얻은 지식을 바탕으로 이제 Docker 의 기능을 활용하여 Flask 웹 개발 및 배포 프로세스를 간소화할 수 있습니다.