您的开发环境
您可以选择是在 **本地环境** 还是 **远程环境** 中开发基于容器的服务。本地环境是您开发人员工作站的操作系统;使用本地环境意味着您使用工作站上安装的 Docker 构建和运行您的服务容器。Docker 支持 Windows、macOS 和各种 Linux 发行版;有关系统和硬件要求,请参阅 Docker 安装页面。
远程开发环境 与您的开发人员工作站不同。它可以是通过 SSH 访问的远程机器,您的开发人员工作站上运行的虚拟机,或者是一个开发容器。远程环境与本地环境相比可能具有优势,主要优势是能够在开发期间和服务在生产环境中运行时使用相同的操作系统。要使用远程环境,您需要确保 docker
命令(Docker CLI) 在该环境中可用且正常工作。
第二个重要的选择是,是否调试作为普通进程运行的服务,还是调试在容器中运行的服务。
选择开发环境的指南
-
当您不关心以下情况时,请使用本地环境
- 在开发期间和在服务容器内部使用相同的操作系统。
- 在您的本地环境之上安装必要的工具和依赖项。
-
如果您需要远程环境,请首先考虑使用 开发容器。
- 在 Windows 上,使用 Windows 子系统 for Linux (WSL) 是一个不错的选择。
-
调试在容器中运行的服务是可能的,但会带来额外的复杂性。默认情况下使用普通调试,只有在需要时才在容器中调试。
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"]
...
Windows 子系统 for Linux
Windows 子系统 for Linux 是在 Windows 上进行基于容器的服务开发的绝佳选择。强烈建议使用 Windows 子系统 for Linux 版本 2 (WSL 2)。Docker Desktop for Windows 已更新以支持 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 虚拟机。
在 Docker 安装并能在远程机器上正常工作后,您可以使用 VS Code 的 远程 - SSH 扩展(来自 远程开发 扩展包)连接到您的远程机器并在那里工作。
-
打开 VS Code 命令面板(⇧⌘P(Windows、Linux Ctrl+Shift+P))并运行命令 **远程 - SSH:添加新的 SSH 主机...**。按照提示设置与目标主机的连接。
-
运行命令 **远程 - SSH:连接到主机...** 并连接到主机。
-
将打开一个新的 VS Code 窗口,在目标机器的上下文中运行。如果您使用的是密码身份验证,则在此处将提示您输入密码。我们强烈建议您设置 SSH 密钥身份验证,以方便使用。
-
在扩展视图中,安装 Docker 扩展(在远程主机上)(执行此步骤后可能需要重新加载)
**注意**:如果您使用 Docker 扩展来构建 Docker 镜像并有源代码,那么上述方法可能意味着您的源代码签出在远程主机上,而不是在您的开发人员工作站上。如果您只是使用 Docker 扩展来使用 Docker 资源管理器功能,那么您可以忽略此问题。
本地 Linux 虚拟机
要使用在您的开发人员工作站上运行的 Linux 虚拟机,您应该在虚拟机上 安装 Docker,方法与在远程机器上安装相同,然后使用 VS Code 远程 - 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
任务)。
后续步骤
继续阅读以了解更多关于