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