本站点文档内容均翻译自code.visualstudio.com,仅供个人学习,如有差异请以官网为准。

使用容器中的Docker或Kubernetes

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

一旦所需的CLIs就位,您还可以使用容器工具扩展或Kubernetes扩展,通过适当的容器集群工作。

查看以下特定场景的开发容器模板以获取更多信息。要将它们添加到您的项目中,打开您希望在 VS Code 中使用的文件夹,然后在命令面板中运行开发容器:添加开发容器配置文件...命令(F1)。

您将被提示从我们的第一方和社区索引中选择一个预定义的容器配置,该配置是基于您的文件夹内容过滤和排序的。通过 VS Code 用户界面,您可以从下面各节中描述的模板中选择一个。

在开发容器中运行Docker或Minikube

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

  • Kubernetes - Minikube-in-Docker - 说明如何在容器中完全运行Minikube,类似于Docker-in-Docker的相同优势和局限性。

从容器访问现有的Docker或Minikube实例

  • Docker 之外的 Docker - 说明了如何通过挂载 Docker Unix 套接字在你的 dev container 中使用 Docker (或 Moby) CLI 来连接到你的主机的 Docker 守护进程。较低的开销并且可以重用机器的缓存,但有 挂载限制

  • Docker 之外的 Docker - 在使用 Docker Compose 而不是单个 Dockerfile 的情况下,Docker 之外的变体。

  • Kubernetes - 本地配置 - 采用Docker outside of Docker模型,并添加kubectl和Helm,以说明如何访问本地Minikube或Docker提供的Kubernetes集群。

还有关于Docker-in-DockerDocker outside of DockerKubernetes安装脚本的文档,您可以重复使用这些文档,并且在上面的示例中有所引用。

从容器内部挂载主机卷与Docker

当使用Docker-in-Docker 模式时,从开发容器内部使用Docker CLI将会使其与同一位置运行的Docker守护进程进行交互。这意味着您可以将开发容器内的任何内容“挂载”到您创建的“内部”容器中。

例如,这将“ Just Work”:

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

然而,如果你希望将一个主机文件夹挂载到这个内部容器中,你需要先将其挂载到你的开发容器中。

Docker 之外使用 Docker时,默认情况下能够正常工作的绑定挂载类型发生了反转。在此,容器内的 Docker CLI 与主机的 Docker 驱动程序进行交互。这会影响从容器内部挂载目录,因为容器内的路径可能与主机上目录的路径不匹配。

上面的相同示例将失败,因为主机(容器外部)上的路径不是/工作区/...此外,一些文件夹因为它们只存在于容器中,所以无法挂载。如果你需要这样做,你可能会发现Docker-in-Docker模型更能满足你的需求。

如果你在一个容器中打开一个文件夹,你可以将主机目录作为环境变量传递到容器中,以允许你挂载工作区文件夹。(然而,如果你使用了卷 - 在那里Docker-in-Docker是最佳选择。)要这样做,请在以下位置添加以下内容:devcontainer.json输入:

  "远程环境": {
    // 传递主机目录用于Docker挂载命令从容器内
    "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