Docker를 사용하여 Heroku에 Python Flask 앱을 ​​배포하는 방법

안녕하세요!
오늘은 컨테이너화된 Python Flask 애플리케이션을 Docker를 사용하여 Heroku에 배포하는 방법을 보여드리겠습니다.
이 자습서는 네 부분으로 구분됩니다.
  • Prerequisites
  • Creating the Flask application using Python
  • Containerizing the application using Docker
  • Deploying the container to Heroku

  • 전제 조건


  • Flask
  • ADocker 설치
  • A Heroku 계정/Heroku CLI 설치

  • Python을 사용하여 Flask 애플리케이션 만들기



    우리는 "Hello World!"를 만들 것입니다. 단순성을 유지하는 응용 프로그램.
    이 튜토리얼이 끝날 때까지의 파일 구조는 다음과 같습니다.

    ├───FlaskApp
      └───app.py           # Our main application
      └───main.py          # Used by gunicorn to run the app
      └───requirements.txt # The packages we will be using
      └───Dockerfile       # Used to create the Docker container
      └───Procfile         # Used to deploy the container to Heroku
    


    시작하려면 다음을 사용하여 빈 디렉터리를 만듭니다.

    $ sudo mkdir FlaskApp
    


    그리고 cd 다음을 사용하여 디렉토리로 이동합니다.

    $ cd FlaskApp
    

    app.pyrequirements.txt라는 두 개의 파일을 만듭니다.
    requirements.txt에 다음 줄을 삽입합니다.

    flask==2.0.1
    gunicorn==20.1.0
    


    그런 다음 필요한 패키지를 설치하려면 다음을 실행합니다.

    $ pip install -r requirements.txt
    


    그런 다음 즐겨 사용하는 코드 편집기에서 app.py를 열고 다음 코드를 추가합니다.

    #Import the flask module
    from flask import Flask
    
    app = Flask(__name__)
    
    @app.route('/')
    def hello_world():
        statement = 'Hello World!'
        return statement
    
    
    #Calls the run method, runs the app on port 5000
    app.run(host='0.0.0.0', port='5000')
    


    다음으로 main.py라는 파일을 만들고 다음 코드를 추가합니다.

    from app import app
    
    # Gets the app from app.py and runs it
    app.run()
    


    그런 다음 다음을 사용하여 프로그램을 실행합니다.

    $ gunicorn --bind 0.0.0.0:5000 main:app
    


    그러면 다음과 같은 출력이 표시됩니다.

    [2021-06-25 10:33:51 -0400] [1607] [INFO] Starting gunicorn 20.1.0
    [2021-06-25 10:33:51 -0400] [1607] [INFO] Listening at: http://0.0.0.0:5000 (1607)
    [2021-06-25 10:33:51 -0400] [1607] [INFO] Using worker: sync
    [2021-06-25 10:33:51 -0400] [1609] [INFO] Booting worker with pid: 1609
    

    http://yourip:5000에서 실행 시 제공된 URL에 액세스하면 페이지가 다음과 같아야 합니다.


    이제 Python 애플리케이션이 실행 중이므로 Docker를 사용하여 애플리케이션을 컨테이너화하는 방법을 살펴보겠습니다.

    Docker를 사용하여 애플리케이션 컨테이너화


    FlaskApp 디렉토리에서 Dockerfile라는 파일 확장자가 없는 파일을 만들고 다음을 추가합니다.

    #Create a ubuntu base image with python 3 installed.
    FROM python:3.8
    
    #Set the working directory
    WORKDIR /
    
    #copy all the files
    COPY . .
    
    #Install the dependencies
    RUN apt-get -y update
    RUN apt-get update && apt-get install -y python3 python3-pip
    RUN pip3 install -r requirements.txt
    
    #Expose the required port
    EXPOSE 5000
    
    #Run the command
    CMD gunicorn main:app
    


    그런 다음 다음을 실행하여 Docker 이미지를 빌드합니다.

    $ docker build -t flask-app .
    


    그런 다음 다음을 사용하여 실행하십시오.

    $ docker run flask-app
    


    그리고 정상적으로 실행하는 것과 동일한 출력을 얻어야 합니다.

    2021-06-25T15:08:47.958205+00:00 app[web.1]: [2021-06-25 15:08:47 +0000] [5] [INFO] Starting gunicorn 20.1.0
    2021-06-25T15:08:47.958983+00:00 app[web.1]: [2021-06-25 15:08:47 +0000] [5] [INFO] Listening at: http://0.0.0.0:5000 (5)
    2021-06-25T15:08:47.958983+00:00 app[web.1]: [2021-06-25 15:08:47 +0000] [5] [INFO] Using worker: sync
    2021-06-25T15:08:47.962897+00:00 app[web.1]: [2021-06-25 15:08:47 +0000] [7] [INFO] Booting worker with pid: 7
    


    그리고 주어진 IP 주소http://yourip:5000에서 예상되는 출력을 얻어야 합니다.

    축하합니다! Flask 애플리케이션을 성공적으로 생성하고 Docker를 사용하여 컨테이너화했습니다!
    이제 컨테이너 레지스트리를 사용하여 이 컨테이너를 Heroku에 배포하는 방법을 살펴보겠습니다.

    Heroku에 컨테이너 배포



    prerequisites에 명시된 대로 Heroku CLI가 설치되어 있는 경우 다음을 실행합니다.

    $ heroku login
    


    그러면 Heroku 자격 증명을 입력하라는 메시지가 표시됩니다.
    로그인한 후 다음을 실행하여 애플리케이션을 생성합니다.

    $ heroku create <your_app_name>
    


    다음으로 다음을 실행하여 Heroku 컨테이너 레지스트리에 로그인합니다.

    $ heroku container:login
    


    다음을 생성해야 합니다.

    Login Succeeded
    

    FlaskApp 디렉토리에서 Procfile라는 확장자가 없는 파일을 만들고 다음을 추가합니다.

    web: gunicorn main:app 0.0.0.0:$PORT
    


    그런 다음 app.py 파일에서 화살표로 표시된 다음 행을 추가/수정해야 합니다.

    # Import OS to get the port environment variable from the Procfile
    import os # <-----
    # Import the flask module
    from flask import Flask
    
    # Create a Flask constructor. It takes name of the current module as the argument
    app = Flask(__name__)
    
    @app.route('/')
    def hello_world():
        statement = 'Hello World!'
        return statement
    
    
    # Create the main driver function
    port = int(os.environ.get("PORT", 5000)) # <-----
    app.run(host='0.0.0.0', port=port)       # <-----
    


    파일을 편집한 후 다음을 사용하여 컨테이너를 Heroku로 푸시해야 합니다.

    $ heroku container:push web --app <your_app_name>
    


    앱의 컨테이너가 빌드되면 다음을 사용하여 Heroku에 릴리스합니다.

    $ heroku container:release web --app <your_app_name>
    


    그러면 다음이 생성됩니다.

    Releasing images web to <your_app_name>... done
    


    릴리스되면 다음을 사용하여 새 컨테이너의 로그에 액세스할 수 있습니다.

    $ heroku logs --tail --app <your_app_name>
    


    다음과 같은 내용이 표시되어야 합니다.

    2021-06-25T15:08:45.662062+00:00 heroku[web.1]: Starting process with command `/bin/sh -c gunicorn\ main:app`
    2021-06-25T15:08:47.958205+00:00 app[web.1]: [2021-06-25 15:08:47 +0000] [5] [INFO] Starting gunicorn 20.1.0
    2021-06-25T15:08:47.958983+00:00 app[web.1]: [2021-06-25 15:08:47 +0000] [5] [INFO] Listening at: http://0.0.0.0:34683 (5)
    2021-06-25T15:08:47.958983+00:00 app[web.1]: [2021-06-25 15:08:47 +0000] [5] [INFO] Using worker: sync
    2021-06-25T15:08:47.962897+00:00 app[web.1]: [2021-06-25 15:08:47 +0000] [7] [INFO] Booting worker with pid: 7
    2021-06-25T15:08:48.409823+00:00 heroku[web.1]: State changed from starting to up
    


    이제 다음과 같은 예상 출력과 함께 새 앱의 URL을 통해 애플리케이션에 액세스할 수 있어야 합니다.


    축하합니다! 이 자습서에서는 Python Flask 애플리케이션을 만들고 컨테이너화한 다음 Heroku에 배포하는 방법을 설명했습니다.

    좋은 웹페이지 즐겨찾기