🚀 在 VS Code 中

從容器使用 Docker 或 Kubernetes

雖然您可以在開發容器內建置、部署和偵錯您的應用程式,但您可能也需要透過在一組類似生產環境的容器中執行應用程式來測試它。 幸運的是,透過安裝所需的 Docker 或 Kubernetes CLI 並掛載您的本機 Docker Socket,您可以從您的開發容器內部建置和部署您應用程式的容器映像。

一旦所需的 CLI 準備就緒,您也可以使用 Docker 擴充功能或 Kubernetes 擴充功能來操作適當的容器叢集。

請參閱以下範例開發容器範本,以取得關於特定情境的額外資訊。 若要將它們新增至您的專案,請在 VS Code 中開啟您想要使用的資料夾,並在命令選 palette (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 Socket 來連線到您主機的 Docker Daemon。 具有較低的額外負荷,並且可以重複使用您機器的快取,但具有繫結掛載限制

  • 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 Daemon 互動。 這表示您可以將開發容器內部的任何內容「繫結」掛載到您建立的「內部」容器中。

例如,這將「直接運作」

docker run -v /workspace/examplefile.txt:/incontainer/path debian

但是,如果您想要將可用的主機資料夾繫結掛載到此內部容器中,您需要先將其掛載到您的開發容器中。

使用 Docker outside of Docker 時,預設運作的繫結掛載類型會反轉。 在這裡,容器內部的 Docker CLI 會改為與主機的 Docker Daemon 互動。 這會影響從容器內部掛載目錄,因為容器內的路徑可能與主機上目錄的路徑不符。

上面的相同範例將會失敗,因為主機上容器外部的路徑不是 /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