你的开发环境
你可以选择在本地环境开发基于容器的服务,也可以选择在远程环境中开发。本地环境是你开发者工作站的作系统;使用本地环境意味着你使用安装在工作站上的 Docker 来构建和运行服务容器。Docker 支持于 Windows、macOS 及各种 Linux 发行版;关于系统和硬件需求,请参见 Docker 安装页面。
远程开发环境和你的开发工作站是不同的。它可以是通过SSH访问的远程机器、运行在开发工作站上的虚拟机,或开发容器。远程环境相较于本地环境有优势,主要优势在于可以在开发过程中以及服务在生产环境中运行时使用相同的作系统。要使用远程环境,你需要确保Docker命令(Docker CLI)在该环境中可用且功能正常。
第二个重要选择是将服务作为普通进程进行调试,还是将服务作为容器中运行。
选择开发环境的指南
-
当你不担心以下问题时,利用当地环境:
- 开发时使用同一个作系统,并且在服务容器内使用。
- 在本地环境中安装必要的工具和依赖。
-
如果你需要远程环境,可以考虑先使用开发容器。
- 在Windows上,使用Windows Subsystem for Linux(WSL)是个不错的选择。
-
在容器中运行的服务可以调试,但会带来额外的复杂性。默认使用普通调试,需要时在容器中调试。
容器工具扩展原生支持的容器调试。基于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 子系统
Linux 版 Windows 子系统是 Windows 上基于容器的服务开发的绝佳选择。强烈推荐使用Windows Subsystem for Linux 2(WSL 2)。Windows 版 Docker Desktop 已更新以支持 WSL 2,并提供了在 WSL 2 发行版中启用 Docker CLI 的图形设置:

要使用 WSL 2 进行 Docker 开发,您需要 Windows 10 版本 2004 或更新版本,以及 Docker Desktop 版本 Windows 2.2.0.5 或更新版本。
旧版本的WSL(WSL 1)无法提供便捷的方式连接主机上的Docker守护进程。
远程机器
推荐的远程机器实现容器开发的方法是对机器进行完整的 Docker 安装,包括 Docker 守护进程。
注意:Docker Desktop 产品仅支持实体 Windows 和 macOS 机器,不支持虚拟机。如果你想用虚拟机作为远程开发环境,我们建议使用带有 Docker Engine 的 Linux 虚拟机。
Docker 安装并能在远程机器上运行后,你可以使用 VS Code 的远程开发扩展包中的 Remote - SSH 扩展连接到你的远程机器并在那里工作。
-
打开 VS Code 命令面板(⇧⌘P(Windows,Linux Ctrl+Shift+P)),执行命令 Remote-SSH:添加新 SSH 主机......。按照提示设置与目标主机的连接。
-
运行命令 Remote-SSH:连接到主机......并连接到主机。
-
会打开一个新的 VS Code 窗口,运行在目标机器的上下文中。如果你使用密码认证,这里会提示密码。我们强烈建议你设置 SSH 密钥认证,以便使用。
-
在扩展视图中,安装容器工具扩展(在远程主机上)(此步骤后可能需要重新加载):

注意:如果你使用Container Tools扩展来构建容器镜像并使用源代码,上述方法很可能意味着你的源代码列表是在远程主机上,而不是在开发者工作站上。如果你只是用Container Tools扩展来实现容器资源管理器的功能,那你可以忽略它。
本地Linux虚拟机
要在开发者工作站上运行Linux虚拟机,你应该像安装远程机器一样在虚拟机上安装Docker,并使用VS Code Remote-SSH扩展连接到虚拟机。
或者,你也可以只在开发环境中安装 Docker CLI,然后通过 Docker 上下文机制将 CLI 指向运行在开发工作站上的 Docker 主机(引擎)。这种方法的主要关注点是确保虚拟机与主机上的 Docker 引擎之间的网络连接,并且要以安全的方式实现。一种选择是使用 SSH 隧道或远程隧道连接到开发者工作站。另一种选择是让 Docker 引擎监听 HTTPS 端口。你需要熟练掌握 SSH 和公钥基础设施(PKI),才能在虚拟机内运行 Docker CLI 的主机 Docker 引擎。对于大多数用户,我们建议在虚拟机内完整安装 Docker。
容器中的调试
容器工具扩展支持调试.NET和运行在容器内的Node.js服务。目前不支持其他编程语言。
容器中的调试可能比普通调试更难设置,因为容器比进程更强的隔离机制。具体来说:
- 运行在 VS Code 进程中的调试引擎需要与被调试的服务进程通信。对于运行在容器内的服务,这意味着通过公共网络(通常是 Docker 主机网络)进行网络通信。容器需要通过 Docker 主机网络暴露适当的端口,以便调试引擎连接到服务进程(Node.js),或在容器内运行的调试代理(.NET)。
- 构建过程中生成的源文件信息在构建环境(VS Code 运行时)中是有效的。容器文件系统与构建环境文件系统不同,需要重新映射源文件的路径,以便调试器在断点出现时显示正确的源文件。
基于上述担忧,通常建议使用常规调试,必要时在容器中进行调试。
关于如何在容器内设置调试的更多信息,请参见 ASP.NET 核心快速入门、Node.js快速入门和容器工具扩展任务属性 (docker-build以及docker-run任务)。
下一步
继续阅读以了解更多