从容器中使用 Docker 或 Kubernetes

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

一旦所需的CLI准备就绪,您还可以使用Docker扩展或Kubernetes扩展来操作适当的容器集群。

查看以下示例开发容器模板以获取有关特定场景的更多信息。要将它们添加到您的项目中,打开文件夹您想在VS Code中使用的文件夹,并在命令面板中运行Dev Containers: Add Dev Container Configuration Files...命令(F1)。

您将被提示从我们的第一方和社区索引中选择一个预定义的容器配置,该列表根据您文件夹的内容进行排序。从VS Code界面中,您可以选择下面部分中描述的模板之一。

在开发容器中运行 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 Compose而不是单个Dockerfile的情况下,Docker outside of Docker的变体。

  • Kubernetes - 本地配置 - 将Docker从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