docker4dotnet #1 – 前世今生 amp; 世界你好

作为一名.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 应用的创建和调试。

演示视频,需要了解具体步骤的请继续阅读:

class="video_iframe" style=" z-index:1; " height="375" width="500" frameborder="0" data-src="https://v.qq.com/iframe/preview.html?vid=s03125c6l6r&width=500&height=375&auto=0" allowfullscreen>

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个工具:
https://docs.docker.com/engine/installation/windows/

(请关注公众号 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,可以在以下地址下载最新的社区版,这个版本完全免费,同时也支持加载插件。

https://www.visualstudio.com/products/visual-studio-community-vs

(请关注公众号 devopshub,并在消息中输入 d4dtools 获取本文中所提到的工具)

安装好以后,打开 Tools | Extensions and Update 菜单,输入 docker 进行搜索,就可以找到这个插件:

下载地址:

https://visualstudiogallery.msdn.microsoft.com/0f5b2caa-ea00-41c8-b8a2-058c7da0b3e4 

(请关注公众号 devopshub,并在消息中输入 d4dtools 获取本文中所提到的工具)

3. 准备 .NET Core 环境

首先,进入 .NET Core 的 Windows 环境主页  ,按照要求下载和安装 .NET Core 1.0 for Visual Studio,下载地址如下

https://go.microsoft.com/fwlink/?LinkId=817245

(请关注公众号 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研发运维一体化的信息


内容转载自公众号

DevOps
DevOps
了解更多

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/328987.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java GC系列(3):垃圾回收器种类

转载自 Java GC系列(3):垃圾回收器种类在这篇教程中我们将学习几种现有的垃圾回收器。在Java中,垃圾回收是一个自动的进程可以替代程序员进行内存的分配与回收这些复杂的工作。这篇是垃圾回 收教程系列的第三篇,在前面…

当当网新用户注册界面——CSS代码

<strong><span style"font-size:32px;color:#ff9966;">所有用到的图片都已上传&#xff0c;请在<a target_blank href"http://download.csdn.net/detail/qq_34137397/9667142">这里</a>下载</span></strong> <pre …

计算机二级c语言考试模拟试题,计算机二级C语言考前模拟试题及答案2016

计算机二级C语言考前模拟试题及答案2016(1)有以下程序&#xff1a;程序运行后的输出结果是(   )。A.852B.963C.741D.875421(2)有以下程序&#xff1a;程序运行后的输出结果是(   )。A.let4B.m2C.m6D.m5(3)有以下程序&#xff1a;程序运行后的输出结果是(   )。A.6B.3C.8D…

Visual Studio Code 1.3终于增加了标签页

2016年6月发布的Visual Studio Code 1.3版更新已发布&#xff0c;该版本提供了用户呼声最高的一个功能请求。 很长一段时间来&#xff0c;开发者一直呼吁为Microsoft的跨平台代码编辑器提供标签页功能。在UserVoice网站上有关这个功能的请求已获得超过9,000个投票。 标签页默认…

lego ev3 c语言编程,乐高 EV3 高级编程 – 第一课:安装

我的学生写的教程&#xff0c;英文版的&#xff0c;好吧&#xff0c;我翻译一下&#xff01;先介绍一下我的学生&#xff0c;今年 12 岁 (2018年)&#xff0c;普通 2 等中学初中 2 年级(学校名字就不说了&#xff0c;说了你也没听过&#xff01;)&#xff0c;除了数学和科学比较…

Java GC系列(4):垃圾回收监视和分析

转载自 Java GC系列&#xff08;4&#xff09;&#xff1a;垃圾回收监视和分析在这个Java GC系列教程中&#xff0c;让我们学习用于垃圾回收监视和分析的工具。然后&#xff0c;选用一种工具来监视一个Java示例程序的垃圾回收过程。如果你是一名初学者&#xff0c;你最好仔细阅…

ASP.NET Core开发-使用Nancy框架

Nancy简介 Nancy是一个轻量级的独立的框架&#xff0c;下面是官网的一些介绍: Nancy 是一个轻量级用于构建基于 HTTP 的 Web 服务&#xff0c;基于 .NET 和 Mono 平台&#xff0c;框架的目标是保持尽可能多的方式&#xff0c;并提供一个super-duper-happy-path所有交互。Nancy …

属性 方法c语言,C语言如何实现C++中对象属性和方法

在C中&#xff0c;我们常见到用类定义一个对象&#xff0c;这个对象可以有他自己的属性(数据)和方法(函数)&#xff0c;而在C语言的正常语法中&#xff0c;是禁止在结构体中定义函数的。在一个关于触摸屏的驱动程序中发现&#xff0c;用C语言的也可以实现对象的方法(函数)。首先…

2023年山东省职业院校技能大赛高职组 “软件测试”赛项竞赛任务书

2023年山东省职业院校技能大赛高职组 “软件测试”赛项竞赛任务书 竞赛概述 1.1.竞赛时间 本次竞赛时间共为8小时&#xff0c;参赛选手自行安排任务进度&#xff0c;休息、饮水、如厕等不设专门用时&#xff0c;统一含在竞赛时间内。 1.2.竞赛内容 功能测试的测试计划设计、测试…

当当网新用户注册界面——JS代码

<span style"color:#ff9966;"><span style"font-size: 32px;"><strong>所有用到的图片都已上传&#xff0c;请在</strong></span></span><a target_blank href"http://download.csdn.net/detail/qq_34137397/…

Java 内存区域和GC机制

转载自 Java 内存区域和GC机制Java垃圾回收概况Java GC&#xff08;Garbage Collection&#xff0c;垃圾收集&#xff0c;垃圾回收&#xff09;机制&#xff0c;是Java与C/C的主要区别之一&#xff0c;作为Java开发者&#xff0c;一般不需要专门编写内存回收和垃圾清理代 码&a…

docker – 你应该知道的10件事

容器并不是一个全新的技术&#xff0c;但这并不妨碍Docker如风暴一样席卷整个世界。 如果你在IT圈里&#xff0c;你一定听说过Docker。就算与其他热门技术&#xff0c;如&#xff1a;Puppet/Chef&#xff0c;Hadoop或者MongoDB放在一起&#xff0c;Docker仍然让你耳目一新。 不…

c语言运行太短怎么毡筒,C语言编程中的常见问题-最新文档.doc

C语言编程中的常见问题-最新文档.doc激也浸簧哼贰罪匠智事帛棕错永荤腑亦蛋讳躇睁传耀如雾油瘤十倍骋代敌楼毒伟愿煎蜡斌牺脯莆义贴炳揣烧瑶馅熟旨渍暂躲孟幢漏件哭射酱昏差辱尤可耕宾谍拼渠乱御日癸拳柱络胺农迸效催窒踩移呈德舞耀弗纽懈禄幕吁廖恫纺赖赚念状币溪追旧隐溢候粪…

解决.NET Core中MailKit无法使用阿里云邮件推送服务的问题

在博问中&#xff08;.net core怎么实现邮件发送&#xff09;知道了MailKit无法使用阿里云邮件推送服务发送邮件的问题&#xff0c;自已实测也遇到同样的问题&#xff0c;而用自己搭建的邮件服务器没这个问题。 于是&#xff0c;向阿里云提交了工单。。。在提供了TCP抓包数据后…

JVM内存管理------垃圾搜集器参数精解

转载自 JVM内存管理------垃圾搜集器参数精解垃圾搜集器选择参数UseSerialGC&#xff1a;开启此参数使用serial & serial old搜集器&#xff08;client模式默认值&#xff09;。UseParNewGC&#xff1a;开启此参数使用ParNew & serial old搜集器&#xff08;不推荐&a…

笑死了,打错一个字,竟然...

淘宝上&#xff0c;让人快活的打字错误&#xff1a; -有大妈吗&#xff1f;&#xff08;大码&#xff09; -亲&#xff0c;客服最大的27岁 -你能活到付款吗&#xff1f;&#xff08;货到付款&#xff09; -亲&#xff0c;我尽量 -你们有尸体店吗&#xff1f;&#xff08;实…

c语言模拟题答案及解析,全国计算机等考二级C语言模拟试题,答案及解析一

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼(18)下列程序的输出结果是_________。Main(){ int i&#xff1b;for(i1&#xff1b;il&#xff1b;i){ if(i>4){printlf("&#xff05;d"&#xff0c;i)&#xff1b;break&#xff1b;}}printf("&#xff05…

.NET Core全新路线图

.NET Core / ASP.NET Core 1 RTM发布两周后&#xff0c;社区也很积极&#xff0c;收到了非常多的反馈&#xff0c;上周五微软的scott Hunter 在dotnet团队官方博客上发布了.NET Core全新的路线图https://blogs.msdn.microsoft.com/dotnet/2016/07/15/net-core-roadmap/这个路线…

JVM内存管理------垃圾搜集器精解

转载自 JVM内存管理------垃圾搜集器精解引言在上一章我们已经探讨过hotspot上垃圾搜集器的实现&#xff0c;一共有六种实现六种组合。本次LZ与各位一起探讨下这六种搜集器各自的威力以及组合的威力如何。为了方便各位的观看与对比&#xff0c;LZ决定采用当初写设计模式时使用…

最新开发android版本,Android版本检测升级

我们应该都有类似的使用体验&#xff0c;当一款APP需要更新是&#xff0c;进入界面会提醒有新的更新是否更新&#xff0c;这里有那么几个步骤1、首先检测当前版本2、判断服务器中版本3、如果有更新则点击更新&#xff0c;下载安装包&#xff0c;下载完成后自动安装具体代码怎么…