Azure での Python Container Apps の概要

この記事では、Python プロジェクト コード (Web アプリなど) から Azure にデプロイされた Docker コンテナーに移動する方法について説明します。 コンテナー化の一般的なプロセス、Azure のコンテナーのデプロイ オプション、Azure でのコンテナーの Python 固有の構成について説明します。

Docker コンテナーの性質は、コードから Docker イメージを作成し、そのイメージを Azure のコンテナーにデプロイすることは、プログラミング言語全体で似ているということです。 言語固有の考慮事項 (この場合の Python) は、Azure でのコンテナー化プロセス中の構成、特に DjangoFlaskFastAPI などの Python Web フレームワークをサポートする Dockerfile 構造と構成にあります。

コンテナー ワークフローのシナリオ

Python コンテナー開発の場合、コードからコンテナーに移動するための一般的なワークフローは次のとおりです。

シナリオ 説明 ワークフロー
Dev 開発環境で Python Docker イメージをビルドします。 コード: Git クローン コードを開発環境に複製します (Docker がインストールされています)。

ビルド: Docker CLI、VS Code (拡張機能あり)、PyCharm (プラグイン付き) を使用します。 「Python Docker イメージとコンテナーの操作」セクションで説明されています。

テスト: Docker コンテナーの開発環境で。

プッシュ: Azure Container Registry、Docker Hub、プライベート レジストリなどのレジストリに。

デプロイ: レジストリから Azure サービスに。
ハイブリッド 開発環境から、Azure で Python Docker イメージをビルドします。 コード: Git クローン コードを開発環境に複製します (Docker をインストールする必要はありません)。

ビルド: VS Code (拡張機能付き)、Azure CLI。

プッシュ: Azure Container Registry

デプロイ: レジストリから Azure サービスに。
Azure クラウド内のすべて。Azure Cloud Shell を使用して、GitHub リポジトリから Python Docker イメージ コードをビルドします。 コード: git clone GitHub repo to Azure Cloud Shell。

ビルド: Azure Cloud Shellで、Azure CLI または Docker CLI を使用します。

プッシュ: Azure Container Registry、Docker Hub、プライベート レジストリなどのレジストリ。

デプロイ: レジストリから Azure サービスに。

これらのワークフローの最終目標は、次のセクションに示すように、Docker コンテナーをサポートする Azure リソースのいずれかでコンテナーを実行することです。

開発環境には、Visual Studio Code または PyCharm、 Codespaces (クラウドでホストされている開発環境)、 Visual Studio Dev Containers (開発環境としてのコンテナー) を使用したローカル ワークステーションを指定できます。

Azure でのデプロイ コンテナー オプション

Python コンテナー アプリは、次のサービスでサポートされています。

サービス 説明
Web App for Containers Web サイトや Web API を含むコンテナー化された Web アプリケーション用のフル マネージド ホスティング サービス。 Azure App Service 上のコンテナー化された Web アプリは、必要に応じてスケーリングできます。また、Docker Hub、Azure Container Registry、GitHub による合理的な CI/CD ワークフローを使用できます。 開発者がフル マネージドのAzure App Service プラットフォームを利用するのに便利ですが、アプリとそのすべての依存関係を含む単一のデプロイ可能な成果物も必要とする場合に最適です。

例: Azure App Serviceに Flask または FastPI Web アプリをデプロイします。
Azure Container Apps (ACA) Kubernetes と 、DaprKEDAenvoy などのオープンソース テクノロジを利用したフル マネージドのサーバーレス コンテナー サービス。 ベスト プラクティスに基づき、汎用コンテナー用に最適化されています。 クラスター インフラストラクチャは ACA によって管理され、Kubernetes API への直接アクセスはサポートされていません。 証明書、リビジョン、スケール、環境など、コンテナーの上に多くのアプリケーション固有の概念を提供します。 Kubernetes の基になる複雑さを管理することなく、コンテナー マイクロサービスの構築を開始するチームに最適です。

例: Azure Container Apps に Flask または FastPI Web アプリをデプロイします
Azure Container Instances (ACI) Hyper-V 分離コンテナーの単一ポッドをオンデマンドで提供するサーバーレス オファリング。 プロビジョニングされたリソースではなく、使用量に対して課金されます。 スケーリング、負荷分散、証明書のような概念は、ACI コンテナーでは提供されません。 ユーザーは、多くの場合、他のサービスを介して ACI と対話します。たとえば、オーケストレーション用の AKS などです。 Azure Container Apps が最適化しているシナリオに合わない"意見の少ない" 文書パーツが必要な場合に最適です。

例: Azure Container Instancesへのデプロイ用のコンテナー イメージを作成します。 (このチュートリアルは Python 固有ではありませんが、表示される概念はすべての言語に適用されます)。
Azure Kubernetes Service (AKS) Azure のフル マネージド Kubernetes オプション。 Kubernetes API への直接アクセスをサポートし、Kubernetes ワークロードを実行します。 クラスター全体がサブスクリプション内に存在し、クラスターの構成と運用はユーザーの制御と責任の範囲内となります。 Azure でフル マネージド バージョンの Kubernetes を探しているチームに最適です。

例: Azure CLI を使用してAzure Kubernetes Service クラスターをデプロイします。
Azure Functions イベント ドリブンのサーバーレスサービスとしての関数 (FAAS) ソリューション。 イベントとのスケールと統合に関して Azure Container Apps と多くの特性を共有しますが、コードまたはコンテナーとしてデプロイされるエフェメラル関数に最適化されています。 イベントに対する関数の実行をトリガーするチームに最適です。たとえば、他のデータ ソースにバインドする場合などです。

例: カスタム コンテナーを使用して Linux で関数を作成します

これらのサービスの詳細な比較については、「 Container Apps と他の Azure コンテナー オプションの比較」を参照してください。

仮想環境とコンテナー

開発環境で Python プロジェクトを実行する場合、依存関係を管理し、プロジェクトのセットアップの再現性を確保する一般的な方法は、仮想環境を使用することです。 仮想環境には、その環境で実行されているプロジェクト コードに必要な Python インタープリター、ライブラリ、スクリプトがインストールされています。 Python プロジェクトの依存関係は、 requirements.txt ファイルを介して管理されます。

ヒント

コンテナーでは、テストやその他の理由で仮想環境を使用しない限り、仮想環境は必要ありません。 仮想環境を使用する場合は、Docker イメージにコピーしないでください。 .dockerignore ファイルを使用して除外します。

Docker コンテナーは、仮想環境と同様の機能を提供すると考えることができますが、再現性と移植性にさらに利点があります。 Docker コンテナーは、OS に関係なく、コンテナーを実行できる任意の場所で実行できます。

Docker コンテナーには、Python プロジェクト コードと、コードを実行するために必要なすべてのものが含まれています。 その時点に到達するには、Python プロジェクト コードを Docker イメージにビルドし、そのイメージの実行可能なインスタンスであるコンテナーを作成する必要があります。

Python プロジェクトをコンテナー化する場合、主なファイルは次のとおりです。

プロジェクト ファイル 説明
requirements.txt イメージに正しい依存関係を取得するために、Docker イメージのビルド中に使用されます。
Dockerfile Python Docker イメージをビルドする方法を指定するために使用します。 詳細については、 Python の Dockerfile の手順に関するセクションを参照してください
.dockerignore .dockerignore 内のファイルとディレクトリは、Dockerfile の コマンドを使用して COPY Docker イメージにコピーされません。 .dockerignore ファイルでは、.gitignore ファイルと同様の除外パターンがサポートされています。 詳細については、「 .dockerignore ファイル」を参照してください。

ファイルを除外すると、イメージビルドのパフォーマンスが向上しますが、検査できる画像に機密情報を追加しないようにするためにも使用する必要があります。 たとえば、 .dockerignore には、 .env.venv (仮想環境) を無視する行が含まれている必要があります。

Web フレームワークのコンテナー設定

Web フレームワークには、Web 要求をリッスンする既定のポートがあります。 一部の Azure コンテナー ソリューションを使用する場合は、トラフィックを受信するコンテナーがリッスンしているポートを指定する必要があります。

Web フレームワーク Port
Django 8000
Flask 5000 または 5002
FastAPI (uvicorn) 8000 または 80

次の表は、異なる Azure コンテナー ソリューションのポートを設定する方法を示しています。

Azure コンテナー ソリューション Web アプリのポートを設定する方法
Web App for Containers 既定では、App Service はカスタム コンテナーがポート 80 またはポート 8080 のどちらかでリッスンしていることを前提としています。 コンテナーが別のポートをリッスンする場合は、App Service アプリで WEBSITES_PORT アプリ設定を設定します。 詳細については、「Azure App Serviceのカスタム コンテナーを構成する」を参照してください。
Azure Containers Apps Azure Container Apps を使用すると、イングレスを有効にすることで、コンテナー アプリをパブリック Web、VNET、または環境内の他のコンテナー アプリに公開できます。 イングレス targetPort を、コンテナーが受信要求をリッスンするポートに設定します。 アプリケーション イングレス エンドポイントは常にポート 443 で公開されます。 詳細については、「 Azure Container Apps で HTTPS または TCP イングレスを設定する」を参照してください。
Azure Container Instances、Azure Kubernetes コンテナーの作成時にポートを設定します。 ソリューションに Web フレームワーク、アプリケーション サーバー (gunicorn、uvicorn など)、Web サーバー (nginx など) があることを確認する必要があります。 たとえば、2 つのコンテナーを作成できます。1 つは Web フレームワークとアプリケーション サーバーを持つコンテナー、もう 1 つは Web サーバーを持つフレームワークです。 2 つのコンテナーは 1 つのポートで通信し、Web サーバー コンテナーは外部要求に対して 80/443 を公開します。

Python Dockerfile

Dockerfile は、Docker イメージを構築するための手順を含むテキスト ファイルです。 最初の行は、最初の基本イメージを示します。 この行の後に、必要なプログラムのインストール、ファイルのコピー、および作業環境を作成するためのその他の手順が続きます。 たとえば、Python Dockerfile の主要な手順に関する Python 固有の例をいくつか次の表に示します。

命令 目的
FROM 後続の手順の基本イメージを設定します。 FROM python:3.8-slim
EXPOSE コンテナーが実行時に指定されたネットワーク ポートでリッスンすることを Docker に指示します。 EXPOSE 5000
COPY 指定したソースからファイルまたはディレクトリをコピーし、指定した宛先パスにあるコンテナーのファイルシステムに追加します。 COPY . /app
実行 Docker イメージ内でコマンドを実行します。 たとえば、依存関係をプルします。 コマンドはビルド時に 1 回実行されます。 RUN python -m pip install -r requirements.txt
CMD コマンドは、コンテナーを実行するための既定値を提供します。 CMD 命令は 1 つだけです。 CMD ["gunicorn", "--bind", "0.0.0.0:5000", "wsgi:app"]

Docker ビルド コマンドは、Dockerfile とコンテキストから Docker イメージをビルドします。 ビルドのコンテキストは、指定したパスまたは URL にあるファイルのセットです。 通常、Python プロジェクトのルートからイメージをビルドします。次の例に示すように、build コマンドのパスは "." です。

docker build --rm --pull  --file "Dockerfile"  --tag "mywebapp:latest"  .

ビルド プロセスでは、コンテキスト内の任意のファイルを参照できます。 たとえば、ビルドでは COPY 命令を使用して、コンテキスト内のファイルを参照できます。 Flask フレームワークを使用した Python プロジェクトの Dockerfile の例を次に示します。

FROM python:3.8-slim

EXPOSE 5000

# Keeps Python from generating .pyc files in the container.
ENV PYTHONDONTWRITEBYTECODE=1

# Turns off buffering for easier container logging
ENV PYTHONUNBUFFERED=1

# Install pip requirements.
COPY requirements.txt .
RUN python -m pip install -r requirements.txt

WORKDIR /app
COPY . /app

# Creates a non-root user with an explicit UID and adds permission to access the /app folder.
RUN adduser -u 5678 --disabled-password --gecos "" appuser && chown -R appuser /app
USER appuser

# Provides defaults for an executing container; can be overridden with Docker CLI.
CMD ["gunicorn", "--bind", "0.0.0.0:5000", "wsgi:app"]

Dockerfile は手動で作成することも、VS Code と Docker 拡張機能を使用して自動的に作成することもできます。 詳細については、「 Docker ファイルの生成」を参照してください。

Docker ビルド コマンドは、Docker CLI の一部です。 VS Code や PyCharm などの IDE を使用する場合、Docker イメージを操作するための UI コマンドによってビルド コマンドが呼び出され、オプションの指定が自動化されます。

Python Docker イメージとコンテナーの操作

VS Code と PyCharm

Python コンテナー開発用の統合開発環境 (IDE) での作業は必要ありませんが、多くのコンテナー関連のタスクを簡略化できます。 VS Code と PyCharm で実行できる操作の一部を次に示します。

  • Docker イメージをダウンロードしてビルドします。

    • 開発環境でイメージをビルドします。
    • 開発環境に Docker をインストールせずに、Azure で Docker イメージをビルドします。 (PyCharm の場合は、Azure CLI を使用して Azure でイメージをビルドします)。
  • 既存のイメージ、プルされたイメージ、または Dockerfile から直接 Docker コンテナーを作成して実行します。

  • Docker Compose を使用してマルチコンテナー アプリケーションを実行します。

  • Docker Hub、GitLab、JetBrains Space、Docker V2、その他のセルフホステッド Docker レジストリなどのコンテナー レジストリに接続して操作します。

  • (VS Code のみ)Python プロジェクト用に調整された Dockerfile ファイルと Docker Compose ファイルを追加します。

開発環境で Docker コンテナーを実行するように VS Code と PyCharm を設定するには、次の手順を使用します。

まだインストールしていない場合は、 Azure Tools for VS Code をインストールします。

手順 Screenshot
手順 1: Shift + AltA + 使用して Azure 拡張機能を開き、Azure に接続していることを確認します。

VS Code 拡張機能バーの Azure アイコンを選択することもできます。

サインインしていない場合は、[ Azure にサインイン] を選択し、画面の指示に従います。

Azure サブスクリプションへのアクセスに問題がある場合は、プロキシの背後にいる可能性があります。 接続の問題を解決するには、「 Visual Studio Code でのネットワーク接続」を参照してください。
サインインすると Azure Tools がどのように表示されるかを示すスクリーンショット。サインインしていない場合の Azure Tools の外観を示すスクリーンショット。
手順 2: CtrlShift + Xキー + を使用して拡張機能を開き、Docker 拡張機能を検索して、拡張機能をインストールします。

VS Code 拡張機能バーの [拡張機能 ] アイコンを選択することもできます。
VS Code に Docker 拡張機能を追加する方法を示すスクリーンショット。
手順 3: 拡張機能バーで Docker アイコンを選択し、イメージを展開して、コンテナーとして実行するイメージを右クリックします。 VS Code で Docker 拡張機能を使用して Docker イメージからコンテナーを実行する方法を示すスクリーンショット。
手順 4: ターミナル ウィンドウで Docker の実行出力を監視する。 VS Code でコンテナーを実行する例を示すスクリーンショット。

Azure CLI と Docker CLI

また、Azure CLI と Docker CLI を使用して Python Docker イメージとコンテナーを操作することもできます。 VS Code と PyCharm の両方に、これらの CLI を実行できるターミナルがあります。

ビルドと実行の引数を細かく制御する場合や、自動化を行う場合は、CLI を使用します。 たとえば、次のコマンドは、Azure CLI az acr build を使用して Docker イメージ名を指定する方法を示しています。

az acr build --registry <registry-name> \
  --resource-group <resource-group> \
  --target pythoncontainerwebapp:latest .

別の例として、Docker CLI run コマンドの使用方法を示す次のコマンドを考えてみましょう。 この例では、コンテナーの外部で、開発環境の MongoDB インスタンスと通信する Docker コンテナーを実行する方法を示します。 コマンドを完了するためのさまざまな値は、コマンド ラインで指定した方が簡単に自動化できます。

docker run --rm -it \
  --publish <port>:<port> --publish 27017:27017 \
  --add-host mongoservice:<your-server-IP-address> \
  --env CONNECTION_STRING=mongodb://mongoservice:27017 \
  --env DB_NAME=<database-name> \
  --env COLLECTION_NAME=<collection-name> \
  containermongo:latest  

このシナリオの詳細については、「 コンテナー化された Python Web アプリをローカルでビルドしてテストする」を参照してください。

コンテナー内の環境変数

Python プロジェクトでは、多くの場合、環境変数を使用してデータをコードに渡します。 たとえば、テスト中に簡単に変更できるように、環境変数にデータベース接続情報を指定できます。 または、プロジェクトを運用環境にデプロイするときに、運用データベース インスタンスを参照するようにデータベース接続を変更できます。

python-dotenv のようなパッケージは、多くの場合、.env ファイルからキーと値のペアを読み取り、環境変数として設定するために使用されます。 .env ファイルは、仮想環境で実行する場合に便利ですが、コンテナーを操作する場合は推奨されません。 特に機密情報が含まれており、コンテナーが公開される場合は、 .env ファイルを Docker イメージにコピーしないでください。 .dockerignore ファイルを使用して、Docker イメージへのファイルのコピーを除外します。 詳細については、この記事の 「仮想環境とコンテナー 」セクションを参照してください。

環境変数は、いくつかの方法でコンテナーに渡すことができます。

  1. DockerfileENV 命令として定義されます。
  2. Docker ビルド コマンドを使用して引数として--build-arg渡されます。
  3. Docker ビルド コマンドと BuildKit バックエンドを使用して引数として--secret渡されます。
  4. Docker run コマンドを使用して、 または --env-file 引数として--env渡されます。

最初の 2 つのオプションには、 上記の .env ファイルと同じ欠点があります。つまり、機密情報を Docker イメージにハードコーディングしています。 Docker イメージを検査し、環境変数を確認できます。たとえば、 コマンド docker image inspect を使用します。

BuildKit の 3 番目のオプションを使用すると、最終的に最終的なイメージに格納されない安全な方法で Docker イメージを構築するために Dockerfile で使用されるシークレット情報を渡すことができます。

Docker run コマンドを使用して環境変数を渡す 4 番目のオプションは、Docker イメージに変数が含まれていないことを意味します。 ただし、変数は引き続きコンテナー インスタンスを検査して表示されます (たとえば、 docker コンテナー検査を使用)。 このオプションは、コンテナー インスタンスへのアクセスが制御されている場合、またはテストまたは開発シナリオで使用できる場合があります。

Docker CLI run コマンドを使用し、 引数を使用して環境変数を渡す例を次に --env 示します。

# PORT=8000 for Django and 5000 for Flask
export PORT=<port-number>

docker run --rm -it \
  --publish $PORT:$PORT \
  --env CONNECTION_STRING=<connection-info> \
  --env DB_NAME=<database-name> \
  <dockerimagename:tag>

VS Code または PyCharm を使用している場合、イメージとコンテナーを操作するための UI オプションでは、最終的に上記のような Docker CLI コマンドが使用されます。

最後に、Azure にコンテナーをデプロイするときに環境変数を指定することは、開発環境での環境変数の使用とは異なります。 次に例を示します。

  • Web App for Containers の場合、App Serviceの構成中にアプリケーション設定を構成します。 これらの設定は、環境変数として自分のアプリのコードで利用できます。アクセスには標準の os.environ パターンを使用します。 必要に応じて、初期デプロイ後に値を変更できます。 詳細については、「 環境変数としてアプリ設定にアクセスする」を参照してください。

  • Azure Container Apps の場合、コンテナー アプリの初期構成時に環境変数を構成します。 その後環境変数を変更すると、コンテナーの リビジョン が作成されます。 さらに、Azure Container Apps を使用すると、アプリケーション レベルでシークレットを定義し、それらを環境変数で参照できます。 詳細については、「 Azure Container Apps でシークレットを管理する」を参照してください。

別のオプションとして、 Service Connector を使用して、Azure コンピューティング サービスを他のバッキング サービスに接続できます。 このサービスでは、管理プレーンでコンピューティング サービスとターゲット バッキング サービス間のネットワーク設定および接続情報 (環境変数の生成など) を構成します。

コンテナー ログの表示

コンテナー インスタンス ログを表示して、コードからの診断メッセージの出力を表示し、コンテナーのコードの問題をトラブルシューティングします。 開発環境でコンテナーを実行するときにログを表示するには、次のいくつかの方法があります。

  • VS Code または PyCharm を使用してコンテナーを実行すると、 VS Code と PyCharm のセクションに示すように、Docker の実行時に開かれたターミナル ウィンドウにログを表示できます。

  • 対話型フラグ -itを指定して Docker CLI run コマンドを使用している場合は、コマンドの後に出力が表示されます。

  • Docker Desktop では、実行中のコンテナーのログを表示することもできます。

Azure にコンテナーをデプロイすると、コンテナー ログにもアクセスできます。 いくつかの Azure サービスと、Azure portal内のコンテナー ログにアクセスする方法を次に示します。

Azure サービス Azure portalのログにアクセスする方法
Web App for Containers [問題の 診断と解決 ] リソースに移動してログを表示します。 診断 は、構成を必要とせず、アプリのトラブルシューティングに役立つインテリジェントで対話型のエクスペリエンスです。 ログをリアルタイムで表示するには、 監視 - ログ ストリームに移動します。 ログ クエリと構成の詳細については、「 監視」の他のリソースを参照してください。
Azure Container Apps 環境リソースの [問題の診断と解決] に移動して、環境の問題のトラブルシューティングを行います。 多くの場合、コンテナー ログを表示する必要があります。 コンテナー リソースの [ アプリケーション - リビジョン管理] でリビジョンを選択し、そこからシステムログとコンソールログを表示できます。 ログ クエリと構成の詳細については、「 監視」のリソースを参照してください。
Azure Container Instances [コンテナー] リソースに移動し、[ログ] を選択します

上記と同じサービスについて、ログにアクセスするための Azure CLI コマンドを次に示します。

Azure サービス ログにアクセスするための Azure CLI コマンド
Web App for Containers az webapp log
Azure Container Apps az containerapps logs
Azure Container Instances az container logs

VS Code でのログの表示もサポートされています。 Azure Tools for VS Code がインストールされている必要があります。 VS Code でコンテナー (App Service) ログのWeb Appsを表示する例を次に示します。

VS Code for Web Apps for Containers でログを表示する方法を示すスクリーンショット。

次のステップ