コンテナーから Docker または Kubernetes を使用する
開発コンテナー内でアプリケーションをビルド、デプロイ、デバッグできるだけでなく、本番環境に近いコンテナー内で実行してテストする必要がある場合もあります。幸いなことに、必要な Docker または Kubernetes CLI をインストールし、ローカル Docker ソケットをマウントすることで、開発コンテナー内からアプリケーションのコンテナー イメージをビルドしてデプロイできます。
必要な CLI が配置されたら、コンテナー ツール拡張機能またはKubernetes拡張機能を使用して、適切なコンテナー クラスターを操作することもできます。
特定のシナリオに関する追加情報については、以下の開発コンテナー テンプレートの例を参照してください。これらをプロジェクトに追加するには、VS Code で作業するフォルダーを開き、コマンド パレット (F1) で開発コンテナー: 開発コンテナー構成ファイルを追加... コマンドを実行します。
フォルダーの内容に基づいてソートされた、フィルタリング可能なリストから、当社のファーストパーティおよびコミュニティ インデックスから定義済みのコンテナー構成を選択するように求められます。VS Code UI から、以下のセクションで説明されているテンプレートのいずれかを選択できます。
開発コンテナーで Docker または Minikube を実行する
-
Docker-in-Docker - コンテナー内で Docker (または Moby) を完全に実行する方法を示します。開発コンテナー内のすべてのフォルダーをバインドマウントするサポートを提供しますが、ローカル マシンのキャッシュを再利用することはできません。
-
Kubernetes - Minikube-in-Docker - Docker-in-Docker と同様の利点と制限で、コンテナー内で Minikube を完全に実行する方法を示します。
コンテナーから既存の Docker または Minikube インスタンスにアクセスする
-
Docker outside of Docker - 開発コンテナー内の Docker (または Moby) CLI を使用して、Docker Unix ソケットをバインドマウントすることでホストの Docker デーモンに接続する方法を示します。オーバーヘッドが低く、マシンのキャッシュを再利用できますが、バインドマウントの制限があります。
-
Docker outside of Docker Compose - 単一の Dockerfile ではなく Docker Compose を使用している状況での Docker outside of Docker のバリエーション。
-
Kubernetes - ローカル構成 - Docker outside of Docker モデルを採用し、kubectl と Helm を追加して、ローカルの Minikube または Docker が提供する Kubernetes クラスターにアクセスする方法を示します。
また、上記のサンプルで参照されている、再利用可能なDocker-in-Docker、Docker outside of Docker、およびKubernetes のインストール スクリプトに関するドキュメントもあります。
コンテナー内から Docker でホスト ボリュームをマウントする
Docker-in-Docker モデルに従う場合、開発コンテナー内から Docker CLI を使用すると、同じ場所で実行されている Docker デーモンと対話します。これは、開発コンテナー内の任意のものを、作成する「内部」コンテナーに「バインド」マウントできることを意味します。
たとえば、これは「ただ動作する」でしょう。
docker run -v /workspace/examplefile.txt:/incontainer/path debian
ただし、ホストフォルダーをこの内部コンテナーにバインドマウントしたい場合は、最初に開発コンテナーにマウントする必要があります。
Docker outside of Dockerでは、デフォルトで機能するバインドマウントのタイプが逆になります。ここでは、コンテナー内のDocker CLIがホストのDockerデーモンと対話します。これにより、コンテナー内からディレクトリをマウントする際に、コンテナー内のパスがホスト上のディレクトリのパスと一致しない可能性があるため影響を受けます。
上記の同じ例は、コンテナー外のホスト上のパスが/workspace/...
ではないため失敗します。さらに、一部のフォルダーはコンテナー内にのみ存在するため、マウントできません。これを行う必要がある場合は、Docker-in-Docker モデルの方がニーズに合っているかもしれません。
コンテナーでフォルダーを開いている場合は、ホスト ディレクトリを環境変数としてコンテナーに渡し、ワークスペース フォルダーをマウントできます。(ただし、ボリュームを使用した場合、これは機能しません。その場合は Docker-in-Docker が最適です。) これを行うには、devcontainer.json
に以下を追加します。
"remoteEnv": {
// Pass in the host directory for Docker mount commands from inside the container
"HOST_PROJECT_PATH": "${localWorkspaceFolder}"
}
以下の例はmakefile
からのもので、開発コンテナーから新しい Docker コンテナーにKUBECONFIG
ファイルをマウントしています。
docker run -p 8089:8089 -p 9090:9090 -v $(shell echo ${KUBECONFIG} | sed s#/workspace#${HOST_PROJECT_PATH}#):/kubeconfig.json -e KUBECONFIG=/kubeconfig.json ${IMG} -f behaviours/run_submit_locust.py