參加你附近的 ,瞭解 VS Code 中的 AI 輔助開發。

從容器中使用 Docker 或 Kubernetes

雖然你可以在開發容器中構建、部署和除錯你的應用程式,但你可能還需要透過在類似生產環境的容器集中執行它來測試它。幸運的是,透過安裝所需的 Docker 或 Kubernetes CLI 並掛載你的本地 Docker 套接字,你可以在你的開發容器中構建和部署你的應用程式的容器映象。

一旦安裝了所需的 CLI,你還可以使用 Container Tools 擴充套件或 Kubernetes 擴充套件來處理相應的容器叢集。

有關特定場景的更多資訊,請參閱以下開發容器模板示例。要將它們新增到你的專案中,請在 VS Code 中開啟你想要使用的資料夾,然後在命令面板 (F1) 中執行 Dev Containers: Add Dev Container Configuration Files... 命令。

系統將提示你從我們第一方和社群索引中選擇一個預定義的容器配置,該列表可篩選並根據你的資料夾內容進行排序。從 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-DockerDocker outside of DockerKubernetes 安裝指令碼的文件,你可以重複使用這些指令碼,並且上面示例中也引用了它們。

從容器內部使用 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