作為一名.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 應用的建立和除錯。
你可以通過這段5分鐘的視訊瞭解以下執行效果,如果需要了解詳細步驟,請看下面的說明:
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/
在這篇文章裡面我使用的是 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
安裝好以後,開啟 Tools | Extensions and Update 選單,輸入 docker 進行搜尋,就可以找到這個外掛:
外掛下載地址:
https://visualstudiogallery.msdn.microsoft.com/0f5b2caa-ea00-41c8-b8a2-058c7da0b3e4
3. 準備 .NET Core 環境
首先,進入 .NET Core 的 Windows 環境主頁 ,按照要求下載和安裝 .NET Core 1.0 for Visual Studio,下載地址如下
https://go.microsoft.com/fwlink/?LinkId=817245
安裝後就可以在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環境整合。
本文中所使用的工具有些需要FQ才能才能正常下載,小編將她們整理了一下放在雲盤上,供大家高速下載;需要的朋友請公眾號關注公眾號 devopshub ,並在訊息中輸入 d4dtools 獲取下載地址,謝謝!
請關注微信公眾號 【devopshub】,獲取更多關於DevOps研發運維一體化的資訊