您的开发环境
您可以选择在本地环境或远程环境中开发基于容器的服务。本地环境是您开发工作站的操作系统;使用本地环境意味着您使用工作站上安装的Docker构建和运行服务容器。Docker支持Windows、macOS和各种Linux发行版;有关系统和硬件要求,请参阅Docker安装页面。
远程开发环境与您的开发工作站不同。它可以是可以通过SSH访问的远程机器、运行在您的开发工作站上的虚拟机,或者是一个开发容器。远程环境相比本地环境有一些优势,主要的一个优势是能够在开发期间使用与生产环境中运行服务时相同的操作系统。要使用远程环境,您需要确保docker
命令(Docker CLI)在该环境中可用且功能正常。
第二个重要的选择是是否将您的服务作为普通进程运行进行调试,还是在容器中运行您的服务进行调试。
选择开发环境的指南
-
当您不关心以下情况时,请使用本地环境:
- Using the same OS for development and inside the service container.
- Installing necessary tools and dependencies on top of your local environment.
-
如果需要远程环境,请首先考虑使用开发容器。
- On Windows, using Windows Subsystem for Linux (WSL) is good option.
-
调试在容器中运行的服务是可能的,但会带来额外的复杂性。默认情况下使用正常调试,并在需要时在容器中进行调试。
Docker 扩展原生支持基于 .NET、Node.js 和 Python 的服务的容器调试。
在远程开发环境中启用Docker CLI
在远程开发环境中启用Docker CLI的方式取决于您选择的远程环境类型。
开发容器
对于开发容器,您应该将容器内的Docker CLI重定向到本地机器上运行的Docker守护进程。
首先,确保Docker CLI已安装到您的开发容器中。具体步骤取决于容器使用的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套接字映射到开发容器中(在.devcontainer/devcontainer.json
中):
...
"runArgs": [ "-v", "/var/run/docker.sock:/var/run/docker.sock"]
...
适用于Linux的Windows子系统
Windows Subsystem for Linux 是在 Windows 上进行基于容器的服务开发的绝佳选择。强烈推荐使用 Windows Subsystem for Linux 版本 2 (WSL 2)。Docker Desktop for Windows 已更新为与 WSL 2 兼容,并提供了一个图形设置,以在 WSL 2 发行版中启用 Docker CLI:
要使用WSL 2进行Docker开发,您需要Windows 10版本2004或更新版本,以及Windows版Docker Desktop版本2.2.0.5或更新版本。
旧版本的WSL(WSL 1)没有提供一种简单的方法来连接到主机上的Docker守护进程。
远程机器
推荐的启用远程机器容器开发的方法是在机器上完整安装Docker,包括Docker守护进程。
注意: Docker Desktop 产品仅支持在物理 Windows 和 macOS 机器上运行,不支持虚拟机。如果您想使用虚拟机作为远程开发环境,我们建议使用带有 Docker Engine 的 Linux 虚拟机。
在远程机器上安装并运行Docker后,您可以使用VS Code的Remote - SSH扩展,该扩展来自Remote Development扩展包,以连接到您的远程机器并在那里工作。
-
打开 VS Code 命令面板 (⇧⌘P (Windows, Linux Ctrl+Shift+P)) 并运行命令 Remote-SSH: Add new SSH host...。按照提示设置与目标主机的连接。
-
运行命令 Remote-SSH: Connect to host... 并连接到主机。
-
一个新的VS Code窗口打开,运行在目标机器的上下文中。如果您使用的是密码认证,这里会提示输入密码。我们强烈建议您设置SSH密钥认证,以便于使用。
-
在扩展视图中,安装Docker扩展(在远程主机上)(此步骤后可能需要重新加载):
注意: 如果您使用Docker扩展来构建Docker镜像并且有源代码,上述方法可能意味着您的源代码在远程主机上,而不是在您的开发工作站上。如果您只是使用Docker扩展的Docker Explorer功能,那么您可以忽略这一点。
本地Linux虚拟机
要在您的开发工作站上使用运行Linux的虚拟机,您应该以与在远程机器上安装相同的方式在虚拟机上安装Docker,并使用VS Code Remote-SSH扩展连接到虚拟机。
或者,您可以在开发环境中仅安装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
任务)。
下一步
继续阅读以了解更多信息