从容器使用 Docker 或 Kubernetes
尽管您可以在开发容器内部构建、部署和调试应用程序,但您可能还需要通过在类似生产环境的容器组中运行它来测试它。幸运的是,通过安装所需的 Docker 或 Kubernetes CLI 并挂载本地 Docker 套接字,您可以从开发容器内部构建和部署应用程序的容器镜像。
安装所需的 CLI 后,您还可以使用 Docker 扩展或 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 - Local Configuration - 采用 Docker outside of Docker 模型,并添加 kubectl 和 Helm 来演示如何访问本地 Minikube 或 Docker 提供的 Kubernetes 集群。
此外,还有关于 Docker-in-Docker、Docker outside of Docker 和 Kubernetes 安装脚本的文档,您可以重用这些脚本,并且上述示例中引用了这些脚本。
从容器内部使用 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