Docker コンテナで Flask Web サーバーを公開する方法

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

はじめに

このチュートリアルでは、Docker コンテナ内で実行されている Flask Web サーバーを公開する方法を学びます。このガイドの終わりまでに、Flask アプリケーションを構築し、Docker コンテナにパッケージ化し、外部からアクセスできるようにする方法を習得します。Web 開発者であろうと DevOps エンジニアであろうと、このチュートリアルは、Flask ベースのプロジェクトで Docker を活用するための知識を提供します。

Docker と Flask の概要

Docker とは何か?

Docker は、開発者がアプリケーションをコンテナと呼ばれる一貫性があり隔離された環境で構築、デプロイ、実行できるようにするオープンソースプラットフォームです。コンテナは、アプリケーションとそのすべての依存関係を単一のポータブルなユニットにパッケージ化し、アプリケーションが基盤となるインフラストラクチャに関係なく同じ方法で実行されることを保証します。

Flask とは何か?

Flask は、Python 用の軽量なオープンソース Web フレームワークです。使いやすく、すぐに始められるように設計されているため、Web アプリケーション、API、マイクロサービスの構築に人気の選択肢となっています。Flask は、ルーティング、HTTP リクエストの処理、テンプレートのレンダリングなどのタスクを処理する、Web アプリケーションを作成するためのシンプルで柔軟な方法を提供します。

Flask で Docker を使用する理由

Docker と Flask を組み合わせることで、いくつかの利点があります。

  1. 一貫したデプロイ: Docker コンテナは、Flask アプリケーションとその依存関係が一緒にパッケージ化されるため、さまざまな環境(開発、ステージング、本番環境など)でアプリケーションを確実に一貫してデプロイできます。
  2. スケーラビリティ: Docker のコンテナ化により、Flask アプリケーションを複数のコンテナインスタンスを実行することで簡単にスケールアップできます。これにより、増加するトラフィックと負荷に対応できます。
  3. 隔離: Docker コンテナは隔離レベルを提供し、Flask アプリケーションとその依存関係がホストシステムや他のアプリケーションから隔離されるため、競合のリスクを軽減し、アプリケーションのセキュリティを高めます。
  4. 移植性: Docker コンテナは、さまざまなプラットフォームや環境間で簡単に共有および移動できるため、Flask アプリケーションの開発、テスト、デプロイを容易にします。

開発環境の設定

Docker と Flask を始めるには、システムに以下のものがインストールされている必要があります。

  • Docker: Docker は公式ウェブサイト (https://www.docker.com/get-started) からダウンロードしてインストールできます。
  • Python: Flask は Python Web フレームワークなので、システムに Python がインストールされている必要があります。Python は公式ウェブサイト (https://www.python.org/downloads/) からダウンロードできます。

Docker と Python がインストールされたら、Flask アプリケーションを構築して Docker コンテナにデプロイできます。

graph TD
    A[Docker のインストール] --> B[Python のインストール]
    B --> C[Flask アプリケーションの構築]
    C --> D[Docker コンテナへの Flask のデプロイ]

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

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

Flask Web アプリケーションを作成するには、以下の手順に従います。

  1. Flask のインストール: ターミナルを開き、以下のコマンドを実行して Flask をインストールします。

    pip install flask
    
  2. Flask アプリケーションの作成: 新しい Python ファイル (例: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)
    

    このコードは、メッセージ "Hello, LabEx!" を返す単一のルート (/) を持つ基本的な Flask アプリケーションを作成します。

  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 (お問い合わせフォーム) の 3 つのルートを追加しました。お問い合わせフォームのルートは 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:

    <!doctype html>
    <html>
      <head>
        <title>お問い合わせ - LabEx Flask アプリケーション</title>
      </head>
      <body>
        <h1>お問い合わせ</h1>
        <form method="post">
          <label for="name">名前:</label>
          <input type="text" id="name" name="name" /><br />
    
          <label for="email">メールアドレス:</label>
          <input type="email" id="email" name="email" /><br />
    
          <label for="message">メッセージ:</label>
          <textarea id="message" name="message"></textarea><br />
    
          <input type="submit" value="送信" />
        </form>
      </body>
    </html>
    

これらのテンプレートは、Flask アプリケーションのページの基本的な構造を提供します。

Docker コンテナ内での Flask アプリケーションのデプロイ

Dockerfile の作成

Docker コンテナ内に Flask アプリケーションをデプロイするには、Dockerfile を作成する必要があります。Dockerfile は、Docker イメージを構築するための指示を含むテキストファイルです。

以下の Dockerfile は、Flask アプリケーションの例です。

## 公式 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 Web サーバーを公開する方法を学びました。Flask アプリケーションを Docker コンテナにパッケージ化することで、さまざまな環境間で一貫性と信頼性を確保したデプロイを実現できます。習得した知識を活用することで、Docker の力を活用して Flask Web 開発とデプロイ プロセスを効率化できます。