您的开发环境
您可以选择是在本地环境还是在远程环境中开发基于容器的服务。本地环境是你的开发者工作站的操作系统;使用本地环境意味着您使用工作站上安装的 Docker 构建并运行服务容器。Docker 在 Windows、macOS 和各种 Linux 发行版上均受支持;系统和硬件要求请参考Docker安装页面。
远程开发环境与开发人员工作站不同。它可以是通过 SSH 访问的远程计算机、在开发人员工作站上运行的虚拟机或 Dev Containers 。远程环境比本地环境具有优势,主要是能够在开发期间以及服务在生产中运行时使用相同的操作系统。要使用远程环境,您需要确保docker
命令 (Docker CLI)在该环境中可用且正常运行。
第二个重要的选择是调试作为普通进程运行的服务,还是调试在容器中运行的服务。
选择开发环境的指南
-
当您不关心以下问题时使用本地环境:
- 使用相同的操作系统进行开发和在服务容器内。
- 在本地环境上安装必要的工具和依赖项。
-
如果您需要远程环境,请首先考虑使用 Dev Containers 。
- 在 Windows 上,使用Windows Subsystem for Linux (WSL)是一个不错的选择。
-
调试容器中运行的服务是可能的,但会带来额外的复杂性。默认使用普通调试,需要时在容器中调试。
Docker 扩展本身支持基于 .NET、Node.js 和 Python 的服务的容器调试。
在远程开发环境中启用 Docker CLI
在远程开发环境中启用 Docker CLI 的方法因您选择的远程环境类型而异。
Dev Containers
对于 Dev Containers ,您应该将容器内的 Docker CLI 重定向到本地计算机上运行的 Docker 守护程序。
首先,确保 Docker CLI 已安装到您的 Dev Containers 中。确切的步骤取决于容器使用的 Linux 发行版。
以下是基于 Ubuntu 的发行版的示例(来自.devcontainer/Dockerfile
):
...
&& apt-get -y install software-properties-common \
&& curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add - 2>/dev/null \
&& add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable" \
&& apt-get update -y \
&& apt-get install -y docker-ce-cli \
&& apt-get install -y python python-pip \
&& pip install docker-compose \
...
接下来,确保 Docker 套接字映射到 Dev Containers (在 中.devcontainer/devcontainer.json
):
...
"runArgs": [ "-v", "/var/run/docker.sock:/var/run/docker.sock"]
...
Linux 的 Windows 子系统
适用于 Linux 的 Windows 子系统是 Windows 上基于容器的服务开发的绝佳选择。强烈建议使用适用于 Linux 的 Windows 子系统版本 2 (WSL 2) 。适用于 Windows 的 Docker Desktop 已更新为可与 WSL 2 配合使用,并具有图形设置以在 WSL 2 发行版中启用 Docker CLI:
要使用 WSL 2 进行 Docker 开发,您需要 Windows 10 版本 2004 或更高版本,以及 Docker Desktop for Windows 版本 2.2.0.5 或更高版本。
旧版本的 WSL (WSL 1) 没有提供连接到主机上的 Docker 守护进程的简单方法。
远程机
使用远程计算机启用容器开发的推荐方法是在计算机上进行完整的 Docker 安装,包括 Docker 守护程序。
注意:Docker Desktop 产品仅在物理 Windows 和 macOS 计算机上受支持,在虚拟机上不受支持。如果您想使用虚拟机作为远程开发环境,我们建议使用带有Docker Engine的 Linux VM 。
Docker 安装并在远程计算机上运行后,您可以使用远程开发扩展包中的 VS Code 的远程 - SSH扩展来连接到远程计算机并在那里工作。
-
打开 VS Code 命令面板(⇧⌘P(Windows、Linux Ctrl+Shift+P))并运行命令Remote-SSH:添加新的 SSH 主机...。按照提示建立与目标主机的连接。
-
运行命令Remote-SSH: Connect to host...并连接到主机。
-
将打开一个新的 VS Code 窗口,在目标计算机的上下文中运行。如果您使用密码身份验证,此处将提示输入密码。我们强烈建议您设置SSH 密钥身份验证,以便于使用。
-
在“扩展”视图中,安装 Docker 扩展(在远程主机上)(此步骤后可能需要重新加载):
注意:如果您使用 Docker 扩展来构建 Docker 映像并拥有源代码,则上述方法可能意味着您在远程主机上而不是在开发人员工作站上拥有源代码。如果您只是使用 Docker 扩展来实现 Docker Explorer 功能,那么您可以忽略这一点。
本地Linux虚拟机
要使用在开发人员工作站上运行的 Linux 虚拟机,您应该以与在远程计算机上安装 Docker 相同的方式在 VM 上安装 Docker ,并使用VS Code Remote-SSH扩展连接到 VM。
或者,您可以在开发环境中仅安装 Docker CLI,并使用Docker 上下文机制将 CLI 指向在开发人员工作站上运行的 Docker 主机(引擎)。这种方法的主要问题是确保从虚拟机到主机上的 Docker 引擎的网络连接,并以安全的方式进行。一种选择是使用SSH 隧道或远程隧道连接到开发人员工作站。另一种选择是让 Docker 引擎侦听 HTTPS 端口。您需要精通 SSH 和公钥基础设施 (PKI),才能从虚拟机内运行的 Docker CLI 使用主机 Docker 引擎。对于大多数用户,我们建议在虚拟机内完整安装 Docker。
在容器中调试
Docker 扩展支持调试容器内运行的基于 .NET 和 Node.js 的服务。目前不支持其他编程语言。
在容器中进行调试可能比常规调试更难设置,因为容器是比进程更强的隔离机制。尤其:
- VS Code 进程内运行的调试引擎需要与正在调试的服务进程进行通信。对于在容器内运行的服务,这意味着通过公共网络(通常是 Docker 主机网络)进行网络通信。容器需要通过 Docker 主机网络公开适当的端口,以便调试引擎连接到服务进程 (Node.js) 或在容器内运行的调试器代理 (.NET)。
- 构建期间生成的源文件信息在构建环境(运行 VS Code 的位置)上下文中有效。容器文件系统与构建环境文件系统不同,需要重新映射源文件的路径,以便调试器在命中断点时显示正确的源文件。
出于上述考虑,一般建议使用常规调试,必要时在容器中进行调试。
有关如何在容器内设置调试的更多信息,请参阅ASP.NET Core 快速入门、Node.js 快速入门和Docker 扩展任务属性(docker-build
和docker-run
任务)。
下一步
继续阅读以了解更多信息