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

DockerBeginner
オンラインで実践に進む

はじめに

このチュートリアルでは、Docker コンテナ内で Flask アプリケーションを実行するプロセスを探索します。Docker の基礎、Flask アプリケーションの構築、そして Docker の利点を活用するために Flask アプリケーションをコンテナ化します。

Docker の理解

Docker は、開発者がコンテナ化された環境でアプリケーションを構築、デプロイ、実行するための、人気のオープンソースプラットフォームです。コンテナは、アプリケーションの実行に必要なコード、ランタイム、システムツール、ライブラリなど、すべてを含んだ軽量で独立した実行可能なソフトウェアパッケージです。

Docker とは何か?

Docker は、コンテナを使用してアプリケーションの作成、デプロイ、実行を容易にするツールです。コンテナを使用すると、開発者はアプリケーションに必要なライブラリやその他の依存関係など、すべての構成要素をパッケージ化し、単一のソフトウェアパッケージとして配布できます。

Docker アーキテクチャ

Docker アーキテクチャは、以下のコンポーネントで構成されています。

graph TD A[Docker クライアント] --> B[Docker デーモン] B --> C[Docker イメージ] B --> D[Docker コンテナ] B --> E[Docker レジストリ]
  • Docker クライアント: Docker システムと対話するためのユーザーインターフェース。
  • Docker デーモン: イメージ、コンテナ、ネットワーク、ボリュームなどの Docker オブジェクトを管理するバックグラウンドプロセス。
  • Docker イメージ: Docker コンテナを作成するための設計図。
  • Docker コンテナ: Docker イメージの実行可能なインスタンス。
  • Docker レジストリ: Docker イメージを保存および配布するためのリポジトリ。

Docker の利点

  1. 一貫した環境: Docker は、基盤となるインフラストラクチャに関係なく、アプリケーションが同じ方法で実行されることを保証します。
  2. スケーラビリティ: Docker コンテナは、需要の変化に対応するために簡単にスケールアップまたはスケールダウンできます。
  3. 移植性: Docker コンテナは、Docker がインストールされているシステムであればどのシステムでも実行できるため、アプリケーションを異なる環境間で簡単に移動できます。
  4. 効率: Docker コンテナは軽量で、従来の仮想マシンよりも少ないリソースを使用します。
  5. 分離: Docker コンテナは高いレベルの分離を提供し、アプリケーションが安全で一貫した環境で実行されることを保証します。

Docker の開始

Docker を開始するには、システムに Docker エンジンをインストールする必要があります。Docker は公式ウェブサイト (https://www.docker.com/get-started) からダウンロードし、オペレーティングシステムのインストール手順に従います。

Docker をインストールしたら、Docker コンテナの構築と実行を開始できます。Ubuntu イメージを使用した Docker コンテナの実行の簡単な例を次に示します。

docker run -it ubuntu

このコマンドは、Docker レジストリから Ubuntu イメージをプルし、新しいコンテナを作成し、コンテナ内の対話型シェルセッションを開始します。

Flask アプリケーションの構築

Flask は軽量で柔軟性があり、使いやすい人気の Python ウェブフレームワークです。このセクションでは、シンプルな Flask アプリケーションの構築手順を説明します。

開発環境の設定

最初に、開発環境を設定しましょう。この例では、Python 3.9 と Flask 2.0.2 を使用します。

## Python 3.9 のインストール
sudo apt-get update
sudo apt-get install -y python3.9

## Flask のインストール
pip3 install flask==2.0.2

Flask アプリケーションの作成

次に、シンプルな 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 モジュールから Flask クラスをインポートし、新しい Flask インスタンスを作成し、ルート URL (/) に対するルートを定義して、文字列 "Hello, LabEx!" を返します。最後に、app.run() メソッドを使用してアプリケーションを実行します。

Flask アプリケーションの実行

Flask アプリケーションを実行するには、ターミナルで以下のコマンドを実行します。

python3 app.py

これにより、Flask 開発サーバーが起動し、アプリケーションは http://localhost:5000/ で利用可能になります。

機能の追加

追加のルートを定義し、ビジネスロジックを追加することで、Flask アプリケーションに簡単に機能を追加できます。たとえば、ユーザー入力を受け取り、処理を行い、応答を返すルートを作成できます。

from flask import Flask, request

app = Flask(__name__)

@app.route('/')
def index():
    return 'Hello, LabEx!'

@app.route('/greet', methods=['POST'])
def greet():
    name = request.form['name']
    return f'Hello, {name}!'

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

この例では、/greet という新しいルートを追加し、name パラメータを含む POST リクエストを受け取ります。アプリケーションは、提供された名前を使った挨拶メッセージを返します。

Flask アプリケーションのコンテナ化

基本的な Flask アプリケーションができましたので、Docker を使ってコンテナ化してみましょう。アプリケーションをコンテナ化することで、依存関係を含めた自己完結的なユニットにパッケージ化し、デプロイやスケールアップを容易に行えます。

Dockerfile の作成

Flask アプリケーションをコンテナ化するには、Dockerfile を作成する必要があります。Dockerfile は、イメージを構築するためにコマンドラインで実行できるすべての命令を含むテキストドキュメントです。

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 app.py .

## Flask アプリケーションが動作するポートを公開
EXPOSE 5000

## Flask アプリケーションを実行するコマンドを設定
CMD ["python", "app.py"]

この Dockerfile では、以下の手順を実行しています。

  1. 公式 Python 3.9 slim イメージをベースイメージとして使用します。
  2. 作業ディレクトリを /app に設定します。
  3. requirements.txt ファイルをコンテナにコピーします。
  4. Python 依存関係をインストールします。
  5. app.py ファイルをコンテナにコピーします。
  6. Flask アプリケーションのポート 5000 を公開します。
  7. Flask アプリケーションを実行するコマンドを設定します。

Docker イメージの構築

次に、Flask アプリケーションの Docker イメージを構築します。ターミナルで以下のコマンドを実行します。

docker build -t labex-flask-app .

このコマンドは、現在のディレクトリにある Dockerfile を使用して、タグ labex-flask-app の Docker イメージを構築します。

Docker コンテナの実行

イメージが構築されたら、Docker コンテナで Flask アプリケーションを実行できます。

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

このコマンドは、labex-flask-app イメージに基づいて新しいコンテナを起動し、ホストのポート 5000 をコンテナのポート 5000 にマッピングします。

これで、http://localhost:5000/ で Flask アプリケーションにアクセスできます。

Docker イメージのデプロイ

Flask アプリケーションをコンテナ化したら、Docker Hub やプライベートレジストリなどのコンテナレジストリに Docker イメージをデプロイし、本番環境にアプリケーションをデプロイできます。

まとめ

このチュートリアルを終了すると、Docker を使用して Flask アプリケーションをコンテナ化する手順をしっかりと理解しているはずです。Flask アプリケーションの Docker イメージを構築し、Docker コンテナで実行し、Flask 開発およびデプロイに Docker の利点を活用できるようになります。