65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.89/5 (9投票s)

2016 年 11 月 23 日

CPOL

7分钟阅读

viewsIcon

27244

downloadIcon

174

设置 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 内运行容器。

问题

我发现的主要问题如下:

  1. Docker 通信问题 “尝试连接时发生错误:Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.24/containers/json: open //./pipe/docker_engine: 系统找不到指定的文件。” [参见步骤 III]
  2. 主机和容器之间的卷共享 [参见步骤 V]
  3. 在 Linux 上用于调试的 Clrdbg “/clrdbg/clrdbg 未找到” [参见步骤 VI]
  4. 浏览器中 Localhost URL 不起作用 “该网站无法访问” [参见步骤 VII]

术语

  1. VM – 虚拟机
  2. Host – 主机操作系统 (Windows 8)
  3. Guest – 客户机操作系统 VM
  4. 默认 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)

设置过程 - 使用代码

  1. Docker 安装
    1. 安装正确版本的 Docker Toolbox https://docs.dockerd.com.cn/toolbox/overview/。这将安装 Oracle VM Virtual Box、docker 客户端和 Kitematic。
    2. 通过运行“hello world”镜像容器来测试 Docker 设置
  2. Visual Studio 安装
    1. Visual Studio 2015 update 3
    2. 确保已安装 Visual Studio Tools for Docker。或者,从 此链接 安装。
  3. [问题 1] Docker 通信失败
    1. 注意到的一大问题是 Visual Studio 与 Docker 守护进程之间的通信失败。您将在输出窗口中看到的错误是“尝试连接时发生错误:Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.24/containers/json: open //./pipe/docker_engine: 系统找不到指定的文件。”
      这可能是由两个原因引起的:
      1. Docker 未运行 – 这很容易解决,打开 Kitematic 并单击“Docker CLI”[右下角]。然后运行“docker ps –a”,这将列出所有正在运行的 Docker 容器实例,如果它能列出,则没有问题。
      2. Visual Studio 无法连接到 Docker。这主要发生在 Docker 运行在 Oracle Virtual Box 设置的 Linux VM 中时。
        1. 初始化 Docker 环境
          1. eval "$(docker-machine env default)" – 如果使用 GIT bash 或等效工具
          2. docker-machine env default – 如果使用命令提示符
        2. 然后从同一个命令提示符/bash 窗口,打开 Visual Studio 2015。这可以通过运行命令“C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\devenv.exe”来完成。这确保 Visual Studio 在正确的 Docker 环境上下文中运行,并且在调试 Web 应用程序时不会出现通信错误。
  4. 创建示例 MVC 应用程序
    1. 在 Visual Studio 中,转到 **文件** > **新建** > **项目** > **Web** > **ASP.NET Core Web 应用程序** (.NET 4.5)。请选择C:\Users\<用户名>下的位置。我将其创建在Workspace文件夹下。我将在步骤 V 中解释这一点,您可以选择其他文件夹,但该文件夹需要与 docker toolbox 创建的 Linux VM 共享,我无法实现这一点。

    2. 接下来,选择“Web 应用程序”选项,然后单击 **OK**

    3. 您可以编辑 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();
              }
      }
    4. 接下来转到 **项目** > **添加 Docker 支持**
    5. 这将创建一个 Dockerfile 和 3 个 docker-compose 文件。有关每个文件的详细信息:https://docs.microsoft.com/en-us/dotnet/articles/core/docker/visual-studio-tools-for-docker

    6. 此时,理想情况下,您应该能够构建和部署,并且应用程序将在新的容器中运行。但是,我注意到了一些问题,这需要进行一些更改,这些更改将在下面的步骤中介绍。我看到的所有问题都与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. 
  5. [问题 2] 跨容器映射卷

    从 docker compose 文件中可以看到,它依赖于 3 个卷。为了访问这些文件夹,它们必须映射到 Oracle Virtual Box 的共享文件夹下(下面的截图)。

    我尝试添加其他文件夹,但不知何故,对我来说不起作用。因此,我将所有卷保留在“C:/Users”下,因为那是在默认情况下映射的并且对我来说是有效的。如果您也这样做,请忽略此步骤的其余部分,然后继续下一步。

    如果您想尝试一下或遇到问题,可以尝试以下步骤来共享和映射其他卷:

    1. 打开 Oracle VM Virtual Box,在 Virtual box UI 中共享文件夹(上面的截图)。确保选中了 permanent 和 auto-mount。停止默认 VM(假设 Kitematic 设置为在退出时停止 VM,您可以关闭 Kitematic 来做到这一点)。
    2. 假设 VBox 中的共享名称是c/dev,其中包含我们的 Visual Studio 项目
    3. Docker 启动并运行后,运行命令:
      1. docker-machine.exe ssh default 'sudo mkdir --parents //c/dev'
      2. docker-machine.exe ssh default 'sudo mount -t vboxsf c/dev //c/dev/
      3. 确保docker-compose.dev.debug.yml中的路径与此匹配。在这种情况下,卷中的源路径应从C:/dev开始。
      4. 然后运行 docker 容器(在这种情况下,尝试从 Visual Studio 进行调试,因为它也会创建容器,假设下面的步骤 VI 也已完成)。
  6. [问题 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-part1clrdbg-part2clrdbg-part3,并将其放在 Windows 主目录下的相应位置)。

    1. 安装一个新的 Ubuntu 14.x 或更高版本实例,我已经安装好了。
    2. 登录到 Ubuntu VM(通过 SSH)。
    3. 在 Ubuntu VM 上安装 .NET Core https://www.microsoft.com/net/core#linuxubuntu
    4. 在 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
      		
    5. 安装完成后,您可以将该文件夹打包并压缩,然后将其复制到您的 Windows 机器上的C:/Users/<用户名>/clrdbg。我的做法是将其上传到 Ubuntu 的 Apache 的 www 目录,然后从我的 Windows 机器访问该 URL。
  7. [问题 5] 该网站无法访问。
    1. 完成所有步骤后,回到 Visual Studio(假设它正在以正确的 Docker 环境上下文中运行,步骤 III)。
    2. 清理、构建并调试您的代码。它应该会成功运行,但仍然无法访问,您将看到一个错误页面“该网站无法访问”。
    3. 这可能是因为浏览器指向的是 localhost URL,但 Docker 容器在您的默认 VM 中运行。
    4. 更改 URL(将 localhost 替换为您的默认 VM 的 IP 地址)。在我的情况下,我创建了一个 hosts 文件条目并称之为 default。

    5. 要查找默认 VM 的 IP 地址,请运行命令“docker-machine ip”。

最后,您应该能够在控制器中添加断点,并调试现在运行在 Docker 容器中的代码。

希望这能帮助您设置和调试您的 Web 应用程序。

参考文献/灵感

历史

  • 2016 年 11 月 23 日:初始版本
© . All rights reserved.