从容器中使用 Docker 或 Kubernetes
虽然您可以在开发容器中构建、部署和调试应用程序,但有时您可能还需要通过在一组类生产环境的容器中运行它来进行测试。幸运的是,通过安装所需的 Docker 或 Kubernetes CLI 并挂载您的本地 Docker 套接字,您可以直接在开发容器内构建和部署应用程序的容器镜像。
一旦所需的 CLI 就绪,您还可以使用 Container Tools 扩展或 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 Unix 套接字,在开发容器中使用 Docker (或 Moby) CLI 连接到宿主机的 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-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