docker4dotnet #1 – 前世今生 & 世界你好
作為一名.NET Developer,這幾年看著docker的流行實(shí)在是有些眼饞??上У氖?,Docker是基于Linux環(huán)境的,眼瞧著那些 java, python, node.js, go 甚至連php程序員都可以docker了,自己還在苦哈哈的裝虛擬機(jī),實(shí)在是急啊!所以對(duì)于.NET Core的發(fā)展格外關(guān)注,因?yàn)樗目缙脚_(tái),意味著.NET Developer也可以docker了。
前世今生
.NET core 1.0并不是對(duì)原有的.net平臺(tái)的升級(jí),而是一次全新的重寫(xiě),這個(gè)開(kāi)發(fā)過(guò)程微軟也史無(wú)前例的采用了全面開(kāi)源的做法,在github上接受全球開(kāi)發(fā)者的pull request。從上圖可以看出,.NET core與現(xiàn)有的.net framework是并行的,是完全獨(dú)立發(fā)展的一套開(kāi)發(fā)平臺(tái)。與之前的.net framework***的區(qū)別在于跨平臺(tái),同時(shí)支持Windows/macOS/Linux 這三大操作系統(tǒng)。在GitHub上.NET Core的發(fā)布時(shí)間線可以看到在過(guò)去的2年里,微軟一步步的將.NET 從Windows操作系統(tǒng)上剝離,逐步添加了對(duì)macOS和Linux操作系統(tǒng)的支持,同時(shí)與開(kāi)源社區(qū)的合作也在逐步加深。
– 2014年7月 - 微軟在github上發(fā)布了asp.net vNext(也就是asp.net 5)的前身,這時(shí)還是alpha階段
– 2014年11月 - 發(fā)布了beta1,并且開(kāi)始使用asp.net 5的名稱(chēng)
– 2015年10月 - 發(fā)布了beta8,這是***的一個(gè)beta版本,這一年的時(shí)間里,微軟逐步提供了對(duì)于macOS和Linux操作系統(tǒng)的支持;同時(shí)隨著 Visual Studio Code 這個(gè)跨平臺(tái)代碼編輯器的流行,大家慢慢開(kāi)始關(guān)注asp.net 5
– 2015年11月 - 發(fā)布了RC1,標(biāo)志著asp.net 5基本具備了使用在生產(chǎn)環(huán)境的能力
– 2016年6月27日 - 在RedHat全棧開(kāi)發(fā)者大會(huì)DevNation上,微軟與RedHat攜手發(fā)布了Asp.net Core 1.0,標(biāo)志著微軟這一跨平臺(tái)開(kāi)發(fā)工具的正式發(fā)布。
為什么是Docker?
我們?cè)賮?lái)看看docker,這個(gè)2013年才發(fā)布的開(kāi)源項(xiàng)目從一開(kāi)始就引起了全球開(kāi)發(fā)者的極大關(guān)注,在發(fā)布4個(gè)月的時(shí)間里下載量就超過(guò)50000次, github上收到超過(guò)4000個(gè)star,涌現(xiàn)了超過(guò)100個(gè)貢獻(xiàn)者,并且有超過(guò)150個(gè)項(xiàng)目和超過(guò)1000個(gè)產(chǎn)品開(kāi)始使用docker。1年之內(nèi),RedHat和AWS就宣布為Docker提供官方支持,在這樣大的關(guān)注下,連Docker自己的CEO都勸說(shuō)全球的開(kāi)發(fā)者暫時(shí)不要將Docker用于生產(chǎn)環(huán)境。2014年6月,Docker發(fā)布了1.0版本,這時(shí)Docker的下載量已經(jīng)超過(guò)275萬(wàn),到今天這個(gè)數(shù)字已經(jīng)超過(guò)了10億。
為什么小編對(duì)docker如此垂涎,此話要從“修電腦”說(shuō)起。作為一名程序員,誰(shuí)沒(méi)有修過(guò)電腦,誰(shuí)沒(méi)有被叫去修過(guò)電腦,誰(shuí)沒(méi)有被認(rèn)為很會(huì)修電腦 … … 可是,你有想過(guò)為啥我們這樣擅長(zhǎng)修電腦么?難道真的是因?yàn)榕菝米用?那都是副產(chǎn)品好么!!!
故事 … … 一個(gè)月前接了一個(gè)項(xiàng)目,用的是XXX技術(shù),搭建好了環(huán)境,熱火朝天干了一個(gè)月;今天項(xiàng)目經(jīng)理說(shuō)這里還有另外項(xiàng)目的一些小問(wèn)題需要處理,你來(lái)看看吧,用不了多少時(shí)間。結(jié)果你發(fā)現(xiàn)這個(gè)項(xiàng)目用的是YYY的技術(shù),搭建環(huán)境就化了你半天時(shí)間,這時(shí)候項(xiàng)目經(jīng)理電話來(lái)了:“為啥還沒(méi)搞完?啥,環(huán)境還沒(méi)搞好,算了,你別搞了,我找別人!“。好吧,苦逼的你回去繼續(xù)原來(lái)的項(xiàng)目,發(fā)現(xiàn)XXX環(huán)境的變量被YYY搞亂了,改了很久也搞不好 … … 結(jié)果就是:從!裝!電!腦!
程序員就這樣變成裝機(jī)高手!再后來(lái)的程序員開(kāi)始使用虛擬機(jī),把開(kāi)發(fā)環(huán)境放到虛擬機(jī)中,這樣就不用擔(dān)心不同環(huán)境之間互相沖突,不過(guò)虛擬機(jī)動(dòng)輒幾十個(gè)G的硬盤(pán)占用和巨大的CPU和內(nèi)存開(kāi)銷(xiāo)讓電腦變得慢吞吞的,本來(lái)i7的機(jī)器只能享受到i3的性能,太浪費(fèi)了。
這就是為啥docker成為了全球程序員的福音:
– 不必?fù)?dān)心新接手的項(xiàng)目環(huán)境搭建復(fù)雜;
– 不必?fù)?dān)心同時(shí)開(kāi)發(fā)2個(gè)環(huán)境互相沖突的項(xiàng)目;
– 不會(huì)再占用大量的內(nèi)存和硬盤(pán),環(huán)境啟動(dòng)迅速,啟動(dòng)一個(gè)容器只需要幾秒鐘,而虛擬機(jī)需要幾分鐘;就算是8G內(nèi)存也可以同時(shí)跑多個(gè)容器,而虛擬機(jī)能跑2個(gè)就不錯(cuò)了;
– 直接把做好的應(yīng)用丟給測(cè)試,測(cè)試不必自己再?gòu)男麓罱ōh(huán)境,要恢復(fù)干凈的測(cè)試環(huán)境也只是一個(gè)命令而已;
– 直接把測(cè)試好的應(yīng)用丟給運(yùn)維去部署,不用去和運(yùn)維撕扯 jdk 1.8還是1.7
– 環(huán)境壞掉了,換個(gè)新的,不用費(fèi)勁去看log,恢復(fù)這恢復(fù)那
– 不用擔(dān)心你旁邊的程序員用了不同版本的jdk,他的環(huán)境就是你的環(huán)境,哪怕你用的本本上是win7,他在用高大上的macbook pro
這不是程序員的天堂么? 這就是docker帶給我們的,這就是為啥程序員們急不可耐的開(kāi)始使用docker,而且愿意沖破阻力讓運(yùn)維去接受docker,這種事情在歷史上好像沒(méi)有出現(xiàn)過(guò);從來(lái)都是運(yùn)維要求開(kāi)發(fā)使用標(biāo)準(zhǔn)化環(huán)境的。
其實(shí)Docker所解決就是一直困擾每一名IT人的環(huán)境不統(tǒng)一問(wèn)題;這個(gè)問(wèn)題隨著各種技術(shù),框架和平臺(tái)的爆炸性增長(zhǎng)最終成為應(yīng)用開(kāi)發(fā)效率的***殺手,讓開(kāi)發(fā)者和企業(yè)付出巨大的努力和金錢(qián)。無(wú)論是從組織和流程層面的ITSM,還是從敏捷化角度推行的DevOps,或是自動(dòng)化(如:Chef/Puppet等)都沒(méi)有跳出這個(gè)問(wèn)題所形成的漩渦。這些方法或者工具試圖用復(fù)雜的方法來(lái)適應(yīng)復(fù)雜的環(huán)境,而Docker則是用一種逆向思維的方式來(lái)解決這個(gè)問(wèn)題,用簡(jiǎn)單的方法來(lái)解決復(fù)雜的問(wèn)題,很有點(diǎn)四兩撥千斤的感覺(jué)!
為啥它的名字叫做Docker:因?yàn)镈ocker所使用的容器技術(shù)(Containers)就來(lái)自于運(yùn)輸行業(yè)的集裝箱(Containers)的思路。運(yùn)輸行業(yè)在60年代遭遇了同樣的問(wèn)題,大家希望運(yùn)送的物品各式各樣,尺寸不一,這給運(yùn)送過(guò)程造成了極大的麻煩。這就如同我們需要將不同環(huán)境,不同版本的應(yīng)用從開(kāi)發(fā)運(yùn)送到測(cè)試,再運(yùn)送到生產(chǎn)。
于是集裝箱開(kāi)始出現(xiàn),運(yùn)輸公司將不同尺寸的物品裝入統(tǒng)一的集裝箱,這樣無(wú)論是卡車(chē),碼頭機(jī)械,飛機(jī)和輪船的貨倉(cāng)都可以按照標(biāo)準(zhǔn)化的集裝箱尺寸進(jìn)行設(shè)計(jì),極大的提高了效率,降低了成本。Docker在這里就起到了這個(gè)集裝箱的作用,讓開(kāi)發(fā)人員可以按照需要將環(huán)境和應(yīng)用裝入容器,而測(cè)試和運(yùn)維人員只需要運(yùn)送和裝載。
Docker借用了集裝箱運(yùn)輸?shù)乃悸?,將?yīng)用所需要的所有環(huán)境一同打包,同時(shí)采用輕量級(jí)的虛擬化技術(shù)在操作系統(tǒng)之上提供一個(gè)相對(duì)隔離的運(yùn)行時(shí)空間。這樣,開(kāi)發(fā)人員就可以直接完成依賴(lài)環(huán)境與應(yīng)用本身的打包,而測(cè)試/運(yùn)維人員只需要進(jìn)行裝載操作。
開(kāi)發(fā)環(huán)境選擇
要使用Docker來(lái)開(kāi)發(fā).NET Core應(yīng)用程序,你可以選擇自己喜歡的操作系統(tǒng)和工具,在這個(gè)系列文章里面,我會(huì)介紹2個(gè)最常見(jiàn)的開(kāi)發(fā)環(huán)境
– Windows + Visual Studio 2015 + Docker for Windows
– macOS + Visual Studio Code + Docker for Mac
部署環(huán)境上,我將使用微軟的Azure和亞馬遜的AWS來(lái)實(shí)現(xiàn)測(cè)試和生產(chǎn)環(huán)境的部署,并且借助Visual Studio Team Service 作為DevOps工具鏈來(lái)實(shí)現(xiàn)從開(kāi)發(fā)-測(cè)試-生產(chǎn)的發(fā)布管道(Release Pipeline)的建立。
Docker 世界,你好!
今天我先來(lái)看看最簡(jiǎn)單的場(chǎng)景,在Windows 10上面搭建Docker for Windows 開(kāi)發(fā)環(huán)境,并使用Visual Studio 2015和Docker for Visual Studio插件來(lái)完成一個(gè).net Core 應(yīng)用的創(chuàng)建和調(diào)試。
1. 在 Windows 上面安裝 Docker for Windows
Docker for Windows是Docker公司為使用Windows的開(kāi)發(fā)人員提供的開(kāi)發(fā)和測(cè)試環(huán)境,他的前身是Docker Toolbox。Docker for Windows和Docker Toolbox的區(qū)別在于前者使用Hyper-V提供虛擬化支持,Docker Toolbox使用VirtualBox。因此,如果你使用的是Windows 10操作系統(tǒng),你可以使用Docker for Windows,如果使用的是更老的操作系統(tǒng),則可以使用Docker Toolbox。
可以從以下地址下載這2個(gè)工具:
https://docs.docker.com/engine/installation/windows/
(請(qǐng)關(guān)注公眾號(hào) devopshub,并在消息中輸入 d4dtools 獲取本文中所提到的工具)
在這篇文章里面我使用的是 Docker for Windows 和 Windows 10的環(huán)境,Docker for Windows 對(duì) Windows 10的版本也是有要求的,***需要 Version 1511 (OS Build 10586)以上才可以,你可以在通過(guò)winver命令來(lái)查看自己的版本信息。
安裝過(guò)程非常簡(jiǎn)單,直接雙擊下載好的安裝包,一直下一步就可以完成。在這個(gè)過(guò)程中,如果你的機(jī)器還沒(méi)有啟用Hyper-V,安裝程序會(huì)自動(dòng)啟用。如果你的Windows 10本來(lái)就是一臺(tái)虛擬機(jī),那么根據(jù)你所使用的虛擬化工具的不同,可以啟動(dòng)虛擬化嵌套,也就是在虛擬機(jī)里面運(yùn)行虛擬機(jī)。
安裝好以后一定要記得要使用管理員權(quán)限啟動(dòng) Docker for Windows,否則 Docker for Windows 將無(wú)法與Hyper-V控制臺(tái)通訊,造成環(huán)境啟動(dòng)失敗。
Docker for Windows 啟動(dòng)成功后會(huì)彈出系統(tǒng)通知,
同時(shí)在Hyper-V 控制臺(tái)中可以看到一臺(tái)LinuxVM正在運(yùn)行。
以上過(guò)程可以看出,Docker for Windows的工作機(jī)制實(shí)際上是在 Hyper-V 中運(yùn)行了一臺(tái)運(yùn)行了Docker Daemon (駐守程序)的虛擬機(jī),并將Windows上運(yùn)行的Docker命令行工具指向了這臺(tái)虛擬機(jī)中的docker環(huán)境。而對(duì)于開(kāi)發(fā)者而言,我們只需要在Windows上運(yùn)行cmd或者powershell命令行,就可以使用同樣的docker 命令進(jìn)行操作了。
2. 安裝 Docker for Visual Studio 插件
Visual Studio 強(qiáng)大的開(kāi)發(fā)和調(diào)試能力對(duì)于提升效率有很大的幫助,為了能夠提供基于docker的開(kāi)發(fā)調(diào)試體驗(yàn),微軟提供了一個(gè) Docker Tools for Visual Studio 插件。
如果你還沒(méi)有安裝 Visual Studio 2015,可以在以下地址下載***的社區(qū)版,這個(gè)版本完全免費(fèi),同時(shí)也支持加載插件。
https://www.visualstudio.com/products/visual-studio-community-vs
(請(qǐng)關(guān)注公眾號(hào) devopshub,并在消息中輸入 d4dtools 獲取本文中所提到的工具)
安裝好以后,打開(kāi) Tools | Extensions and Update 菜單,輸入 docker 進(jìn)行搜索,就可以找到這個(gè)插件:
下載地址:
https://visualstudiogallery.msdn.microsoft.com/0f5b2caa-ea00-41c8-b8a2-058c7da0b3e4
(請(qǐng)關(guān)注公眾號(hào) devopshub,并在消息中輸入 d4dtools 獲取本文中所提到的工具)
3. 準(zhǔn)備 .NET Core 環(huán)境
首先,進(jìn)入 .NET Core 的 Windows 環(huán)境主頁(yè) ,按照要求下載和安裝 .NET Core 1.0 for Visual Studio,下載地址如下
https://go.microsoft.com/fwlink/?LinkId=817245
安裝后就可以在Visual Studio 中創(chuàng)建.NET Core 應(yīng)用了。
4. 在 Visual Studio 2015 中創(chuàng)建.NET Core Web App
點(diǎn)擊 File | New | Project …,打開(kāi)項(xiàng)目創(chuàng)建引導(dǎo),并選擇 ASP.NET Core Web Application (.NET Core) 項(xiàng)目類(lèi)型
在模板頁(yè)中選擇 Web Application 模版,并點(diǎn)擊OK,進(jìn)行創(chuàng)建
創(chuàng)建完成后 Visual Studio 會(huì)自動(dòng)運(yùn)行dotnet restore命令恢復(fù)項(xiàng)目依賴(lài),等待這一過(guò)程完成,然后按F5測(cè)試一下,正常情況下你可以看到以下初始的網(wǎng)站狀態(tài)。
5. 啟用 Docker Support,并使用Docker環(huán)境進(jìn)行調(diào)試
在項(xiàng)目節(jié)點(diǎn)上右鍵單擊,并選擇 Add | Docker Support
這時(shí),你項(xiàng)目里面會(huì)多出以下2部分內(nèi)容
(1)這里是對(duì)Visual Studio 進(jìn)行配置,確保 Visual Studio 的工具鏈會(huì)正確與 docker 環(huán)境集成
(2)這里是對(duì)Docker自己的環(huán)境配置,包括 Dockerfile 和 Docker Compose file (這部分的具體內(nèi)容在后續(xù)的文章中給大家介紹),另外還有一個(gè) DockerTask.ps1。
DockerTask.ps1 是一個(gè) powershell 腳本,Visual Studio 和 Docker 的交互其實(shí)都是通過(guò)這個(gè)腳本來(lái)完成的,這里貼出這個(gè)腳本的參數(shù)部分,你會(huì)看到腳本中對(duì)常用的docker命令又進(jìn)行了一層封裝,讓docker可以更好的配合Visual Studio的工具鏈調(diào)用。這個(gè)腳本非常有用,特別是在沒(méi)有 Visual Studio 的情況下,你完全可以借助這個(gè)腳本手動(dòng)完成工具鏈的構(gòu)建。
現(xiàn)在,你會(huì)發(fā)現(xiàn)在 Visual Studio的運(yùn)行狀態(tài)欄中多了一個(gè) Docker 的選項(xiàng),意味著我們可以直接點(diǎn)擊這個(gè)按鈕或者F5,就可以將應(yīng)用部署到本地的 Docker for Windows 環(huán)境,并開(kāi)始調(diào)試了。
運(yùn)行起來(lái)的效果如下
你可以看到我在Controller里面添加了一行代碼來(lái)獲取本地的機(jī)器名,在容器里面獲取到的就是這個(gè)容器的id,同時(shí)在這里還可以設(shè)置斷點(diǎn);在docker中運(yùn)行的應(yīng)用會(huì)中斷,你可以像調(diào)試一個(gè)普通的ASP.NET應(yīng)用一樣來(lái)調(diào)試這個(gè)運(yùn)行在Docker中的應(yīng)用。
【本文為51CTO專(zhuān)欄作者“徐磊”的原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)通過(guò)作者微信公眾號(hào)devopshub獲取授權(quán)】