🚀 VS Code で GitHub Copilot を無料入手!

コンテナー内の Python

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

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

前提条件

  • Docker をインストール し、システムパスに追加します。

  • Linux では、VS Code を実行するために使用される 非 root ユーザーアカウントの Docker CLI を有効にする 必要もあります。

  • Docker 拡張機能。拡張機能をインストールするには、拡張機能ビューを開き (⇧⌘X (Windows、Linux Ctrl+Shift+X))、docker を検索して結果をフィルター処理し、Microsoft が作成した Docker 拡張機能を選択します。

    Select Docker extension

Python プロジェクトを作成する

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

: 完全な Django または Flask Web アプリケーションをコンテナー化する場合は、次のサンプルから始めることができます

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

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

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

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

  2. コマンドパレットを開き (⇧⌘P (Windows、Linux Ctrl+Shift+P))、Docker: 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. ポート番号を選択します。root ユーザーとして実行する ことによるセキュリティ上の懸念を軽減するために、1024 以上のポートを選択することをお勧めします。未使用のポートはどれでもかまいませんが、Django と Flask は標準のデフォルトポートを使用します。

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

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

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

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

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

    • .dockerignore ファイル。.git.vscode__pycache__ など、不要なファイルとフォルダーを除外してイメージサイズを縮小します。

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

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

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

(オプション) 環境変数をイメージに追加する

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

Docker 拡張機能は、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 ファイル) に従っていない場合は、Dockerfile の Gunicorn エントリポイントを上書きして、正しい wsgi.py ファイルを見つける必要があります。

    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"]
    

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

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

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

Docker: Docker ファイルをワークスペースに追加... コマンドは、デバッグモードでコンテナーをビルドおよび実行するための Docker 起動構成を自動的に作成します。Python アプリケーションコンテナーをデバッグするには

  1. アプリケーションの起動コードを含むファイルに移動し、ブレークポイントを設定します。

  2. 実行とデバッグ に移動し、必要に応じて Docker: Python - GeneralDocker: Python - Django、または Docker: Python - Flask を選択します。

    Selected Docker debug configuration

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

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

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

Docker 拡張機能は、ランダムにマッピングされたポートにブラウザーを起動します

Django website launches

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

Docker Explorer を使用する

Docker Explorer は、コンテナー、イメージなどの Docker アセットを調べて管理するためのインタラクティブなエクスペリエンスを提供します。例を見るには

  1. Docker Explorer に移動します。

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

    Viewing the logs of a container

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

Azure でイメージをビルドする

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

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

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

    Invoke the command Build Image in Azure

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

    Choose the name and tag for the built image.

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

  5. 既存の Azure Container Registry を選択するか、新しい Azure Container Registry を作成します。新しい 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.) が発生した場合は、コンテナーレジストリで 更新 オプションを使用してから、別のビルドを要求してみてください。再構築する前に、古いイメージを手動で削除してください。

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. イメージタグを右クリックし、Azure App Service にイメージをデプロイ または 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. ページの 1 つに表示されるアプリケーションコードに小さな変更を加え、ファイルを保存します。

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

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

    Deploy to Web App

    これが以前のデプロイメントを上書きすると警告されたら、デプロイ を選択して確認します。

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

    Browse website button

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

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

リソースを解放する

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

次のステップ

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