做爲一名.NET Developer,這幾年看着docker的流行實在是有些眼饞。惋惜的是,Docker是基於Linux環境的,眼瞧着那些 java, python, node.js, go 甚至連php程序員均可以docker了,本身還在苦哈哈的裝虛擬機,實在是急啊!因此對於.NET Core的發展格外關注,由於它的跨平臺,意味着.NET Developer也能夠docker了。php
前世此生
.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操做系統的支持,同時與開源社區的合做也在逐步加深。html
– 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,標誌着微軟這一跨平臺開發工具的正式發佈。java
爲何是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億。node
爲何小編對docker如此垂涎,此話要從「修電腦」提及。做爲一名程序員,誰沒有修過電腦,誰沒有被叫去修過電腦,誰沒有被認爲很會修電腦 … … 但是,你有想過爲啥咱們這樣擅長修電腦麼?難道真的是由於泡妹子麼?那都是副產品好麼!!!python
故事 … … 一個月前接了一個項目,用的是XXX技術,搭建好了環境,熱火朝天干了一個月;今天項目經理說這裏還有另外項目的一些小問題須要處理,你來看看吧,用不了多少時間。結果你發現這個項目用的是YYY的技術,搭建環境就化了你半天時間,這時候項目經理電話來了:「爲啥還沒搞完?啥,環境還沒搞好,算了,你別搞了,我找別人!「。好吧,苦逼的你回去繼續原來的項目,發現XXX環境的變量被YYY搞亂了,改了好久也搞很差 … … 結果就是:從!裝!電!腦!git
程序員就這樣變成裝機高手!再後來的程序員開始使用虛擬機,把開發環境放到虛擬機中,這樣就不用擔憂不一樣環境之間互相沖突,不過虛擬機動輒幾十個G的硬盤佔用和巨大的CPU和內存開銷讓電腦變得慢吞吞的,原本i7的機器只能享受到i3的性能,太浪費了。程序員
這就是爲啥docker成爲了全球程序員的福音:github
– 沒必要擔憂新接手的項目環境搭建複雜;
– 沒必要擔憂同時開發2個環境互相沖突的項目;
– 不會再佔用大量的內存和硬盤,環境啓動迅速,啓動一個容器只須要幾秒鐘,而虛擬機須要幾分鐘;就算是8G內存也能夠同時跑多個容器,而虛擬機能跑2個就不錯了;
– 直接把作好的應用丟給測試,測試沒必要本身再重新搭建環境,要恢復乾淨的測試環境也只是一個命令而已;
– 直接把測試好的應用丟給運維去部署,不用去和運維撕扯 jdk 1.8仍是1.7
– 環境壞掉了,換個新的,不用費勁去看log,恢復這恢復那
– 不用擔憂你旁邊的程序員用了不一樣版本的jdk,他的環境就是你的環境,哪怕你用的本本上是win7,他在用高大上的macbook prodocker
這不是程序員的天堂麼? 這就是docker帶給咱們的,這就是爲啥程序員們急不可耐的開始使用docker,並且願意衝破阻力讓運維去接受docker,這種事情在歷史上好像沒有出現過;歷來都是運維要求開發使用標準化環境的。shell
其實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研發運維一體化的信息