コンテナー内の Python
このチュートリアルでは、次の方法について学びます
- シンプルな Python コンテナーを記述する
Dockerfile
ファイルを作成する。 - Django、Flask、または汎用 Python アプリの機能をビルド、実行、および検証します。
- コンテナーで実行されているアプリをデバッグする。
前提条件
-
お使いのマシンにDocker をインストールし、システム パスに追加します。
-
Linux では、VS Code の実行に使用される非ルート ユーザー アカウントに対して、Docker CLI を有効にする必要もあります。
-
Container Tools 拡張機能。拡張機能をインストールするには、拡張機能ビュー (⇧⌘X (Windows、Linux Ctrl+Shift+X)) を開き、
container tools
を検索して結果をフィルター処理し、Microsoft 作成の Container Tools 拡張機能を選択します。
Python プロジェクトの作成
まだ Python プロジェクトがない場合は、チュートリアル「Python の概要」に従ってください。
注: 完全な Django または Flask Web アプリをコンテナー化する場合は、次のいずれかのサンプルから開始できます。
注: このチュートリアルでは、サンプル リポジトリの tutorial ブランチを必ず使用してください。
アプリが正常に実行されることを確認したら、アプリケーションをコンテナー化できます。
プロジェクトにDockerファイルを追加する
-
VS Codeでプロジェクトフォルダを開きます。
-
コマンド パレット (⇧⌘P (Windows、Linux Ctrl+Shift+P)) を開き、[Containers: Add Docker Files to Workspace...] を選択します。
-
アプリの種類を尋ねられたら、アプリの種類として [Python: Django]、[Python: Flask]、または [Python: General] を選択します。このチュートリアルでは、[Python: General] のケースに焦点を当てますが、Django と Flask の注記も含まれます。
-
アプリのエントリ ポイントへの相対パスを入力します。これには、開始元のワークスペース フォルダーは含まれません。「Python の概要」チュートリアルに従って
hello.py
を含む Python アプリを作成した場合は、それを選択します。Django:
manage.py
(ルート フォルダー) またはsubfolder_name/manage.py
を選択します。Django の公式ドキュメントを参照してください。Flask: Flask インスタンスを作成する場所へのパスを選択します。Flask の公式ドキュメントを参照してください。
ヒント: このフォルダーに
__main__.py
ファイルが含まれている限り、フォルダー名へのパスを入力することもできます。 -
ポート番号を選択します。ルート ユーザーとして実行することによるセキュリティ上の懸念を軽減するため、ポート 1024 以上を選択することをお勧めします。未使用のポートはすべて使用できますが、Django と Flask は標準の既定ポートを使用します。
Django: 既定のポート 8000。
Flask: 既定のポートは 5000 です。
-
Docker Compose を含めるかどうかを尋ねられたら、Docker Compose ファイルが不要な場合は [いいえ] を選択します。[はい] を選択した場合は、[Compose Up] コマンドを正常に実行するために、
Dockerfile
内のwsgi.py
ファイルへのパスを確認する必要があります。Compose は通常、一度に複数のコンテナーを実行する場合に使用されます。 -
このすべての情報を使用して、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 の作成を支援します。この機能の動作を確認するには、次のようにします。
-
Dockerfile
を開きます。 -
EXPOSE
ステートメントの下で、⌃Space (Windows、Linux Ctrl+Space) と入力して IntelliSense をトリガーし、ENV
までスクロールします。 -
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"]
[Containers: Add Docker Files to Workspace...] コマンド中に、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 起動構成を自動的に作成します。Python アプリ コンテナーをデバッグするには、次のようにします。
-
アプリの起動コードを含むファイルに移動し、ブレークポイントを設定します。
-
[実行とデバッグ] に移動し、必要に応じて [Containers: Python - General]、[Containers: Python - Django]、または [Containers: Python - Flask] を選択します。
-
F5 キーを使用してデバッグを開始します。
- コンテナー イメージがビルドされます。
- コンテナーが実行されます。
- Python デバッガーがブレークポイントで停止します。
-
この行を 1 回ステップ オーバーします。
-
準備ができたら、続行を押します。
Container Tools 拡張機能は、ランダムにマップされたポートでブラウザーを起動します。
ヒント: イメージ タグの変更など、Docker ビルド設定を変更するには、
docker-build
タスクのdockerBuild
属性の下にある.vscode -> tasks.json
に移動します。ファイル内で IntelliSense (⌃Space (Windows、Linux Ctrl+Space)) を使用して、他のすべての有効なディレクティブを表示します。
コンテナー エクスプローラーの使用
コンテナー エクスプローラーは、コンテナー、イメージなどのコンテナー資産を検査および管理するための対話的なエクスペリエンスを提供します。例を見るには、次のようにします。
-
コンテナー エクスプローラーに移動します。
-
[コンテナー] タブで、コンテナーを右クリックし、[ログの表示] を選択します。
-
出力がターミナルに表示されます。
Azure でイメージをビルドする
[Azure Container Registry: Build Image in Azure] コマンドを使用して、Azure App Service または Azure Container Apps にデプロイできるイメージをビルドできます。
-
Azure Resources 拡張機能をインストールします。コマンド パレット (⇧⌘P (Windows、Linux Ctrl+Shift+P)) を開き、[Azure: Sign In] コマンドを検索します。Azure アカウントをお持ちでない場合は、無料試用版にサインアップできます。
-
Azure でのビルド コマンドを呼び出すには 2 つの方法があります。Dockerfile を右クリックし、[Build Image in Azure] を選択できます。コマンド パレット (⇧⌘P (Windows、Linux Ctrl+Shift+P)) を使用して、[Azure Container Registry: Build Image in Azure] コマンドを検索することもできます。
-
ビルドされたイメージの名前とタグを選択します。これを使用して、コンテナー レジストリでイメージを識別します。
-
使用する Azure サブスクリプションを選択します。
-
既存の Azure Container Registry を選択するか、新しいものを作成します。新しいものを作成する場合、名前、リソース グループ、場所、および Basic、Standard、Premium などの価格オプションを指定するように求められます。これらのオプションのコストについては、価格 - Container Registry で確認できます。
-
基本 OS、Linux または Windows を指定します。この選択は Dockerfile と一致している必要があります。
イメージのビルド プロセスには数分かかる場合があります。進行状況はターミナルで追跡できます。エラー (Error: failed to download context.
) が発生した場合は、コンテナー レジストリで [更新] オプションを使用し、別のビルドを要求してみてください。再ビルドする前に、古いイメージを手動で削除します。
Azure App Service または Azure Container Apps にデプロイする
コンテナー イメージがビルドされると、指定したタグと共にコンテナー レジストリに表示されるはずです。ビルドされたので、Azure App Service または Azure Container Apps にデプロイできます。Azure App Service へのデプロイには Azure App Service 拡張機能が推奨され、Azure Container Apps へのデプロイには Azure Container Apps 拡張機能が必要です。Azure Tools 拡張機能パックをインストールすると、両方を取得できます。これには、さまざまな Azure 開発シナリオ用のツール パッケージが含まれています。
-
イメージ タグを右クリックし、[Deploy Image to Azure App Service] または [Deploy Image to Azure Container Apps] を選択します。
-
Web サイトの名前を指定します。これは一意の名前である必要があり、Django アプリの場合は、
settings.py
ファイルのALLOWED_HOSTS
リストに有効なホスト名としてリストされている必要もあります。 -
リソース グループ、場所、および App Service プランを指定します。始めたばかりの場合は、無料プランを選択できます。
-
イメージがデプロイされます。このプロセスには数分かかる場合があります。デプロイされると、サイトにアクセスするために使用できるボタンを含む通知が表示されます。サイトのアドレス
{appname}.azurewebsites.net
を使用することもできます。ここで、{appname}
は作成時に指定した名前です。最初に機能しない場合は、数分後にもう一度試してください。最初の数回の試行がタイムアウトするか、エラーを返すことは珍しくありません。これは、App Service がまだ要求を受信する準備ができていないことを意味します。 -
いずれかのページで表示されるアプリケーション コードに小さな変更を加え、ファイルを保存します。
-
Azure アイコンを使用して [リソース] ビューを開き、サブスクリプションのノードを展開して、前の手順でデプロイした App Service を見つけます。
-
App Service ノードを右クリックし、使用可能なオプションを確認します。[Web アプリにデプロイ] を選択し、デプロイするアプリ フォルダーを指定します。
これにより以前のデプロイが上書きされるという警告が表示されたら、[デプロイ] を選択して確認します。
これには数分かかる場合があります。進行状況はターミナル ウィンドウで監視できます。完了すると、サイトにアクセスできるボタンが表示されます。
ボタンを使用して、変更がサイトに反映されていることを確認します。
おめでとうございます。VS Code で Python を使用して、クラウドでホストされ、インターネットで公開されている Web サイトを作成およびデプロイしました。
リソースの解放
Azure portal で、リソース グループを削除して、この演習で作成したすべてのリソースを解放します。
次のステップ
完了しました!コンテナの準備ができたので、次のことを行いたいかもしれません。