使用 Visual Studio 2015 在本地 Docker 容器中调试 Dotnet 应用程序。






4.89/5 (9投票s)
设置 VS 2015 以调试在本地 Docker 容器上运行的应用程序的关键问题。
引言
我从事 MS 平台多年,终于看到了在 .NET Core 中构建跨平台应用程序的巨大潜力。随着各种技术的成熟,现在也是进行云原生应用程序基于微服务开发的绝佳时机。因此,我决定尝试设置 Visual Studio,以便开发人员可以通过 Visual Studio 在基于 Docker 的容器中调试他们的 .NET 应用程序。网上有很多信息(您可以在下面的参考文献中找到一些链接),但遇到的一些问题需要我采取一些非传统的方法/步骤。
背景
在此过程中,我遇到了各种问题,本文汇总了在此过程中学到的知识,并概述了成功运行此设置的关键步骤,特别是在 Windows 8 上。我还没有在 Windows 10 上尝试过,但我认为其中一些经验可能也适用于 Win 10。最大的问题是,从 Windows 8 开始,Docker 需要 Virtual Box 运行 Linux VM,Docker 守护进程并在 VM 内运行容器。
问题
我发现的主要问题如下:
- Docker 通信问题 “尝试连接时发生错误:Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.24/containers/json: open //./pipe/docker_engine: 系统找不到指定的文件。” [参见步骤 III]
- 主机和容器之间的卷共享 [参见步骤 V]
- 在 Linux 上用于调试的 Clrdbg “/clrdbg/clrdbg 未找到” [参见步骤 VI]
- 浏览器中 Localhost URL 不起作用 “该网站无法访问” [参见步骤 VII]
术语
- VM – 虚拟机
- Host – 主机操作系统 (Windows 8)
- Guest – 客户机操作系统 VM
- 默认 VM – Docker Toolbox 安装的默认 Linux VM
先决条件
- Windows 8
- Docker Toolbox(因为最新的 Windows 版 Docker 不支持 Windows 8)
- Visual Studio 2015 update 3
- Visual Studio Tools for Docker – 预览版
- Git bash(可选,但我倾向于在 Windows 上将其用作我的 shell)
设置过程 - 使用代码
- Docker 安装
- 安装正确版本的 Docker Toolbox https://docs.dockerd.com.cn/toolbox/overview/。这将安装 Oracle VM Virtual Box、docker 客户端和 Kitematic。
- 通过运行“
hello world
”镜像容器来测试 Docker 设置
- Visual Studio 安装
- Visual Studio 2015 update 3
- 确保已安装 Visual Studio Tools for Docker。或者,从 此链接 安装。
- [问题 1] Docker 通信失败
- 注意到的一大问题是 Visual Studio 与 Docker 守护进程之间的通信失败。您将在输出窗口中看到的错误是“尝试连接时发生错误:Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.24/containers/json: open //./pipe/docker_engine: 系统找不到指定的文件。”
这可能是由两个原因引起的:- Docker 未运行 – 这很容易解决,打开 Kitematic 并单击“Docker CLI”[右下角]。然后运行“
docker ps –a
”,这将列出所有正在运行的 Docker 容器实例,如果它能列出,则没有问题。 - Visual Studio 无法连接到 Docker。这主要发生在 Docker 运行在 Oracle Virtual Box 设置的 Linux VM 中时。
- 初始化 Docker 环境
eval "$(docker-machine env default)"
– 如果使用 GIT bash 或等效工具docker-machine env default
– 如果使用命令提示符
- 然后从同一个命令提示符/bash 窗口,打开 Visual Studio 2015。这可以通过运行命令“C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\devenv.exe”来完成。这确保 Visual Studio 在正确的 Docker 环境上下文中运行,并且在调试 Web 应用程序时不会出现通信错误。
- 初始化 Docker 环境
- Docker 未运行 – 这很容易解决,打开 Kitematic 并单击“Docker CLI”[右下角]。然后运行“
- 注意到的一大问题是 Visual Studio 与 Docker 守护进程之间的通信失败。您将在输出窗口中看到的错误是“尝试连接时发生错误:Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.24/containers/json: open //./pipe/docker_engine: 系统找不到指定的文件。”
- 创建示例 MVC 应用程序
- 在 Visual Studio 中,转到 **文件** > **新建** > **项目** > **Web** > **ASP.NET Core Web 应用程序** (.NET 4.5)。请选择C:\Users\<用户名>下的位置。我将其创建在Workspace文件夹下。我将在步骤 V 中解释这一点,您可以选择其他文件夹,但该文件夹需要与 docker toolbox 创建的 Linux VM 共享,我无法实现这一点。
- 接下来,选择“Web 应用程序”选项,然后单击 **OK**
-
您可以编辑 Home Controller 并进行一些小的更改(如下所示)
public class HomeController : Controller { public IActionResult Index() { return View(); } public IActionResult About() { ViewData["Message"] = "Your application description page. This site is running on docker."; return View(); } public IActionResult Contact() { ViewData["Message"] = "Your contact page, hosted on docker."; return View(); } public IActionResult Error() { return View(); } }
- 接下来转到 **项目** > **添加 Docker 支持**
-
这将创建一个 Dockerfile 和 3 个 docker-compose 文件。有关每个文件的详细信息:https://docs.microsoft.com/en-us/dotnet/articles/core/docker/visual-studio-tools-for-docker。
-
此时,理想情况下,您应该能够构建和部署,并且应用程序将在新的容器中运行。但是,我注意到了一些问题,这需要进行一些更改,这些更改将在下面的步骤中介绍。我看到的所有问题都与docker-compose.dev.debug.yml中的以下行有关。下面的步骤 IV 和 V 涵盖了与卷相关的两个关键问题。
volumes: 1. .:/app 2. ~/.nuget/packages:/root/.nuget/packages:ro 3. ~/clrdbg:/clrdbg:ro 1 – maps the application binaries and configuration files to /app within the container 2 – maps all nuget packages under the home directory 3 – maps the clrdbg which is crucial for debugging the project on the docker container that is based on linux.
- 在 Visual Studio 中,转到 **文件** > **新建** > **项目** > **Web** > **ASP.NET Core Web 应用程序** (.NET 4.5)。请选择C:\Users\<用户名>下的位置。我将其创建在Workspace文件夹下。我将在步骤 V 中解释这一点,您可以选择其他文件夹,但该文件夹需要与 docker toolbox 创建的 Linux VM 共享,我无法实现这一点。
- [问题 2] 跨容器映射卷
从 docker compose 文件中可以看到,它依赖于 3 个卷。为了访问这些文件夹,它们必须映射到 Oracle Virtual Box 的共享文件夹下(下面的截图)。
我尝试添加其他文件夹,但不知何故,对我来说不起作用。因此,我将所有卷保留在“C:/Users”下,因为那是在默认情况下映射的并且对我来说是有效的。如果您也这样做,请忽略此步骤的其余部分,然后继续下一步。
如果您想尝试一下或遇到问题,可以尝试以下步骤来共享和映射其他卷:
- 打开 Oracle VM Virtual Box,在 Virtual box UI 中共享文件夹(上面的截图)。确保选中了 permanent 和 auto-mount。停止默认 VM(假设 Kitematic 设置为在退出时停止 VM,您可以关闭 Kitematic 来做到这一点)。
- 假设 VBox 中的共享名称是c/dev,其中包含我们的 Visual Studio 项目
- Docker 启动并运行后,运行命令:
docker-machine.exe ssh default 'sudo mkdir --parents //c/dev'
docker-machine.exe ssh default 'sudo mount -t vboxsf c/dev //c/dev/
- 确保docker-compose.dev.debug.yml中的路径与此匹配。在这种情况下,卷中的源路径应从C:/dev开始。
- 然后运行 docker 容器(在这种情况下,尝试从 Visual Studio 进行调试,因为它也会创建容器,假设下面的步骤 VI 也已完成)。
- [问题 3 & 4] 为 Linux 安装 clrdbg
clrdbg 是一个先决条件,需要放在您的 Windows 8 机器上,位于C:/Users/<用户名>/clrdbg文件夹下。当您从 Visual Studio 内进行调试时,该文件夹将被映射到 Oracle Virtual Box 上的默认 VM,然后该 VM 再被映射到容器(如docker-compose.dev.debug.yml中所述)。要使这一切正常工作,clrdbg(Linux 版本)必须安装在您的主目录C:/Users/<用户名>/下。
问题在于如何获取 Linux 版本的 clrdbg 到您的 Windows 机器上。大多数在线链接(例如 https://github.com/Microsoft/MIEngine/wiki/What-is-CLRDBGZ)都提供了有关如何执行此操作的步骤,但如果这些步骤是从 Windows 主机执行的,它会下载clrdb.exe版本,该版本在默认 VM 和容器(因为它们都基于 Linux)上不起作用。
要解决此问题,我遵循了以下步骤(这些步骤仅供参考,您可以直接下载本文中的附件 clrdbg-part1、clrdbg-part2、clrdbg-part3,并将其放在 Windows 主目录下的相应位置)。
- 安装一个新的 Ubuntu 14.x 或更高版本实例,我已经安装好了。
- 登录到 Ubuntu VM(通过 SSH)。
- 在 Ubuntu VM 上安装 .NET Core https://www.microsoft.com/net/core#linuxubuntu
-
在 Ubuntu VM 上安装 clrdbg - https://github.com/Microsoft/MIEngine/wiki/What-is-CLRDBG
curl -sSL https://raw.githubusercontent.com/Microsoft/MIEngine/ getclrdbg-release/scripts/GetClrDbg.sh | bash /dev/stdin vs2015u2 ~/clrdbg
- 安装完成后,您可以将该文件夹打包并压缩,然后将其复制到您的 Windows 机器上的C:/Users/<用户名>/clrdbg。我的做法是将其上传到 Ubuntu 的 Apache 的 www 目录,然后从我的 Windows 机器访问该 URL。
- [问题 5] 该网站无法访问。
- 完成所有步骤后,回到 Visual Studio(假设它正在以正确的 Docker 环境上下文中运行,步骤 III)。
- 清理、构建并调试您的代码。它应该会成功运行,但仍然无法访问,您将看到一个错误页面“该网站无法访问”。
- 这可能是因为浏览器指向的是 localhost URL,但 Docker 容器在您的默认 VM 中运行。
-
更改 URL(将 localhost 替换为您的默认 VM 的 IP 地址)。在我的情况下,我创建了一个 hosts 文件条目并称之为 default。
- 要查找默认 VM 的 IP 地址,请运行命令“
docker-machine ip
”。
最后,您应该能够在控制器中添加断点,并调试现在运行在 Docker 容器中的代码。
希望这能帮助您设置和调试您的 Web 应用程序。
参考文献/灵感
- 在本地 Docker 容器中调试应用程序
- https://marketplace.visualstudio.com/items?itemName=MicrosoftCloudExplorer.VisualStudioToolsforDocker-Preview
历史
- 2016 年 11 月 23 日:初始版本