コンテナ内のPython
このチュートリアルでは、以下の方法を学習します。
- シンプルな Python コンテナーを記述する
Dockerfile
ファイルを作成する。 - Django、Flask、または汎用Pythonアプリのビルド、実行、機能の検証を行う。
- コンテナーで実行されているアプリをデバッグする。
前提条件
-
マシンにDockerをインストールし、システムパスに追加する。
-
Linuxでは、VS Codeの実行に使用する非rootユーザーアカウントに対してDocker CLIを有効にする必要があります。
-
Container Tools拡張機能。拡張機能をインストールするには、拡張機能ビュー(⇧⌘X (Windows, Linux Ctrl+Shift+X))を開き、
container tools
と検索して結果を絞り込み、Microsoftが作成したContainer Tools拡張機能を選択します。
Pythonプロジェクトを作成する
Pythonプロジェクトをまだお持ちでない場合は、チュートリアル「Pythonの概要」に従ってください。
注:完全なDjangoまたはFlaskウェブアプリをコンテナ化したい場合は、以下のいずれかのサンプルから始めることができます。
注:このチュートリアルでは、サンプルリポジトリの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
ファイルが含まれている限り、フォルダ名へのパスを入力することもできます。 -
ポート番号を選択します。rootユーザーとして実行することによるセキュリティ上の懸念を軽減するため、ポート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を使用してDockerファイルの作成を支援し、自動補完とコンテキストに応じたヘルプを提供します。この機能の動作を見るには、
-
Dockerfile
を開きます。 -
EXPOSE
ステートメントの下で、IntelliSenseをトリガーするために⌃Space (Windows, Linux Ctrl+Space)と入力し、ENV
までスクロールします。 -
TabまたはEnterを押してステートメントを完了し、
key
を変数名に、value
を値に設定します。
Dockerfileでの環境変数の設定と使用に関する詳細については、DockerドキュメントのENV命令と環境置換セクションを参照してください。
DjangoおよびFlaskアプリのGunicorn修正
Pythonウェブ開発者に優れた出発点を提供するために、デフォルトのウェブサーバーとしてGunicornを使用することにしました。デフォルトのDockerfileで参照されているため、requirements.txt
ファイルに依存関係として含まれています。requirements.txt
にGunicornが見つからない場合は、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...コマンドの実行中に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デバッガーがブレークポイントで停止します。
-
この行を一度ステップオーバーします。
-
準備ができたら、続行を押します。
Container Tools拡張機能は、ブラウザをランダムにマップされたポートで起動します。
ヒント:イメージタグの変更など、Dockerビルド設定を変更するには、
.vscode -> tasks.json
ファイルのdocker-build
タスクにあるdockerBuild
属性に移動します。ファイル内でIntelliSense(⌃Space (Windows, Linux Ctrl+Space))を使用して、他のすべての有効なディレクティブを表示します。
コンテナエクスプローラーを使用する
Container Explorerは、コンテナ、イメージなどのコンテナ資産を調べたり管理したりするためのインタラクティブなエクスペリエンスを提供します。例を見るには、
-
Container Explorerに移動します。
-
Containersタブで、コンテナを右クリックし、View Logsを選択します。
-
出力はターミナルに表示されます。
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にデプロイする
コンテナイメージがビルドされると、指定したタグでContainer Registryに表示されるはずです。ビルドが完了したので、Azure App ServiceまたはAzure Container Appsにデプロイできます。Azure App ServiceへのデプロイにはAzure App Service拡張機能が推奨され、Azure Container AppsへのデプロイにはAzure Container Apps拡張機能が必要です。これら両方は、幅広いAzure開発シナリオ向けのツールパッケージを含むAzure Tools拡張機能パックをインストールすることで入手できます。
-
イメージタグを右クリックし、Deploy Image to Azure App ServiceまたはDeploy Image to Azure Container Appsを選択します。
-
ウェブサイトの名前を指定します。これは一意の名前である必要があり、Djangoアプリの場合は、
settings.py
ファイルのALLOWED_HOSTS
リストに有効なホスト名として記載されている必要があります。 -
リソースグループ、場所、およびApp Serviceプランを指定します。始めたばかりの場合は、無料プランを選択できます。
-
イメージがデプロイされます。このプロセスには数分かかる場合があります。デプロイが完了すると、サイトにアクセスするためのボタン付き通知が表示されます。また、作成時に指定した名前が
{appname}
となるサイトのアドレス{appname}.azurewebsites.net
を使用することもできます。最初うまくいかない場合は、数分後に再度試してください。最初の数回の試行でタイムアウトしたりエラーが返されたりするのは珍しいことではありません。これは単にApp Serviceがまだリクエストを受け取る準備ができていないことを意味します。 -
いずれかのページに表示されるアプリケーションコードに小さな変更を加え、ファイルを保存します。
-
Azureアイコンを使用してリソースビューを開き、サブスクリプションのノードを展開して、前の手順でデプロイしたApp Serviceを見つけます。
-
App Serviceノードを右クリックし、利用可能なオプションを確認します。Deploy to Web Appを選択し、アプリフォルダを指定してデプロイします。
以前のデプロイを上書きするという警告が表示されたら、Deployを選択して確認します。
これには数分かかる場合があります。ターミナルウィンドウで進行状況を監視できます。完了すると、サイトにアクセスするためのボタンが表示されます。
ボタンを使用して、変更がサイトに反映されていることを確認します。
おめでとうございます。VS CodeでPythonを使用して、クラウドでホストされインターネット上で公開されているウェブサイトを作成し、デプロイしました!
リソースを解放する
Azureポータルで、この演習中に作成したすべてのリソースを解放するためにリソースグループを削除します。
次のステップ
完了しました!コンテナの準備ができたので、次のことを行いたいかもしれません。