コンテナー内の Python

このチュートリアルでは、以下の方法について説明します。

  • 単純なPythonコンテナーを記述するDockerfileファイルを作成します。
  • DjangoFlask、または一般的な Python アプリのビルド、実行、および機能の検証。
  • コンテナーで実行されているアプリをデバッグします。

前提条件

Python プロジェクトの作成

まだ Python プロジェクトがない場合は、チュートリアル「Python の概要」に従ってください。

注意: 完全な Django または Flask Web アプリをコンテナー化する場合は、次のいずれかのサンプルから開始できます。

注意: このチュートリアルでは、サンプル リポジトリの tutorial ブランチを必ず使用してください。

アプリが正しく動作することを確認したら、アプリケーションをコンテナー化できます。

プロジェクトに Docker ファイルを追加する

  1. プロジェクトフォルダーを VS Code で開きます。

  2. コマンド パレット (⇧⌘P (Windows、Linux Ctrl+Shift+P)) を開き、Containers: Add Docker Files to Workspace... (Docker ファイルをワークスペースに追加...) を選択します。

    Add Dockerfile to a Python project

  3. アプリの種類の入力を求められたら、アプリの種類として Python: DjangoPython: Flask、または Python: General を選択します。このチュートリアルでは Python: General のケースに焦点を当てますが、Django と Flask に関する注記も含めます。

  4. アプリのエントリ ポイントへの相対パスを入力します。これには、開始位置のワークスペース フォルダーは含まれません。「Python の概要」チュートリアルに従って hello.py を含む Python アプリを作成した場合は、それを選択します。

    Django: manage.py (ルート フォルダー) または subfolder_name/manage.py を選択します。Django の公式ドキュメントを参照してください。

    Flask: Flask インスタンスを作成する場所へのパスを選択します。Flask の公式ドキュメントを参照してください。

    ヒント: __main__.py ファイルが含まれているフォルダーであれば、フォルダー名へのパスを入力することもできます。

  5. ポート番号を選択します。ルート ユーザーとしての実行に伴うセキュリティ上の懸念を軽減するため、ポート 1024 以上を選択することをお勧めします。未使用のポートであればどれでも動作しますが、Django と Flask は標準のデフォルト ポートを使用します。

    Django: デフォルト ポートは 8000 です。

    Flask: デフォルト ポートは 5000 です。

  6. Docker Compose を含めるか求められたら、Docker Compose ファイルが不要な場合は No (いいえ) を選択します。Yes (はい) を選択した場合は、Compose Up コマンドを正常に実行するために、Dockerfile 内の wsgi.py ファイルへのパスを確認する必要があります。Compose は通常、複数のコンテナーを同時に実行する場合に使用されます。

  7. これらの情報をすべて使用して、Container Tools 拡張機能は次のファイルを作成します。

    • Dockerfile。このファイル内の IntelliSense の詳細については、概要を参照してください。

    • .git.vscode__pycache__ など、不要なファイルやフォルダーを除外してイメージのサイズを削減するための .dockerignore ファイル。

    • Docker Compose を使用している場合は、docker-compose.yml および docker-compose.debug.yml ファイル。

    • まだ存在しない場合は、すべてのアプリの依存関係をキャプチャするための requirements.txt ファイル。

    重要な注意: このセットアップを使用するには、Python フレームワーク (Django/Flask) と Gunicorn が requirements.txt ファイルに含まれている必要があります。仮想環境/ホスト マシンにこれらの前提条件がすでにインストールされており、コンテナー環境と同一にする必要がある場合は、ターミナルで pip freeze > requirements.txt を実行してアプリの依存関係が移植されていることを確認してください。これにより、現在の requirements.txt ファイルが上書きされます。

(任意) イメージに環境変数を追加する

このステップは必須ではありませんが、コンテナーの環境で設定する必要がある環境変数を追加する方法を理解するのに役立つように含まれています。

Container Tools 拡張機能は、IntelliSense を使用して自動補完やコンテキスト ヘルプを提供し、Dockerfile の作成を支援します。この機能の実際の動作を確認するには、以下の手順を実行します。

  1. Dockerfile を開きます。

  2. EXPOSE ステートメントの下で、⌃Space (Windows、Linux Ctrl+Space) を入力して IntelliSense を起動し、ENV までスクロールします。

    Adding environment variable to Dockerfile

  3. Tab キーまたは Enter キーを押してステートメントを補完し、key に変数の名前を設定し、value を設定します。

Dockerfile での環境変数の設定と使用の詳細については、Docker ドキュメントの ENV 命令および環境の置換セクションを参照してください。

Django および Flask アプリ用の Gunicorn の変更

Python Web 開発者に最適な出発点を提供するため、デフォルトの Web サーバーとして Gunicorn を使用することを選択しました。デフォルトの Dockerfile で参照されているため、requirements.txt ファイルに依存関係として含まれています。requirements.txt に見つからない場合は、pip install gunicorn を実行してから pip freeze > requirements.txt を実行して、requirements.txt ファイルを再生成してください。

  • Django: Gunicorn を使用するには、エントリ ポイントとしてアプリケーションのコーラブル (アプリケーション サーバーがコードと通信するために使用するもの) にバインドする必要があります。このコーラブルは、Django アプリケーションの wsgi.py ファイルで宣言されます。このバインドを実現するために、Dockerfile の最後の行には次のように記述されています。

    CMD ["gunicorn", "--bind", "0.0.0.0:8000", "{workspace_folder_name}.wsgi"]
    

    プロジェクトが Django のデフォルトのプロジェクト構造 (ワークスペース フォルダーと、ワークスペースと同じ名前のサブフォルダー内にある wsgi.py ファイル) に従っていない場合は、正しい wsgi.py ファイルを特定するために Dockerfile 内の Gunicorn エントリ ポイントを上書きする必要があります。

    wsgi.py ファイルがルート フォルダーにある場合、上記のコマンドの最後の引数は "wsgi" になります。サブフォルダー内の場合、引数は "subfolder1_name.subfolder2_name.wsgi" になります。

  • Flask: Gunicorn を使用するには、エントリ ポイントとしてアプリケーションのコーラブル (アプリケーション サーバーがコードと通信するために使用するもの) にバインドする必要があります。このコーラブルは、作成した Flask インスタンスのファイル場所変数名に対応します。Flask の公式ドキュメントによると、ユーザーは通常、メイン モジュールまたはパッケージの __init__.py ファイルに次のように Flask インスタンスを作成します。

    from flask import Flask
    app = Flask(__name__) # Flask instance named app
    

    このバインドを実現するために、Dockerfile の最後の行には次のように記述されています。

    CMD ["gunicorn", "--bind", "0.0.0.0:5000", "{subfolder}.{module_file}:app"]
    

    Containers: Add Docker Files to Workspace... (Docker ファイルをワークスペースに追加...) コマンドの実行中に、Flask インスタンスへのパスを設定しますが、Container Tools 拡張機能は Flask インスタンス変数の名前が app であると想定します。そうでない場合は、Dockerfile 内の変数名を変更する必要があります。

    メイン モジュールがルート フォルダーに main.py という名前のファイルとして存在し、Flask インスタンス変数の名前が myapp であった場合、上記のコマンドの最後の引数は "main:myapp" になります。サブフォルダー内の場合、引数は "subfolder1_name.subfolder2_name.main:myapp" になります。

コンテナーのビルド、実行、およびデバッグ

Containers: Add Docker Files to Workspace... (Docker ファイルをワークスペースに追加...) コマンドを実行すると、コンテナーをビルドしてデバッグ モードで実行するための Docker 起動構成が自動的に作成されます。Python アプリ コンテナーをデバッグするには、以下の手順を実行します。

  1. アプリのスタートアップ コードが含まれているファイルに移動し、ブレークポイントを設定します。

  2. [実行とデバッグ] (Run and Debug) に移動し、必要に応じて Containers: Python - GeneralContainers: Python - Django、または Containers: Python - Flask を選択します。

    Selected container debug configuration

  3. F5 キーを使用してデバッグを開始します。

    • コンテナー イメージがビルドされます。
    • コンテナーが実行されます。
    • Python デバッガーがブレークポイントで停止します。
  4. この行を 1 回ステップ オーバーします。

  5. 準備ができたら、続行を押します。

Container Tools 拡張機能は、ランダムにマップされたポートでブラウザーを起動します。

Django website launches

ヒント: イメージ タグの変更など、Docker のビルド設定を変更するには、.vscode -> tasks.jsondocker-build タスク内にある dockerBuild 属性に移動します。ファイル内で IntelliSense (⌃Space (Windows、Linux Ctrl+Space)) を使用して、他のすべての有効なディレクティブを表示します。

Container Explorer の使用

Container Explorer を使用すると、コンテナーやイメージなどのコンテナー資産を対話的に調査および管理できます。例を確認するには、以下の手順を実行します。

  1. Container Explorer に移動します。

  2. Containers タブでコンテナーを右クリックし、View Logs (ログの表示) を選択します。

    Viewing the logs of a container

  3. 出力がターミナルに表示されます。

Azure でのイメージのビルド

Azure Container Registry: Build Image in Azure コマンドを使用すると、Azure App Service または Azure Container Apps にデプロイできるイメージをビルドできます。

  1. Azure Resources 拡張機能をインストールします。コマンド パレット (⇧⌘P (Windows、Linux Ctrl+Shift+P)) を開き、Azure: Sign In (Azure: サインイン) コマンドを検索します。Azure アカウントをお持ちでない場合は、無料試用版にサインアップできます。

  2. Azure でのビルド コマンドを呼び出すには 2 つの方法があります。Dockerfile を右クリックして Build Image in Azure (Azure でイメージをビルド) を選択するか、コマンド パレット (⇧⌘P (Windows、Linux Ctrl+Shift+P)) を使用して Azure Container Registry: Build Image in Azure コマンドを検索します。

    Invoke the command Build Image in Azure

  3. ビルドするイメージの名前とタグを選択します。これは、コンテナー レジストリ内でイメージを識別するために使用されます。

    Choose the name and tag for the built image.

  4. 使用する Azure サブスクリプションを選択します。

  5. 既存の Azure Container Registry を選択するか、新しく作成します。新規作成する場合は、名前、リソース グループ、場所、および価格オプション(Basic、Standard、または Premium)の指定を求められます。これらのオプションのコストについては、料金 - Container Registry で確認できます。

  6. ベース OS(Linux または Windows)を指定します。この選択は Dockerfile と一致している必要があります。

    Choose the base OS for the built image

イメージのビルド プロセスには数分かかる場合があります。進行状況はターミナルで追跡できます。エラー (Error: failed to download context.) が発生した場合は、コンテナー レジストリの Refresh (更新) オプションを試してから、再度ビルドをリクエストしてください。再ビルドする前に、古いイメージを手動で削除してください。

Azure App Service または Azure Container Apps へのデプロイ

コンテナー イメージがビルドされると、指定したタグ付きで Container Registry に表示されます。ビルドが完了したら、Azure App Service または Azure Container Apps にデプロイできます。Azure App Service へのデプロイには Azure App Service 拡張機能、Azure Container Apps へのデプロイには Azure Container Apps 拡張機能が必要です。幅広い Azure 開発シナリオ向けのツール パッケージが含まれている Azure Tools 拡張機能パックをインストールすると、両方を入手できます。

  1. イメージ タグを右クリックし、Deploy Image to Azure App Service (Azure App Service にイメージをデプロイ) または Deploy Image to Azure Container Apps (Azure Container Apps にイメージをデプロイ) を選択します。

    Deploy image to Azure App Service

  2. Web サイトの名前を入力します。これは一意の名前である必要があり、Django アプリの場合は、settings.py ファイルの ALLOWED_HOSTS リストに有効なホスト名として登録されている必要があります。

  3. リソース グループ、場所、および App Service プランを指定します。始めたばかりの場合は、無料プランを選択できます。

  4. イメージがデプロイされます。このプロセスには数分かかる場合があります。デプロイが完了すると、サイトにアクセスするためのボタンを含む通知が表示されます。サイトのアドレス {appname}.azurewebsites.net ({appname} は作成時に指定した名前) を使用することもできます。最初にうまく動作しない場合は、数分後にもう一度お試しください。最初の数回のアクセスでタイムアウトしたりエラーが返されたりすることは珍しくありません。これは、App Service がリクエストを受信する準備がまだできていないことを意味しているだけです。

  5. いずれかのページに表示されるアプリケーション コードに小さな変更を加え、ファイルを保存します。

  6. Azure アイコンを使用して Resources ビューを開き、サブスクリプションのノードを展開して、前の手順でデプロイした App Service を見つけます。

  7. App Service ノードを右クリックして、利用可能なオプションを確認します。Deploy to Web App (Web アプリにデプロイ) を選択し、デプロイするアプリ フォルダーを指定します。

    Deploy to Web App

    これにより前のデプロイが上書きされるという警告が表示されたら、Deploy (デプロイ) を選択して確認します。

    これには数分かかる場合があります。進行状況はターミナル ウィンドウで監視できます。完了すると、サイトにアクセスするためのボタンが表示されます。

    Browse website button

    ボタンを使用して、変更がサイトに反映されていることを確認します。

おめでとうございます!VS Code で Python を使用して、クラウドにホストされ、インターネット上で公開されている Web サイトを作成し、デプロイしました。

リソースの解放

Azure ポータルでリソース グループを削除し、この演習中に作成したすべてのリソースを解放します。

次のステップ

完了です!コンテナーが準備できたので、次のことができます。

© . This site is unofficial and not affiliated with Microsoft.