從容器中使用 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 - 演示如何完全在容器內部執行 Minikube,其優點和限制與 Docker-in-Docker 類似。
從容器訪問現有的 Docker 或 Minikube 例項
-
Docker outside of Docker - 演示如何使用開發容器中的 Docker (或 Moby) CLI 透過繫結掛載 Docker Unix 套接字來連線到主機的 Docker 守護程式。開銷較低,可以重用計算機的快取,但有繫結掛載限制。
-
Docker outside of Docker Compose - Docker outside of Docker 的變體,適用於您使用 Docker Compose 而不是單個 Dockerfile 的情況。
-
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,它將 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