Docker Compose の使用
Docker Compose は、連携して動作する複数のコンテナーをオーケストレーションする方法を提供します。たとえば、リクエストを処理するサービスとフロントエンドの Web サイト、または Redis キャッシュなどの補助機能を使用するサービスなどがあります。アプリの開発にマイクロサービス モデルを使用している場合は、Docker Compose を使用して、アプリのコードを Web リクエストで通信する、独立して動作する複数のサービスに分割できます。この記事では、Node.js、Python、または .NET アプリで Docker Compose を有効にする方法、およびこれらのシナリオで Visual Studio Code のデバッグを構成する方法を説明します。
また、単一コンテナーのシナリオでも、Docker Compose を使用することで、単一の Dockerfile では不可能な、ツールに依存しない構成が可能になります。コンテナーのボリューム マウント、ポート マッピング、環境変数などの構成設定は、docker-compose YML ファイルで宣言できます。
Container Tools 拡張機能を使用して VS Code で Docker Compose を使用するには、すでに Docker Compose の基本を理解している必要があります。
プロジェクトへの Docker Compose サポートの追加
すでに 1 つ以上の Dockerfile がある場合は、コマンド パレット(⇧⌘P(Windows、Linux Ctrl+Shift+P))を開き、Containers: Add Docker Compose Files to Workspace コマンドを使用することで、Docker Compose ファイルを追加できます。プロンプトに従ってください。
コマンド パレット(⇧⌘P(Windows、Linux Ctrl+Shift+P))を開き、Containers: Add Docker Files to Workspace コマンドを使用することで、Dockerfile を追加すると同時に Docker Compose ファイルをワークスペースに追加できます。Docker Compose ファイルを追加するかどうか尋ねられます。既存の Dockerfile を保持したい場合は、Dockerfile の上書きを求められた際に No(いいえ)を選択してください。
Container Tools 拡張機能は、docker-compose.yml ファイルをワークスペースに追加します。このファイルには、本番環境で想定通りにコンテナーを起動するための構成が含まれています。場合によっては、docker-compose.debug.yml も生成されます。このファイルは、デバッガーを有効にするための簡略化された起動モードを提供します。

VS Code の Container Tools 拡張機能はそのまま動作するファイルを生成しますが、独自のシナリオに合わせて最適化するためにカスタマイズすることもできます。その後、Containers: Compose Up コマンド(docker-compose.yml ファイルを右クリックするか、コマンド パレットでコマンドを見つけます)を使用して、すべてを一度に開始できます。VS Code のコマンド プロンプトまたはターミナル ウィンドウから docker-compose up コマンドを使用してコンテナーを開始することもできます。Docker Compose の動作を構成する方法や、使用可能なコマンドライン オプションの詳細については、Docker Compose のドキュメントを参照してください。
docker-compose ファイルを使用すると、.json 構成ファイルではなく、docker-compose ファイルでポート マッピングを指定できるようになります。例については、Docker Compose のドキュメントを参照してください。
ヒント: Docker Compose を使用する場合は、ホスト ポートを指定しないでください。代わりに、Docker にランダムな空きポートを自動的に選択させることで、ポートの競合問題を回避できます。
プロジェクトへの新しいコンテナーの追加
別のアプリやサービスを追加したい場合は、再度 Containers: Add Docker Compose Files to Workspace を実行し、既存の docker-compose ファイルの上書きを選択できますが、それらのファイルに加えたカスタマイズは失われます。compose ファイルへの変更を保持したい場合は、docker-compose.yml ファイルを手動で修正して新しいサービスを追加できます。通常は、既存のサービス セクションをコピーして貼り付け、新しいエントリを作成し、新しいサービスに合わせて名前を適切に変更します。
再度 Containers: Add Docker Files to Workspace コマンドを実行して、新しいアプリ用の Dockerfile を生成できます。各アプリやサービスは独自の Dockerfile を持ちますが、通常、ワークスペースごとに 1 つの docker-compose.yml ファイルと 1 つの docker-compose.debug.yml ファイルが存在します。
Python プロジェクトでは、Dockerfile、.dockerignore、docker-compose*.yml ファイルがすべてワークスペースのルート フォルダーに配置されます。別のアプリやサービスを追加する場合は、Dockerfile をそのアプリのフォルダーに移動します。
Node.js プロジェクトでは、Dockerfile と .dockerignore ファイルは、そのサービスの package.json と同じ場所に配置されます。
.NET の場合、Docker Compose ファイルを作成する際に、複数のプロジェクトを処理できるようにフォルダー構造がすでにセットアップされています。.dockerignore と docker-compose*.yml はワークスペースのルートに配置されます(たとえば、プロジェクトが src/project1 にある場合、ファイルは src にあります)。そのため、別のサービスを追加するときは、別のフォルダー(たとえば project2)に別のプロジェクトを作成し、前述のように docker-compose ファイルを再作成または修正します。
デバッグ
まず、対象プラットフォームのデバッグ ドキュメントを参照して、VS Code を使用したコンテナーでのデバッグの基本を理解してください。
Docker Compose でデバッグするには、前のセクションで説明した 2 つの Docker Compose ファイルのいずれかを使用して Containers: Compose Up コマンドを実行し、適切な Attach 起動構成を使用してアタッチします。通常の起動構成を使用して直接起動した場合は、Docker Compose は使用されません。
Attach の起動構成を作成します。これは launch.json 内のセクションです。このプロセスはほとんど手動ですが、場合によっては、Container Tools 拡張機能がテンプレートとして使用およびカスタマイズできる事前構成済みの起動構成を追加して、プロセスを支援することがあります。各プラットフォーム(Node.js, Python, .NET)のプロセスについては、以降のセクションで説明します。
Node.js
-
デバッグ タブで、構成 ドロップダウンを選択し、構成の追加... を選択して、
Containers: Attach構成テンプレートの Containers: Attach to Node を選択します。 -
docker-compose.debug.ymlでデバッグ ポートを構成します。これはファイル作成時に設定されるため、変更する必要がない場合があります。以下の例では、ホストとコンテナーの両方でのデバッグにポート 9229 が使用されます。version: '3.4' services: node-hello: image: node-hello build: . environment: NODE_ENV: development ports: - 3000 - 9229:9229 command: node --inspect=0.0.0.0:9229 ./bin/www -
複数のアプリがある場合は、各アプリが固有のポートを持つように、一部のアプリのポートを変更する必要があります。
launch.jsonで正しいデバッグ ポートを指定し、ファイルを保存できます。これを省略すると、ポートは自動的に選択されます。以下は、Node.js の起動構成(Attach)を示す例です。
"configurations": [ { "type": "node", "request": "attach", "name": "Containers: Attach to Node", "remoteRoot": "/usr/src/app", "port": 9229 // Optional; otherwise inferred from the docker-compose.debug.yml. }, // ... ] -
Attach 構成の編集が完了したら、
launch.jsonを保存し、アクティブな構成として新しい起動構成を選択します。デバッグ タブの 構成 ドロップダウンで、新しい構成を見つけます。
-
docker-compose.debug.ymlファイルを右クリックし、Compose Up を選択します。 -
HTML を返す HTTP エンドポイントを公開しているサービスにアタッチした場合、Web ブラウザーは自動的に開きません。ブラウザーでアプリを開くには、サイドバーでコンテナーを選択して右クリックし、Open in Browser(ブラウザーで開く)を選択します。複数のポートが構成されている場合は、ポートを選択するように求められます。
-
通常の方法でデバッガーを起動します。デバッグ タブから緑の矢印(開始 ボタン)を選択するか、F5 を使用します。
Python
Docker Compose を使用して Python をデバッグするには、次の手順を実行します。
-
デバッグ タブで、構成 ドロップダウンを選択し、構成の追加... を選択し、Python Debugger を選択して、
Remote Attach構成テンプレートを選択します。
-
デバッグに使用するホスト マシン(localhost など)とポートを選択するよう求められます。Python のデフォルトのデバッグ ポートは 5678 です。複数のアプリがある場合は、各アプリが固有のポートを持つように、いずれかのアプリのポートを変更する必要があります。
launch.jsonで正しいデバッグ ポートを指定し、ファイルを保存できます。これを省略すると、ポートは自動的に選択されます。"configurations": [ { "name": "Python Debugger: Remote Attach", "type": "debugpy", "request": "attach", "port": 5678, "host": "localhost", "pathMappings": [ { "localRoot": "${workspaceFolder}", "remoteRoot": "/app" } ] } -
Attach 構成の編集が完了したら、
launch.jsonを保存します。デバッグ タブに移動し、アクティブな構成として Python Debugger: Remote Attach を選択します。 -
すでに有効な Dockerfile がある場合は、Containers: Add Docker Compose Files to Workspace コマンドを実行することをお勧めします。これにより、ボリュームをマッピングしてコンテナー内の Python デバッガーを起動する
docker-compose.ymlファイルとdocker-compose.debug.ymlが作成されます。まだ Dockerfile がない場合は、Containers: Add Docker Files to Workspace を実行し、Docker Compose ファイルを含めるために Yes(はい)を選択することをお勧めします。注意: デフォルトでは、Containers: Add Docker Files to Workspace を使用する際、Django および Flask のオプションを選択すると、Gunicorn 用に構成された Dockerfile がスキャフォールディングされます。先に進む前に、適切に構成されていることを確認するために、コンテナー内の Python クイックスタートの手順に従ってください。
-
docker-compose.debug.ymlファイル(下の例を参照)を右クリックし、Compose Up を選択します。version: '3.4' services: pythonsamplevscodedjangotutorial: image: pythonsamplevscodedjangotutorial build: context: . dockerfile: ./Dockerfile command: ["sh", "-c", "pip install debugpy -t /tmp && python /tmp/debugpy --wait-for-client --listen 0.0.0.0:5678 manage.py runserver 0.0.0.0:8000 --nothreading --noreload"] ports: - 8000:8000 - 5678:5678 -
コンテナーがビルドされて実行されたら、Python Debugger: Remote Attach 起動構成が選択された状態で F5 を押してデバッガーをアタッチします。

注意: Python デバッガーを特定のファイルにインポートする方法についての詳細は、debugpy の README を参照してください。
-
HTTP エンドポイントを公開して HTML を返すサービスにアタッチした場合、Web ブラウザーは自動的に開かないことがあります。ブラウザーでアプリを開くには、コンテナー エクスプローラーでコンテナーを右クリックし、Open in Browser を選択します。複数のポートが構成されている場合は、ポートを選択するように求められます。

これで、コンテナーで実行中のアプリをデバッグできます。
.NET
-
デバッグ タブで、構成 ドロップダウンを選択し、構成の追加... を選択して、
Container Attach構成テンプレートの Containers: .NET Attach (Preview) を選択します。 -
VS Code は、デフォルト パスを使用してホスト マシンからターゲット コンテナーに
vsdbgをコピーしようとします。Attach 構成で、既存のvsdbgインスタンスへのパスを指定することもできます。"netCore": { "debuggerPath": "/remote_debugger/vsdbg" } -
Attach 構成の編集が完了したら、
launch.jsonを保存し、アクティブな構成として新しい起動構成を選択します。デバッグ タブの 構成 ドロップダウンで、新しい構成を見つけます。 -
docker-compose.debug.ymlファイルを右クリックし、Compose Up を選択します。 -
HTML を返す HTTP エンドポイントを公開しているサービスにアタッチした場合、Web ブラウザーは自動的に開きません。ブラウザーでアプリを開くには、サイドバーでコンテナーを選択して右クリックし、Open in Browser(ブラウザーで開く)を選択します。複数のポートが構成されている場合は、ポートを選択するように求められます。
-
通常の方法でデバッガーを起動します。デバッグ タブから緑の矢印(開始 ボタン)を選択するか、F5 を使用します。

-
コンテナーで実行されている .NET アプリにアタッチしようとすると、アプリのコンテナーを選択するように求めるプロンプトが表示されます。

この手順をスキップするには、launch.json の Attach 構成でコンテナー名を指定します。
"containerName": "Your ContainerName"次に、デバッガー(
vsdbg)をコンテナーにコピーするかどうか尋ねられます。Yes(はい)を選択します。
すべてが正しく構成されていれば、デバッガーが .NET アプリにアタッチされるはずです。

ボリュームのマウント
デフォルトでは、Container Tools 拡張機能はデバッグ コンポーネント用のボリューム マウントを行いません。必要なコンポーネントはランタイムに組み込まれているため、.NET や Node.js では必要ありません。アプリにボリューム マウントが必要な場合は、docker-compose*.yml ファイルの volumes タグを使用して指定します。
volumes:
- /host-folder-path:/container-folder-path
複数の Compose ファイルを使用した Docker Compose
ワークスペースには、開発、テスト、本番などのさまざまな環境を処理するために、複数の docker-compose ファイルを配置できます。構成の内容は、複数のファイルに分割できます。たとえば、すべての環境に共通の情報を定義するベースの compose ファイルと、環境固有の情報を定義する個別のオーバーライド ファイルです。これらのファイルが docker-compose コマンドへの入力として渡されると、これらのファイルが単一の構成に結合されます。デフォルトでは、Containers: Compose Up コマンドは単一のファイルを入力として compose コマンドに渡しますが、コマンドのカスタマイズを使用して、複数のファイルを渡すように compose up コマンドをカスタマイズできます。または、カスタム タスクを使用して、目的のパラメーターで docker-compose コマンドを呼び出すこともできます。
注意: ワークスペースに
docker-compose.ymlとdocker-compose.override.ymlがあり、他の compose ファイルがない場合、docker-composeコマンドは入力ファイルなしで呼び出され、これらのファイルを暗黙的に使用します。この場合、カスタマイズは不要です。
コマンドのカスタマイズ
コマンドのカスタマイズは、要件に基づいて compose up コマンドをカスタマイズするさまざまな方法を提供します。以下は、compose up コマンドのコマンド カスタマイズのサンプルです。
ベース ファイルとオーバーライド ファイル
ワークスペースにベースの compose ファイル(docker-compose.yml)と各環境用のオーバーライド ファイル(docker-compose.dev.yml、docker-compose.test.yml、docker-compose.prod.yml)があり、常にベース ファイルとオーバーライド ファイルを使用して docker compose up を実行すると仮定します。この場合、compose up コマンドは次の例のようにカスタマイズできます。compose up コマンドが呼び出されると、${configurationFile} は選択されたファイルに置き換えられます。
"docker.commands.composeUp": [
{
"label": "override",
"template": "docker-compose -f docker-compose.yml ${configurationFile} up -d --build",
}
]
テンプレートのマッチング
環境ごとに異なる入力ファイルのセットがあると仮定します。正規表現の一致を使用する複数のテンプレートを定義でき、選択されたファイル名がこの match プロパティと照合され、対応するテンプレートが使用されます。
"containers.commands.composeUp": [
{
"label": "dev-match",
"template": "docker-compose -f docker-compose.yml -f docker-compose.debug.yml -f docker-compose.dev.yml up -d --build",
"match": "dev"
},
{
"label": "test-match",
"template": "docker-compose -f docker-compose.yml -f docker-compose.debug.yml -f docker-compose.test.yml up -d --build",
"match": "test"
},
{
"label": "prod-match",
"template": "docker-compose -f docker-compose.yml -f docker-compose.release.yml -f docker-compose.prod.yml up -d --build",
"match": "prod"
}
]
コマンド呼び出し時にテンプレートを選択する
コマンド テンプレートから match プロパティを省略すると、compose up コマンドが呼び出されるたびに、どのテンプレートを使用するかを尋ねられます。たとえば、以下のようになります。
"containers.commands.composeUp": [
{
"label": "dev",
"template": "docker-compose -f docker-compose.yml -f docker-compose.common.dev.yml ${configurationFile} up -d --build"
},
{
"label": "test",
"template": "docker-compose -f docker-compose.yml -f docker-compose.common.test.yml ${configurationFile} up -d --build"
},
{
"label": "prod",
"template": "docker-compose -f docker-compose.yml -f docker-compose.common.prod.yml ${configurationFile} up -d --build"
},
],
カスタム タスク
コマンドのカスタマイズを使用する代わりに、次のようなタスクを定義して docker-compose コマンドを呼び出すこともできます。このオプションの詳細については、カスタム タスクを参照してください。
{
"type": "shell",
"label": "compose-up-dev",
"command": "docker-compose -f docker-compose.yml -f docker-compose.Common.yml -f docker-compose.dev.yml up -d --build",
"presentation": {
"reveal": "always",
"panel": "new"
}
}