使用Visual Studio调试容器化.Net Core应用

前一阵公司要开发一个Web API应用给购买了我们公司的一款基于TFS扩展应用产品的客户使用,需求之中就要求可移植性,因为我是一个吃了十几年微软技术的技术宅,没办法只能使用.Net Core来开发。由于公司一直致力于为客户实现软件研发的DevOps,因此老板说让我这个应用的开发要DevOps。好吧!基于这些要求,应用的技术选型与开发、部署工具确定了:开发语言C#(我就会这个),.Net Core框架(点这儿了解更多),使用Visual Studio(够强大), 采用Docker的容器化部署。

项目快结束的时候 Microsoft Ignite 2016上给我带来了福音, Docker的容器能直接部署在Azure Web上啦!!!哈哈哈,果断采用Azure作为运维平台。在整个项目过程中,Docker的容启化技术确实帮我在开发、部署环节节省了大量时间,我使用VS直接在Docker中进行调试,调试成功后直接将本地的image部署到Azure环境上进行接口测试。

这里跟大家展示一下使用Visual Studio开发.Net Core应用并在Docker中调试的一些小经验,确实能让你的开发、部署快起来:

  • 如何配置.Net Core应用的容器化开发调试环境
  • 如何在Docker容器中调试.Net Core应用

配置.Net Core应用的开发调试环境

既然是在Visual Studio上开发.Net Core程序, 那就需要在Windows系统上安装Docker for Windows工具,点击这里下载安装程序。对于还在使用Windows 10以下版本的同学们,如果你们想在自己的电脑上运行Docker,你们需要先去升级系统啦,因为Docker for Windows 最低支持的系统是 64位 Windows 10 Pro, Enterprise and Education (1511 November update, Build 10586 or later)
1

Visual Studio虽然推出了Mac版,但是现在绝大多数.Net开发人员依然在Windows平台上使用VIsualStudio开发应用, Visual Studio作为一款公认的宇宙最强IDE拥有强大的编辑与调试功能, 你可以在这里获取免费的Visual Studio Community 版本
2

本文介绍的.net core应用容器化调试还是在VS 2015上开发, VS 2015默认是不能创建开发.Net Core应用的,需要在这里下载安装一个扩展应用。
3

除了.Net Core的扩展以外,如果我们想在Docker中调试应用,还要装一个Docker的扩展,点击这里下载并双击安装。
4

现在我们可以在Visual Studio中创建ASP.Net Core Web 应用了, 虽然这个环境配置过程开起来并不简单,但这都是由于VS 2015并不包含这些扩展及应用的原因。在VS 2017中这些扩展已经被内置在IDE中了,减少我们开发人员的前期准备工作,但是由于VS 2017现在还是RC版本,因此这里就依然使用VS 2015为大家介绍了,大家可以点击这里了解详细内容

在Docker容器中调试.Net Core应用

安装后你就可以在VS的项目创建向导中创建.Net Core应用。
5

应用创建好后可以直接通过右键点击 项目 | 添加 | Docker Support 添加在容器中调试需要添加的必备文件, 会自动在web项目中为你添加Dockerfile, Docker Compose等文件,我们可以看一下,这些文件都是做什么用的。

作为生成镜像的配置文件Dockerfile里面包含了程序入口,工作目录,以及应用运行在容器中的端口号
FROM microsoft/aspnetcore:1.0.1
ENTRYPOINT ["dotnet", "TestApp.dll"]
ARG source=.
WORKDIR /app
EXPOSE 80
COPY $source .

docker-compose是容器调试环境的配置文件,这里包含了使用Dockerfile在,在哪个位置生成image,启动容器时,应用在容器中对外的端口号。
version: '2'
services:
testapp:
image: user/testapp${TAG}
build:
context: .
dockerfile: Dockerfile
ports:
- "80"

除了添加了docker相关文件以外,我们注意到调试按钮变啦!多了个Docker的调式选项。VS确实是强大啊,我们不需要关注怎么部署debuger,也不需要关注怎样将容器中的应用运行进程加载到本地的debuger中进行调试,只需要点击Docker就可以实现在容器中进行.Net Core应用的调试啦。
6

现在点击Docker调试程序吧。吼吼,程序运行起来了!
哎?! 不对吧,为什么我们调试的网站地址是http://localhost:32769/呢?
7

呵呵,这个确实是运行在容器中的.net core应用。只是我们通过本地的32769端口映射到了运行容器的80端口来访问应用,还记得上面我们提到的在DockerCompose文件中的容器启动端口吧。打开VS的 输出窗口 | 生成
8

可以看到通过运行docker-compose命令,VS在调试过程中创建了一个ID为519ceb326d3b的image,并且通过这个image创建了一个ID为f6aec1721fff的容器, 我们可以通过命令行来验证下:
9

看到着这是不是就全清楚了,在调试过程中启动的容器是使用user/testapp:dev image创建的,容器的端口为80并映射到了本地的32769端口,因此VS调试应用打开的web地址为http://localhost:32769/。

现在让我们在VS中调试容器中运行的程序吧!同时也可以进一步验证我们的应用是运行在容器中。首
先对程序进行一些修改,在HomeController中获取当前应用运行的机器名,顺手加个断点,一会儿调试运行时我们可以看一下运行程序的机器名。 然后我们把机器名显示在主页上
10

点击Docker调试运行后,断点被触发了,我们发现,输出的机器名是容器ID而不是电脑名。
11

最后运行 docker ps命令查看下运行的容器。
12

通过这篇文章我希望大家能了解Docker的强大,也让像我一样的开发人员能看到从对本地环境环境的维护中解脱出来的曙光,以后我们希望在我们的开发机上只需要安装操作系统、Docker以及IDE就能能完成所有的开发调试工作。