docker4dotnet #1 – 前世今生 & 世界你好
作为一名.NET Developer,这几年看着docker的流行实在是有些眼馋。可惜的是,Docker是基于Linux环境的,眼瞧着那些 java, python, node.js, go 甚至连php程序员都可以docker了,自己还在苦哈哈的装虚拟机,实在是急啊!所以对于.NET Core的发展格外关注,因为它的跨平台,意味着.NET Developer也可以docker了。
前世今生
.NET core 1.0并不是对原有的.net平台的升级,而是一次全新的重写,这个开发过程微软也史无前例的采用了全面开源的做法,在github上接受全球开发者的pull request。从上图可以看出,.NET core与现有的.net framework是并行的,是完全独立发展的一套开发平台。与之前的.net framework最大的区别在于跨平台,同时支持Windows/macOS/Linux 这三大操作系统。在GitHub上.NET Core的发布时间线可以看到在过去的2年里,微软一步步的将.NET 从Windows操作系统上剥离,逐步添加了对macOS和Linux操作系统的支持,同时与开源社区的合作也在逐步加深。
– 2014年7月 - 微软在github上发布了asp.net vNext(也就是asp.net 5)的前身,这时还是alpha阶段
– 2014年11月 - 发布了beta1,并且开始使用asp.net 5的名称
– 2015年10月 - 发布了beta8,这是最后的一个beta版本,这一年的时间里,微软逐步提供了对于macOS和Linux操作系统的支持;同时随着 Visual Studio Code 这个跨平台代码编辑器的流行,大家慢慢开始关注asp.net 5
– 2015年11月 - 发布了RC1,标志着asp.net 5基本具备了使用在生产环境的能力
– 2016年6月27日 - 在RedHat全栈开发者大会DevNation上,微软与RedHat携手发布了Asp.net Core 1.0,标志着微软这一跨平台开发工具的正式发布。
为什么是Docker?
我们再来看看docker,这个2013年才发布的开源项目从一开始就引起了全球开发者的极大关注,在发布4个月的时间里下载量就超过50000次, github上收到超过4000个star,涌现了超过100个贡献者,并且有超过150个项目和超过1000个产品开始使用docker。1年之内,RedHat和AWS就宣布为Docker提供官方支持,在这样大的关注下,连Docker自己的CEO都劝说全球的开发者暂时不要将Docker用于生产环境。2014年6月,Docker发布了1.0版本,这时Docker的下载量已经超过275万,到今天这个数字已经超过了10亿。
为什么小编对docker如此垂涎,此话要从“修电脑”说起。作为一名程序员,谁没有修过电脑,谁没有被叫去修过电脑,谁没有被认为很会修电脑 … … 可是,你有想过为啥我们这样擅长修电脑么?难道真的是因为泡妹子么?那都是副产品好么!!!
故事 … … 一个月前接了一个项目,用的是XXX技术,搭建好了环境,热火朝天干了一个月;今天项目经理说这里还有另外项目的一些小问题需要处理,你来看看吧,用不了多少时间。结果你发现这个项目用的是YYY的技术,搭建环境就化了你半天时间,这时候项目经理电话来了:“为啥还没搞完?啥,环境还没搞好,算了,你别搞了,我找别人!“。好吧,苦逼的你回去继续原来的项目,发现XXX环境的变量被YYY搞乱了,改了很久也搞不好 … … 结果就是:从!装!电!脑!
程序员就这样变成装机高手!再后来的程序员开始使用虚拟机,把开发环境放到虚拟机中,这样就不用担心不同环境之间互相冲突,不过虚拟机动辄几十个G的硬盘占用和巨大的CPU和内存开销让电脑变得慢吞吞的,本来i7的机器只能享受到i3的性能,太浪费了。
这就是为啥docker成为了全球程序员的福音:
– 不必担心新接手的项目环境搭建复杂;
– 不必担心同时开发2个环境互相冲突的项目;
– 不会再占用大量的内存和硬盘,环境启动迅速,启动一个容器只需要几秒钟,而虚拟机需要几分钟;就算是8G内存也可以同时跑多个容器,而虚拟机能跑2个就不错了;
– 直接把做好的应用丢给测试,测试不必自己再从新搭建环境,要恢复干净的测试环境也只是一个命令而已;
– 直接把测试好的应用丢给运维去部署,不用去和运维撕扯 jdk 1.8还是1.7
– 环境坏掉了,换个新的,不用费劲去看log,恢复这恢复那
– 不用担心你旁边的程序员用了不同版本的jdk,他的环境就是你的环境,哪怕你用的本本上是win7,他在用高大上的macbook pro
这不是程序员的天堂么? 这就是docker带给我们的,这就是为啥程序员们急不可耐的开始使用docker,而且愿意冲破阻力让运维去接受docker,这种事情在历史上好像没有出现过;从来都是运维要求开发使用标准化环境的。
其实Docker所解决就是一直困扰每一名IT人的环境不统一问题;这个问题随着各种技术,框架和平台的爆炸性增长最终成为应用开发效率的终极杀手,让开发者和企业付出巨大的努力和金钱。无论是从组织和流程层面的ITSM,还是从敏捷化角度推行的DevOps,或是自动化(如:Chef/Puppet等)都没有跳出这个问题所形成的漩涡。这些方法或者工具试图用复杂的方法来适应复杂的环境,而Docker则是用一种逆向思维的方式来解决这个问题,用简单的方法来解决复杂的问题,很有点四两拨千斤的感觉!
为啥它的名字叫做Docker:因为Docker所使用的容器技术(Containers)就来自于运输行业的集装箱(Containers)的思路。运输行业在60年代遭遇了同样的问题,大家希望运送的物品各式各样,尺寸不一,这给运送过程造成了极大的麻烦。这就如同我们需要将不同环境,不同版本的应用从开发运送到测试,再运送到生产。
于是集装箱开始出现,运输公司将不同尺寸的物品装入统一的集装箱,这样无论是卡车,码头机械,飞机和轮船的货仓都可以按照标准化的集装箱尺寸进行设计,极大的提高了效率,降低了成本。Docker在这里就起到了这个集装箱的作用,让开发人员可以按照需要将环境和应用装入容器,而测试和运维人员只需要运送和装载。
Docker借用了集装箱运输的思路,将应用所需要的所有环境一同打包,同时采用轻量级的虚拟化技术在操作系统之上提供一个相对隔离的运行时空间。这样,开发人员就可以直接完成依赖环境与应用本身的打包,而测试/运维人员只需要进行装载操作。
开发环境选择
要使用Docker来开发.NET Core应用程序,你可以选择自己喜欢的操作系统和工具,在这个系列文章里面,我会介绍2个最常见的开发环境
– Windows + Visual Studio 2015 + Docker for Windows
– macOS + Visual Studio Code + Docker for Mac
部署环境上,我将使用微软的Azure和亚马逊的AWS来实现测试和生产环境的部署,并且借助Visual Studio Team Service 作为DevOps工具链来实现从开发-测试-生产的发布管道(Release Pipeline)的建立。
Docker 世界,你好!
今天我先来看看最简单的场景,在Windows 10上面搭建Docker for Windows 开发环境,并使用Visual Studio 2015和Docker for Visual Studio插件来完成一个.net Core 应用的创建和调试。
演示视频,需要了解具体步骤的请继续阅读:
https://v.qq.com/txp/iframe/player.html?vid=s03125c6l6r&width=500&height=375&auto=0
1. 在 Windows 上面安装 Docker for Windows
Docker for Windows是Docker公司为使用Windows的开发人员提供的开发和测试环境,他的前身是Docker Toolbox。Docker for Windows和Docker Toolbox的区别在于前者使用Hyper-V提供虚拟化支持,Docker Toolbox使用VirtualBox。因此,如果你使用的是Windows 10操作系统,你可以使用Docker for Windows,如果使用的是更老的操作系统,则可以使用Docker Toolbox。
可以从以下地址下载这2个工具:
(请关注公众号 devopshub,并在消息中输入 d4dtools 获取本文中所提到的工具)
在这篇文章里面我使用的是 Docker for Windows 和 Windows 10的环境,Docker for Windows 对 Windows 10的版本也是有要求的,最低需要 Version 1511 (OS Build 10586)以上才可以,你可以在通过winver命令来查看自己的版本信息。
安装过程非常简单,直接双击下载好的安装包,一直下一步就可以完成。在这个过程中,如果你的机器还没有启用Hyper-V,安装程序会自动启用。如果你的Windows 10本来就是一台虚拟机,那么根据你所使用的虚拟化工具的不同,可以启动虚拟化嵌套,也就是在虚拟机里面运行虚拟机。
安装好以后一定要记得要使用管理员权限启动 Docker for Windows,否则 Docker for Windows 将无法与Hyper-V控制台通讯,造成环境启动失败。
Docker for Windows 启动成功后会弹出系统通知,
同时在Hyper-V 控制台中可以看到一台LinuxVM正在运行。
以上过程可以看出,Docker for Windows的工作机制实际上是在 Hyper-V 中运行了一台运行了Docker Daemon (驻守程序)的虚拟机,并将Windows上运行的Docker命令行工具指向了这台虚拟机中的docker环境。而对于开发者而言,我们只需要在Windows上运行cmd或者powershell命令行,就可以使用同样的docker 命令进行操作了。
2. 安装 Docker for Visual Studio 插件
Visual Studio 强大的开发和调试能力对于提升效率有很大的帮助,为了能够提供基于docker的开发调试体验,微软提供了一个 Docker Tools for Visual Studio 插件。
如果你还没有安装 Visual Studio 2015,可以在以下地址下载最新的社区版,这个版本完全免费,同时也支持加载插件。
(请关注公众号 devopshub,并在消息中输入 d4dtools 获取本文中所提到的工具)
安装好以后,打开 Tools | Extensions and Update 菜单,输入 docker 进行搜索,就可以找到这个插件:
下载地址:
https://visualstudiogallery.msdn.microsoft.com/0f5b2caa-ea00-41c8-b8a2-058c7da0b3e4
(请关注公众号 devopshub,并在消息中输入 d4dtools 获取本文中所提到的工具)
3. 准备 .NET Core 环境
首先,进入 .NET Core 的 ,按照要求下载和安装 .NET Core 1.0 for Visual Studio,下载地址如下
(请关注公众号 devopshub,并在消息中输入 d4dtools 获取本文中所提到的工具)
安装后就可以在Visual Studio 中创建.NET Core 应用了。
4. 在 Visual Studio 2015 中创建.NET Core Web App
点击 File | New | Project …,打开项目创建引导,并选择 ASP.NET Core Web Application (.NET Core) 项目类型
在模板页中选择 Web Application 模版,并点击OK,进行创建
创建完成后 Visual Studio 会自动运行dotnet restore命令恢复项目依赖,等待这一过程完成,然后按F5测试一下,正常情况下你可以看到以下初始的网站状态。
5. 启用 Docker Support,并使用Docker环境进行调试
在项目节点上右键单击,并选择 Add | Docker Support
这时,你项目里面会多出以下2部分内容
(1)这里是对Visual Studio 进行配置,确保 Visual Studio 的工具链会正确与 docker 环境集成
(2)这里是对Docker自己的环境配置,包括 Dockerfile 和 Docker Compose file (这部分的具体内容在后续的文章中给大家介绍),另外还有一个 DockerTask.ps1。
DockerTask.ps1 是一个 powershell 脚本,Visual Studio 和 Docker 的交互其实都是通过这个脚本来完成的,这里贴出这个脚本的参数部分,你会看到脚本中对常用的docker命令又进行了一层封装,让docker可以更好的配合Visual Studio的工具链调用。这个脚本非常有用,特别是在没有 Visual Studio 的情况下,你完全可以借助这个脚本手动完成工具链的构建。
现在,你会发现在 Visual Studio的运行状态栏中多了一个 Docker 的选项,意味着我们可以直接点击这个按钮或者F5,就可以将应用部署到本地的 Docker for Windows 环境,并开始调试了。
运行起来的效果如下
你可以看到我在Controller里面添加了一行代码来获取本地的机器名,在容器里面获取到的就是这个容器的id,同时在这里还可以设置断点;在docker中运行的应用会中断,你可以像调试一个普通的ASP.NET应用一样来调试这个运行在Docker中的应用。
本文仅仅是 Docker for .NET Developer (D4D) 系列的开始,大家可以看到借助Visual Studio一贯强大的开发和调试能力和Docker的环境隔离能力,可以大大提高开发效率。后续还将为大家介绍如何在macOS上使用Docker进行开发,同时借助 VSTS 的 DevOps 工具链支持完成云端的Docker环境集成。
本文中所使用的工具有些需要翻墙才能才能正常下载,小编整理了一下放在云盘上,供大家高速下载;需要的朋友请在公众号中输入 d4dtools 获取下载地址,谢谢!
请关注微信公众号 【devopshub】,获取更多关于DevOps研发运维一体化的信息