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