🚀 在 VS Code 中

从容器中使用 Docker 或 Kubernetes

虽然你可以在开发容器内部构建、部署和调试你的应用程序,但你可能还需要通过在一组类似生产环境的容器中运行它来进行测试。幸运的是,通过安装所需的 Docker 或 Kubernetes CLI 并挂载本地 Docker 套接字,你可以从你的开发容器内部构建和部署你的应用程序容器镜像。

一旦所需的 CLI 就位,你还可以使用 Docker 扩展或 Kubernetes 扩展来处理相应的容器集群。

请参阅以下示例开发容器模板,以获取关于特定场景的更多信息。要将它们添加到你的项目中,在 VS Code 中打开你要使用的文件夹,并在命令面板 (F1) 中运行 Dev Containers: 添加开发容器配置 Files... 命令。

系统将提示你从我们的 第一方和社区索引 中选择一个预定义的容器配置,该列表会根据你的文件夹内容进行过滤和排序。从 VS Code UI 中,你可以选择下面章节中描述的模板之一。

在开发容器中运行 Docker 或 Minikube

  • Docker-in-Docker - 说明如何在容器内部完全运行 Docker(或 Moby)。提供对绑定挂载开发容器内所有文件夹的支持,但无法重用本地计算机的缓存。

  • Kubernetes - Docker 中的 Minikube - 说明如何在容器内部完全运行 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