はじめに
Docker は、Flask ベースのアプリケーションを含むウェブアプリケーションのデプロイに人気のある選択肢になっています。このチュートリアルでは、Flask アプリケーションを Docker 化し、Docker を使用して本番モードで実行するプロセスを案内します。この記事の最後まで読むと、本番環境で Flask アプリをデプロイするために Docker をどのように活用するかがしっかりと理解できるようになります。
Docker の理解
Docker は、開発者がコンテナ化された環境でアプリケーションを構築、デプロイ、実行できるようにする人気のオープンソースプラットフォームです。これにより、アプリケーションとそのすべての依存関係を単一のコンテナにパッケージ化する方法が提供され、異なるコンピューティング環境間でアプリケーションを簡単に移動できるようになります。
Docker とは何か?
Docker は、開発者がコンテナ内でアプリケーションを構築、デプロイ、実行できるようにするソフトウェアプラットフォームです。コンテナは、軽量で独立した実行可能なパッケージであり、コード、ランタイム、システムツール、ライブラリなど、アプリケーションを実行するために必要なすべてのものが含まれています。コンテナは互いに、またホストオペレーティングシステムから分離されており、一貫した信頼性の高いアプリケーションのデプロイを保証します。
Docker の利点
- ポータビリティ:Docker コンテナは、開発者のノートパソコンから本番サーバーまで、さまざまなコンピューティング環境で一貫して実行できます。これにより、基盤となるインフラストラクチャに関係なく、アプリケーションが同じように動作することが保証されます。
- スケーラビリティ:Docker を使用すると、必要に応じてコンテナを追加または削除することで、需要に応じてアプリケーションを簡単に拡張または縮小できます。
- 効率性:Docker コンテナは軽量で、従来の仮想マシンよりも少ないリソースを使用するため、コンピューティングリソースをより効率的に使用できます。
- 一貫性:Docker は、アプリケーションとその依存関係が一緒にパッケージ化されることを保証し、「自分のマシンでは動くけど他の環境では動かない」という問題を解消し、異なる環境でも一貫した動作を保証します。
Docker のアーキテクチャ
Docker のアーキテクチャは、以下の主要なコンポーネントで構成されています。
graph TD
A[Docker Client] --> B[Docker Daemon]
B --> C[Docker Images]
B --> D[Docker Containers]
B --> E[Docker Networking]
B --> F[Docker Storage]
- Docker クライアント:Docker クライアントは、Docker とやり取りするための主要なユーザーインターフェイスです。これにより、ユーザーはコンテナの構築、実行、管理など、Docker デーモンにコマンドを発行できます。
- Docker デーモン:Docker デーモンは、イメージ、コンテナ、ネットワーク、ボリュームなどの Docker オブジェクトの作成、変更、削除を管理するバックエンドサービスです。
- Docker イメージ:Docker イメージは、Docker コンテナを作成するためのブループリントです。これには、アプリケーションコード、ライブラリ、依存関係、およびアプリケーションを実行するために必要なその他のすべてのファイルが含まれています。
- Docker コンテナ:Docker コンテナは、Docker イメージの実行中のインスタンスです。これらは、アプリケーションを実行する分離された軽量でポータブルな環境です。
- Docker ネットワーキング:Docker は、コンテナ同士および外部と通信できるようにする組み込みのネットワーキング機能を提供します。
- Docker ストレージ:Docker は、ボリュームやバインドマウントなど、コンテナに関連付けられた永続的なデータを管理するためのさまざまなストレージオプションを提供します。
Docker のアーキテクチャとその主要なコンポーネントを理解することは、アプリケーションの開発とデプロイプロセスで Docker を効果的に使用および管理するために重要です。
Flask アプリケーションの Docker 化
このセクションでは、Docker を使用して Flask アプリケーションをコンテナ化する方法を学びます。
Flask アプリケーションの作成
まず、シンプルな Flask アプリケーションを作成しましょう。新しいディレクトリを作成し、ターミナルでそのディレクトリに移動します。次に、以下の内容で app.py という名前の新しいファイルを作成します。
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'Hello, LabEx!'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
この Flask アプリケーションには、「Hello, LabEx!」というメッセージを返す単一のルートがあります。
Flask アプリケーションの Docker 化
Flask アプリケーションをコンテナ化するには、Dockerfile を作成する必要があります。以下の内容で Dockerfile という名前の新しいファイルを作成します。
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "app.py"]
Dockerfile を分解してみましょう。
FROM python:3.9-slim:これは Docker コンテナのベースイメージを指定しており、この場合は Python 3.9 イメージのスリムバージョンです。WORKDIR /app:これはコンテナ内の作業ディレクトリを/appに設定します。COPY requirements.txt .:これはrequirements.txtファイルをコンテナの作業ディレクトリにコピーします。RUN pip install --no-cache-dir -r requirements.txt:これはrequirements.txtファイルに指定された Python の依存関係をインストールします。COPY . .:これはアプリケーションのコード全体(app.pyを含む)をコンテナの作業ディレクトリにコピーします。CMD ["python", "app.py"]:これはコンテナが起動したときに実行するコマンドを指定しており、Python インタープリターを使用してapp.pyスクリプトを実行することです。
Docker コンテナのビルドと実行
では、Docker イメージをビルドしてコンテナを実行しましょう。
- Docker イメージをビルドします。
docker build -t labex-flask-app . - Docker コンテナを実行します。
docker run -p 5000:5000 labex-flask-app
-p 5000:5000 オプションは、ホストのポート 5000 をコンテナのポート 5000 にマッピングします。これにより、ローカルマシンから Flask アプリケーションにアクセスできるようになります。
コンテナを実行した後、ウェブブラウザを開いて http://localhost:5000 にアクセスすることで、Flask アプリケーションにアクセスできます。「Hello, LabEx!」というメッセージが表示されるはずです。
おめでとうございます!Docker を使用して Flask アプリケーションを正常にコンテナ化しました。
Flask アプリを本番モードで実行する
Flask アプリケーションを本番環境で実行する場合、組み込みの開発サーバーではなく、本番環境に対応したサーバーを使用することが重要です。このセクションでは、Docker を使用して Flask アプリケーションを本番モードで実行する方法を学びます。
本番用サーバーの選択
Flask アプリケーションを実行するために使用できる本番環境に対応したウェブサーバーには、Gunicorn、uWSGI、Waitress などがあります。この例では、Python アプリケーションに人気で広く使用されているウェブサーバーである Gunicorn を使用します。
Dockerfile の修正
Gunicorn を使用して Flask アプリケーションを本番モードで実行するには、Dockerfile を更新する必要があります。Dockerfile の内容を以下のように置き換えます。
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
RUN pip install gunicorn
CMD ["gunicorn", "--bind", "0.0.0.0:5000", "app:app"]
主な変更点は以下の通りです。
- Gunicorn ウェブサーバーをインストールするために
RUN pip install gunicornを追加しました。 - Flask アプリケーションを起動するために Gunicorn を使用するように
CMD命令を変更しました。"gunicorn", "--bind", "0.0.0.0:5000", "app:app"コマンドは、Gunicorn にアプリケーションを0.0.0.0:5000アドレスにバインドし、app.pyファイルのappオブジェクトを WSGI アプリケーションとして使用するように指示します。
本番環境に対応した Docker コンテナのビルドと実行
では、Docker イメージをビルドし、本番モードでコンテナを実行しましょう。
- Docker イメージをビルドします。
docker build -t labex-flask-app-prod . - Docker コンテナを実行します。
docker run -p 5000:5000 labex-flask-app-prod
これで、アプリケーションは Gunicorn を使用して本番モードで実行されているはずです。
本番環境設定の検証
Flask アプリケーションが本番モードで実行されていることを検証するには、以下のコマンドを使用してログを確認できます。
docker logs <container_id>
以下のような出力が表示されるはずです。
[2023-04-11 12:34:56 +0000] [1] [INFO] Starting gunicorn 20.1.0
[2023-04-11 12:34:56 +0000] [1] [INFO] Listening at: http://0.0.0.0:5000 (1)
[2023-04-11 12:34:56 +0000] [1] [INFO] Using worker: sync
[2023-04-11 12:34:56 +0000] [8] [INFO] Booting worker with pid: 8
これにより、Flask アプリケーションが Gunicorn ウェブサーバーを使用して本番モードで実行されていることが確認できます。
まとめ
このチュートリアルでは、Docker を使用して Flask アプリケーションを本番モードで実行するための重要な手順を説明しました。Flask アプリを Docker 化するプロセス(Dockerfile の作成や Docker イメージのビルドを含む)を調べました。さらに、Docker コンテナ内で Flask アプリを本番モードで実行する方法についても説明し、信頼性が高くスケーラブルなデプロイを保証しました。このガイドに記載されている方法に従うことで、本番環境で Flask ベースのウェブアプリケーションをデプロイするために Docker を効果的に活用することができます。



