跨平臺執行ASP.NET Core 1.0

發表於2016-05-27
前言
首先提一下微軟更名後的叫法:
  • ASP.NET 5 更名為 ASP.NET Core 1.0
  • .NET Core 更名為 .NET Core 1.0
  • Entity Framework 7 更名為 Entity Framework Core 1.0 或者簡稱 EF Core 1.0

現在伴隨著ASP.NET Core 1.0 RC2版的更新速度,許多官方文件都跟不上,還停留在RC1版的使用方式上(RC1版是繼Beta版之後第一個釋出的穩定版本)。RC1和RC2的區別在於RC1版使用dnvm、dnx來restore packages和run(dnu是包含在dnx中的),而RC2版會基於.NET Core CLI,使用dotnet命令來進行building,compiling, NuGet package management, running, testing。

如果想了解更多ASP.NET Core 1.0 的釋出進度和里程碑可以檢視:ASP.NET Core 1.0 Schedule and Roadmap。就目前而言,在某些系統中我們已經可以遺棄mono,只使用.NET Core 和.NET Core CLI 就可以提供對.Net程式進行生成編譯執行環境(同時包含.NET Core 和.NET Core CLI的.NET Core SDK二進位制包,可以在這裡下載)。

至於mono的未來,微軟的SocttHunter和Scott Hasnselman說到:切換到MIT開源許可協議的mono將作為公司未來構建一個統一.NET庫的計劃中的一部分,瞭解詳情。可見開源的mono會逐步融入.NET Core體系中。

本文章主要介紹ASP.NET Core 1.0  RC2版的跨平臺部署,(【部署環境】作為第一步,有助於理解程式的執行環境和機理)。如果想了解跨平臺部署RC1版,請檢視

下面會分別介紹在Dokcer、CentOS、Ubuntu環境中的部署方式,Windows比較簡單,就不作介紹。執行的ASP.NET Core程式以cli-samples的HelloMvc為例。
一、在Docker中執行

1、環境

這裡演示的Docker宿主機環境是CentOS7,下面介紹Docker在CentOS7上的安裝。在其他系統中安裝Docker,請檢視Install Docker Engine
提示:CentOS在7中已經啟用firewalld作為新的防火牆,替換掉原先的iptables。而Docker對firewalld的相容性雖然不太好,但對下面的例子執行中暫時沒發現有影響。
731719-20160415160208910-2081263879

2、安裝docker

首先檢視CentOS的核心版本(CentOS7系統必須為64位,核心必須3.10及以上)

更新已經安裝的包

安裝docker

啟動docker

執行docker hello world demo

3、建立docker使用者組

此使用者組具備管理員許可權,以後執行docker命令可以不加sudo(這裡只做演示,直接使用root)
(1) 以帶有管理員許可權的使用者登入控制檯
(2) sudo usermod -aG docker your_username(你的使用者名稱)
(3) 登出再登入控制檯
(4) 不帶sudo執行docker run hello-world,看是否正確輸出Hello world
(5) 設定開機啟動sudo chkconfig docker on 或 systemctl enable docker

4、 docker相關概念

container:容器,用來載入各種image,可以看成作業系統。載入各種app。允許多個容器同時執行,並且容器一般無法相互訪問宿主伺服器資源,除非掛載資料卷volume之類的,資料卷的使用可以參照:http://my.oschina.net/guol/blog/271225)。容器中可以執行一些網路應用,要讓外部也可以訪問這些應用,可以通過 -P 或 -p 引數來指定埠對映。
image:映象檔案,可以當成app執行在container中,image有一個Dockerfile檔案,儲存摺生成自身image時要執行的命令。

5、製作HelloMvc image

在執行cli-samples的HelloMvc例子前,需要把HelloMvc打包成docker image檔案。
5.1 首先安裝git,克隆cli-samples下來

需要顯式指定HelloMvc的埠(即使指定的是5000埠),目前嘗試過不加下面這段程式碼,發現預設的5000並不起作用

5.2 在HelloMvc的當前目錄執行,並備好NuGet.config和Dockerfile檔案
NuGet.config:讀取package下載的源地址(nuget seeds);
Dockerfile:製作image必須;
5.2.1建立NuGet.config檔案
可以從上級目錄cli-samples中拷貝一個NuGet.config到HelloMvc目錄中,如果沒有這個NuGet.config 在還原package時會預設到.nuget/NuGet/載入NuGet.config。因為源不對,會導致某些packeage下載不到。

5.2.2建立Dockerfile檔案
在建立image時,.NET CLI Preview Docker Image提供了兩個基礎dotnet image用於繼承(裡面裝載的其實是部署了.NET Core的Ubuntu系統),區別在於它們的Dockerfile不同
  • dotnet:0.0.1-alpha
  • dotnet:0.0.1-alpha-onbuild
dotnet:0.0.1-alpha的Dockerfile,基於buildpack-deps:trusty-scm
 
 dotnet:0.0.1-alpha-onbuild基於dotnet:0.0.1-alpha,(ONBUILD  ONBUILD指定的命令在構建映象時並不執行,而是在它的子映象中執行)
 
所以HelloMvc的Dockerfile可以有兩種寫法,各選其一
(1) 基於dotnet:0.0.1-alpha

(2)基於dotnet:0.0.1-alpha-onbuild

5.2.3 檢測Dockerfile是否能正常使用
由於.NET Core時刻在更新,所以導致官網NET CLI Preview Docker image 提供的dotnet image更新不及時而在執行dotnet restore時候會報錯:unknown keyword platform(主要是dotnet image內部的
.NET Core和CLI版本過舊,且存在bug),會導致基於它的我們們的Dockefile執行失敗。 如果不確定你當前的dotnet image是否有上述問題,下面會介紹一種檢測方法和問題的解決方案
(1)檢測方法
執行下面命令載入dotnet image,且一般會自動啟動test_container並進入到image內部環境中,如果你伺服器上沒有dotnet image,下面命令也會自動下載
docker run –name test_container -it microsoft/dotnet:latest
如果test_container未啟動,則執行下面命令啟動並關聯進入
docker start test_container
dokcer attach test_container
進入到image內部環境中

檢視是否報錯

清除測試檔案

(2)解決方案

手工製作一個使用最新.NET Core SDK的dotnet image,也可以使用我已經做好的image   sobit17/sobit-dotnet:1.0.0-beta-002252,當然如果沒報錯可以省略這一步,用回原來的dotnet image.
製作新的image這裡選用dotnet:0.0.1-alpha為原型,也可以使用dotnet:0.0.1-alpha-onbuild
載入dotnet image
如果dotnet_container 未啟動,則執行下面命令啟動並關聯進入

檢視.NET Core版本(dotnet image中使用的是Ubuntu14.04系統)

由於對應Ubuntu的dotnet package最高只到1.0.0-beta-00.1793,但這個版本也有上述bug。(查詢可以使用apt-cache search XX|grep XX(XX為你知道的一部份軟體名),也可以從這裡檢視http://apt-mo.trafficmanager.net/repos/dotnet/pool/main/d/dotnet/
所以不能利用
apt-get upgrade  dotnet
apt-get remove dotnet  = 1.0.0.001598-1
apt-get install dotnet=1.0.0.002252-1(Ubuntu沒這個最新版本)
只能從github下載二進位制檔案,安裝到最新版本(最新版本可以從github上面查到:https://github.com/dotnet/cli#installers-and-binaries

接下來執行下面命令

至此base image製作完畢。

接下來只要修改HelloMvc的Dockerfile以指定這個新的image作為基礎映象

所有把HelloMvc製作成image的資料已經準備完畢。

5.2.4 製作 HelloMvc image,當前目錄移動到HelloMvc中,執行下面命令(製作過程中可能會因為網路問題報錯,可以重複執行下面這個命令直到成功就可以了)
6、編譯執行HelloMvc
  • 編譯試執行:docker run –rm -w /webapp hellomvc-image
  • 執行:docker run -t –name web_container -d -p 5100:5600  hellomvc-image
開啟瀏覽器 http://IP:5100 (防火牆和檢視網路相關命令請檢視本篇文章第四點
    
二、在CentOS 7中執行

1、環境

這裡演示的環境是CentOS7,64bit

2、安裝.NET Core SDK

嘗試執行命令:. /dotnet

提示錯誤:

Failed to load /root/dotnet/bin/libcoreclr.so, error: libunwind.so.8: cannot open shared object file: No such file or directory

解決方法:

yum install -y libunwind

嘗試執行命令:. /dotnet

提示錯誤:

Failed to initialize CoreCLR, HRESULT: 0x80131500

解決方法:

yum install -y icu

嘗試執行命令:. /dotnet –info,正常。
永久儲存環境變數

找到/etc/profile檔案(當使用者第一次登入時,該檔案被執行.),在最後面新增:

PATH=~/dn_cli:$PATH
export PATH
即時生效
source /etc/profile

3、下載cli-samples的HelloMvc例子

需要顯式指定HelloMvc的埠(即使指定的是5000埠),目前嘗試過不加下面這段程式碼,發現預設的5000並不起作用

731719-20160415155016629-1056578589

4、編譯執行HelloMvc

將執行命令的當前目錄定位到HelloMvc,並執行下面命令

開啟瀏覽器 http://IP:5600(防火牆和檢視網路相關命令請檢視本篇文章第四點
731719-20160415154836879-1536445895
三、在Ubuntu 14.04中執行 

1、安裝Ubuntu Installers

2、下載cli-samples的HelloMvc例子

需要顯式指定HelloMvc的埠(即使指定的是5000埠),目前嘗試過不加下面這段程式碼,發現預設的5000並不起作用

731719-20160415155421988-960951010

3、編譯執行HelloMvc

開啟瀏覽器 http://IP:5600(防火牆和檢視網路相關命令請檢視本篇文章第四點

 

四、其他

1、開啟、禁用firewalld等相關命令(iptables、docker相同)
2、防火牆firewalld常用命令
3、防火牆iptables常用命令

4、部分網路埠查詢命令

相關資料:

相關文章