Docker上でPython Flask APIアプリケーションをデプロイする方法

Dockerとコンテナに新しくなった方へ、Docker上でPython Flask APIアプリケーションをデプロイすることは、はじめる良い方法です。Dockerを使用すると、軽量な技術とセキュリティにより、アプリケーションの迅速なデプロイが可能となります。

このチュートリアルでは、Python Flask APIアプリケーションをDockerコンテナに設定してデプロイする方法を学びます。

準備をして、デプロイを開始しましょう!

前提条件

ステップバイステップで進めるために、以下をインストールする必要があります:

  • DockerがインストールされたUbuntuマシン。このチュートリアルでは、Docker v19.03.8を使用したUbuntu 18.04.5 LTSを使用します。
  • UbuntuマシンにインストールされたPython v3.9以降。このチュートリアルでは、Ubuntuマシン上でPython v3.9.2を使用します。
  • このチュートリアルでは、APIをテストするために使用するUbuntuマシンにElinksパッケージがインストールされている必要があります。

Python Flask APIアプリケーションの作成(GETおよびPOST API)

このチュートリアルでは、Python Flaskアプリケーションを作成します。FlaskはPythonで書かれた軽量なWSGIマイクロWebアプリケーションフレームワークです。FlaskはPythonでWebアプリケーションを作成する際に便利なツールと機能を提供しています。

Python Flaskアプリケーションを作成する前に、Python Flaskと実行されるアプリケーションを実行するためのPython仮想環境をインストールします。

1.お気に入りのSSHクライアントを使用してUbuntuマシンにログインします。

2.次に、以下のコマンドを実行して、ディレクトリ~/docker_python_flask_demoを作成し、それに切り替えます。このディレクトリには、PythonとDockerがアプリケーションを実行するために必要なすべてのファイルが含まれます。

mkdir ~/docker_python_flask_demo
cd ~/docker_python_flask_demo

3.以下のコマンドを実行して、Flaskがアプリケーションを実行するために必要なPython仮想環境(virtualenv)をインストールします。Python仮想環境は、独自のPythonバイナリとアプリケーションごとにインストールされたパッケージを提供し、他のアプリケーションとの競合を避けるためのものです。

pip install virtualenv
Installing the environment needed by Flask to execute the applications

4.以下のコマンドを実行して、venvモジュールを使用して仮想環境を作成およびアクティブ化します。

virtualenv venv
Creating the virtual environment for Python

5.次に、以下のコマンドを実行して、pipパッケージマネージャを使用してPythonのflaskパッケージをインストールします。

pip install flask

6. インストールまたは使用する前に、仮想環境でパッケージをアクティベートするために以下のコマンドを実行してください。これにより、VIRTUAL_ENV 環境変数が仮想環境を指すように変更され、仮想環境のPythonバイナリがパスに先頭に追加され、正しいバイナリが実行されます。

source venv/bin/activate

7. さらに、requirements.txtという名前のファイルを作成し、以下に示すようにFlaskアプリケーションの依存関係を定義してください。

Flask==2.0.2

8. テキストファイル ~/docker_python_flask_demo/app.py を作成し、以下のPythonコードでファイルを埋めてください。

以下のPythonコードは、Pythonのflaskクラスをインポートし、appという名前のクラスインスタンスを作成します。appクラスインスタンスには、ユーザーが/loginページにリクエストを送信したときに実行される2つのlogin()関数が含まれています。

その後、success()関数が実行され、ブラウザにようこそ “ユーザー名” のメッセージが表示されます。


from flask import Flask , redirect , url_for , request # クラスflaskをインポート
# appはFlaskのオブジェクトまたはインスタンスです
app = Flask(__name__)
# app.routeは関数が使用するURLをFlaskに通知します
@app.route('/success/<name>')
# successという名前の関数を作成
def success(name):
    return 'welcome %s' % name

@app.route('/login', methods = ['GET','POST'])
# loginという名前の関数を作成
def login():
    if request.method == 'POST':
       user = request.form['adamlistek']
       return redirect(url_for('success', name = user)) 
    else:
       return "INVALID"
# ここからプログラムが開発サーバー(システム上のローカル)で実行されます
# デバッグを有効にして実行します
  
if __name__ == '__main__':
   app.run(debug = True)

9. もう一つのファイルを作成してください。~/docker_python_flask_demo/form.html としてください。以下のコードをコピーして貼り付けてください。

以下のHTMLコードを実行すると、名前を入力するためのテキスト入力と、送信ボタンのあるフォームが作成されます。

ユーザー名を入力し、送信ボタンをクリックすると、POSTリクエストが送信され、Flaskが別の関数を実行し、http://localhost:5000/success/<username>という新しいウェブページを開きます。

<html>
  <body>
    <form action="http://localhost:5000/login" method="post">
      <p>Please Enter your name</p>
      <p><input type="text" name="adamlistek" /></p>
      <p><input type="submit" value="Submit" /></p>
    </form>
  </body>
</html>

10. 最後に、次のPythonコマンドを実行してアプリケーション(app.py)がローカルシステムで正常に動作していることを確認してください。

Python app.py

以下のように、アプリケーションはUbuntuマシンでは正常に動作していますが、Dockerでは動作していません。次のセクションで同じアプリケーションをDocker上で起動します。

Running the Python application on the ubuntu machine.

Python Flask APIアプリケーションをデプロイするためのDockerfileの作成

Python Flaskアプリケーションがローカルマシンで作成され、確認されました。しかし、アプリケーションをDocker上でデプロイする前に、Dockerfileを作成して、Dockerイメージをビルドするためのすべての手順を定義します。

~/docker_python_flask_demoディレクトリにDockerfileという名前のファイルを作成し、以下の内容をコピーしてください。

Dockerは、このDockerfileを使用して、ベースイメージ(ubuntu:18.04)の上に新しいDockerイメージをビルドするために必要なすべての指示またはコマンドを実行します。

# 後続の指示のためのベースイメージを設定します
FROM ubuntu:18.04
# コンテナ内の作業ディレクトリを設定します
WORKDIR /app
RUN apt-get update -y
RUN apt-get install -y python-pip python-dev
# ファイルを作業ディレクトリにコピーします
COPY form.html /app/form.html
# 依存関係ファイルを作業ディレクトリにコピーします
COPY requirements.txt /app/requirements.txt
# 依存関係をインストールします
RUN pip install -r requirements.txt
# すべてを作業ディレクトリにコピーします
COPY . /app
# コンテナ起動時に実行するコマンド
CMD [ "python" , "./app.py" ]

では、以下のtreeコマンドを実行して、Python Flaskアプリケーションの実行に必要なすべてのファイルが作業ディレクトリ(~/docker_python_flask_demo)に含まれていることを確認します。

tree  
Verifying all Required Files to Run the Flask Application Exist

Python Flask APIアプリケーションのDockerイメージのビルド

必要なファイルを備えたPython Flaskアプリケーションをデプロイするためには、ファイルだけでは何も動作しません。Dockerfileで設定した指示に基づいてDockerイメージをビルドするために、docker buildコマンドを実行します。

以下のdocker buildコマンドを実行して、作業ディレクトリ(.)にDockerイメージをビルドします。このコマンドはイメージをflask-imageバージョン1(:v1)としてタグ付けします。

sudo docker build -t flask-image:v1 .
Building the Docker Image

次に、以下のdockerコマンドを実行して、利用可能なすべてのイメージをリストします。

sudo docker images

以下に、REPOSITORYなどのさまざまな属性が返されることがわかります。REPOSITORYの名前はflask-imageであり、バージョン(v1)とタグ付けされていることが以下に示されています。

Verifying the New Docker Image (flask-image)

DockerコンテナでPython Flaskアプリケーションを実行する

Dockerイメージを作成した後、Python FlaskアプリケーションをDockerコンテナ内で実行できます。Dockerコンテナは、コードとその依存関係をまとめてアプリケーションを迅速に実行するためのものです。

1. 以下のdocker runコマンドを実行して、次の操作を行います:

  • コンテナをデタッチモード-d)で起動し、バックグラウンドプロセスとして実行し、作成時のコンソール出力を返します。
  • Dockerホストのポート(-p 5000:5000)をコンテナのポートにマッピングします。
  • Dockerコンテナ(flask-image:v1)を起動します。
sudo docker run -d -p 5000:5000 flask-image:v1

2. 次に、以下のdockerコマンドを実行して、Dockerエンジン内のすべてのコンテナをリストします。Dockerが正常にコンテナを作成したか確認してください。

sudo docker ps -a
Verifying the Docker container in the Docker engine

3. 最後に、以下のコマンドを実行して、elinksを使用してUbuntuマシンでウェブブラウザを開きます。

elinks form.html

このコマンドは、ターミナル上でウェブブラウザを開き、以下のように名前を入力するように求めます。

名前を入力し、[Submit]ボタンをクリックしてください。

Accessing the login web page with the form to enter your name

4. 以下のように、[Submit]ボタンをクリックすると、Flaskアプリケーション内の成功関数にリダイレクトされることがわかります。

Displaying the welcome message in the web browser

結論

このチュートリアルでは、Dockerイメージを使用してPython Flask API Dockerコンテナを設定するプロセスについて説明しました。また、Dockerfileを使用してPython Flaskコンテナを起動する方法にも触れました。これにより、編集してカスタマイズしたコンテナを作成およびビルドすることができます。

では、他にどのようなアプリケーションをDockerコンテナにデプロイする予定ですか?おそらく、Docker MongoDBコンテナですか?

Source:
https://adamtheautomator.com/python-flask-api/