コンテナーからDockerまたはKubernetesを使用する
開発コンテナー内でアプリケーションをビルド、デプロイ、デバッグできますが、本番環境のようなコンテナーセット内で実行してテストする必要がある場合もあります。幸いなことに、必要なDockerまたはKubernetes CLIをインストールし、ローカルのDockerソケットをマウントすることで、開発コンテナー内からアプリのコンテナーイメージをビルドおよびデプロイできます。
必要なCLIが揃ったら、Docker拡張機能またはKubernetes拡張機能を使用して、適切なコンテナークラスターを操作することもできます。
特定のシナリオに関する追加情報については、次のDev Containerテンプレートの例を参照してください。プロジェクトに追加するには、VS Codeで作業したいフォルダーを開き、コマンドパレット(F1)でDev Containers: Dev Container構成ファイルを追加...コマンドを実行します。
フォルダーの内容に基づいてソートされたフィルター可能なリストで、ファーストパーティおよびコミュニティインデックスから事前定義されたコンテナー構成を選択するように求められます。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 Unixソケットをバインドマウントすることにより、開発コンテナーでDocker(またはMoby)CLIを使用してホストの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