跨平臺運行ASP.NET Core 1.0

前言
首先提一下微軟改名後的叫法:
  • 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爲例。
 
1、在Docker中運行

一、環境html

這裏演示的Docker宿主機環境是CentOS7,下面介紹Docker在CentOS7上的安裝。在其餘系統中安裝Docker,請查看Install Docker Engine
提示:CentOS在7中已經啓用firewalld做爲新的防火牆,替換掉原先的iptables。而Docker對firewalld的兼容性雖然不太好,但對下面的例子運行中暫時沒發現有影響。
 

二、安裝dockermysql

首先查看CentOS的內核版本(CentOS7系統必須爲64位,內核必須3.10及以上)react

uname -r
3.10.0-229.el7.x86_64

更新已經安裝的包linux

sudo yum update  

安裝dockergit

curl -fsSL https://get.docker.com/ | sh

啓動dockergithub

sudo service docker start 或 systemctl start docker

運行docker hello world demoweb

sudo docker run hello-world

 

三、建立docker用戶組sql

此用戶組具有管理員權限,之後執行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

 

四、 docker相關概念docker

container:容器,用來加載各類image,能夠當作操做系統。加載各類app。容許多個容器同時運行,而且容器通常沒法相互訪問宿主服務器資源,除非掛載數據卷volume之類的,數據卷的使用能夠參照:http://my.oschina.net/guol/blog/271225)。容器中能夠運行一些網絡應用,要讓外部也能夠訪問這些應用,能夠經過 -P 或 -p 參數來指定端口映射。
 
image:鏡像文件,能夠當成app運行在container中,image有一個Dockerfile文件,保存摺生成自身image時要執行的命令。

docker images //顯示全部鏡像文件
docker ps -q -a //顯示全部容器
docker run -it --name dn_container -d -p 5000:5000  microsoft/dotnet:latest //新增一個容器用於加載 microsoft/dotnet:latest鏡像文件,-p host port:container port
docker run -it --name dn_container -d -p 127.0.0.1:5000:5000  microsoft/dotnet:latest
docker start dn_container //啓動容器
docker attach dn_container //關聯並進入啓動容器,須要先啓動容器
docker stop dn_container //中止容器
docker kill $(docker ps -a -q) //強制中止全部容器
docker rm $(docker ps -a -q) //刪除全部容器
doker commit ContainerID NewImageName //將容器裏的內容提交爲新的鏡像文件
docker rmi -f 7d9495d03763 //刪除全部容器

//標記鏡像,push到Docker Hub
docker images
docker tag a66b7258f574 sobit17/sobit-dotnet:1.0.0-beta-002252
docker images
docker login --username=test --email=test@qq.com
docker push sobit17/sobit-dotnet
docker經常使用命令

 

五、製做HelloMvc imagecanvas

在運行cli-samples的HelloMvc例子前,須要把HelloMvc打包成docker image文件。
5.1 首先安裝git,克隆cli-samples下來
mkdir app
cd app
git clone https://github.com/aspnet/cli-samples.git
cd 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下載不到。
//拷貝命令
cp -p  /root/app/cli-samples/NuGet.Config  /root/app/cli-samples/HelloMvc/NuGet.Config  

 
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 <Dockerfile關鍵字> ONBUILD指定的命令在構建鏡像時並不執行,而是在它的子鏡像中執行)
 
 
因此HelloMvc的Dockerfile能夠有兩種寫法,各選其一
(1) 基於dotnet:0.0.1-alpha
FROM microsoft/dotnet:latest
RUN mkdir -p /webapp
COPY . /webapp
WORKDIR /webapp
RUN ["dotnet", "restore"]

RUN sudo apt-get -y update \
    && sudo apt-get install -y dialog make automake libtool curl 
 RUN curl -sSL https://github.com/libuv/libuv/archive/v1.8.0.tar.gz | sudo tar zxfv - -C /usr/local/src \
     && cd /usr/local/src/libuv-1.8.0 \
     && sudo sh autogen.sh \
    && sudo ./configure \
     && sudo make \
     && sudo make install \
     && sudo rm -rf /usr/local/src/libuv-1.8.0 \
     && cd ~/ \
     && sudo ldconfig
 
 EXPOSE 5600
 ENTRYPOINT ["dotnet", "run"]

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

FROM microsoft/dotnet:0.0.1-alpha-onbuild
 
RUN sudo apt-get -y update \
    && sudo apt-get install -y dialog make automake libtool curl 
RUN curl -sSL https://github.com/libuv/libuv/archive/v1.8.0.tar.gz | sudo tar zxfv - -C /usr/local/src \
    && cd /usr/local/src/libuv-1.8.0 \
    && sudo sh autogen.sh \
    && sudo ./configure \
    && sudo make \
    && sudo make install \
    && sudo rm -rf /usr/local/src/libuv-1.8.0 \
    && cd ~/ \
    && sudo ldconfig
 
 EXPOSE 5600

 

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內部環境中
mkdir test
cd test
it clone https://github.com/aspnet/cli-samples.git
cd cli-samples
dotnet restore

查看是否報錯

 

清除測試文件
cd ~rm -r test

 

(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
docker run --name dotnet_container -it microsoft/dotnet:0.0.1-alpha 


若是dotnet_container 未啓動,則執行下面命令啓動並關聯進入

docker start dotnet_container 
dokcer attach dotnet_container 

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

dotnet --version
或
dotnet --info

 


因爲對應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
apt-get update
wget https://dotnetcli.blob.core.windows.net/dotnet/beta/Binaries/Latest/dotnet-dev-ubuntu-x64.latest.tar.gz
tar -zxf dotnet-dev-ubuntu-x64.latest.tar.gz -C /usr/bin 

apt-get update
wget https://dotnetcli.blob.core.windows.net/dotnet/beta/Binaries/Latest/dotnet-dev-ubuntu-x64.latest.tar.gz
tar -zxf dotnet-dev-ubuntu-x64.latest.tar.gz
ln -s /dn_new/dotnet /usr/bin/dotnet

接下來執行下面命令

dotnet --info //查看版本
exit //退出容器
docker images //查找dotnet_container 的ConrainerID
docker commit 3a09b2588478(ContainerID) dotnet_new(new image name) //commit成一個新的image 

至此base image製做完畢。

接下來只要修改HelloMvc的Dockerfile以指定這個新的image做爲基礎鏡像
 
FROM dotnet_new 或 sobit17/sobit-dotnet:1.0.0-beta-002252
RUN mkdir -p /webapp
COPY . /webapp
WORKDIR /webapp
RUN ["dotnet", "restore"]

##備註:安裝libuv這一過程其實能夠在製做dotnet_new鏡像時也安裝進去,就不須要下面這段【註釋在Dockerfile中需刪掉】
RUN sudo apt-get -y update \
    && sudo apt-get install -y dialog make automake libtool curl 
RUN curl -sSL https://github.com/libuv/libuv/archive/v1.8.0.tar.gz | sudo tar zxfv - -C /usr/local/src \
    && cd /usr/local/src/libuv-1.8.0 \
    && sudo sh autogen.sh \
    && sudo ./configure \
    && sudo make \
    && sudo make install \
    && sudo rm -rf /usr/local/src/libuv-1.8.0 \
    && cd ~/ \
    && sudo ldconfig

EXPOSE 5600
ENTRYPOINT ["dotnet", "run"]

 全部把HelloMvc製做成image的資料已經準備完畢。

 
5.2.4 製做 HelloMvc image,當前目錄移動到HelloMvc中,執行下面命令(製做過程當中可能會由於網絡問題報錯,能夠重複執行下面這個命令直到成功就能夠了)
docker build -t hellomvc-image . //記得命令最後有'.'

 


六、編譯運行HelloMvc
  • 編譯試運行:docker run --rm -w /webapp hellomvc-image
  • 運行:docker run -t --name web_container -d -p 5100:5600  hellomvc-image
 
打開瀏覽器 http://IP:5100 (防火牆和查看網絡相關命令請查看本篇文章第四點)
    
2、在CentOS 7中運行

一、環境

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

二、安裝.NET Core SDK

 
   
sudo yum updatemkdir dn_cli
cd dn_cli
wget https://dotnetcli.blob.core.windows.net/dotnet/beta/Binaries/Latest/dotnet-dev-centos-x64.latest.tar.gz
tar -zxf dotnet-dev-centos-x64.latest.tar.gz 
 

嘗試執行命令:. /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例子

 

cd ~
sudo yum -y install git mkdir app cd app git clone https://github.com/aspnet/cli-samples.git cd cli-samples dotnet restore cd HelloMvc

 須要顯式指定HelloMvc的端口(即便指定的是5000端口),目前嘗試過不加下面這段代碼,發現默認的5000並不起做用

 

四、編譯運行HelloMvc

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

 
  
dotnet run


打開瀏覽器 http://IP:5600防火牆和查看網絡相關命令請查看本篇文章第四點

3、在Ubuntu 14.04中運行
 

一、安裝Ubuntu Installers

 
  
apt-get update
mkdir
dn_cli cd dn_cli wget https://dotnetcli.blob.core.windows.net/dotnet/beta/Installers/Latest/dotnet-host-ubuntu-x64.latest.deb wget https://dotnetcli.blob.core.windows.net/dotnet/beta/Installers/Latest/dotnet-sharedframework-ubuntu-x64.latest.deb wget https://dotnetcli.blob.core.windows.net/dotnet/beta/Installers/Latest/dotnet-sdk-ubuntu-x64.latest.deb //安裝 dpkg -i dotnet-host-ubuntu-x64.latest.deb dpkg -i dotnet-sharedframework-ubuntu-x64.latest.deb dpkg -i dotnet-sdk-ubuntu-x64.latest.deb

//若是執行上述安裝語句後提示缺乏依賴包,能夠執行下面命令會自動補全依賴包,而後再從新執行報錯的安裝語句
apt-get -f install

2、下載cli-samples的HelloMvc例子
 
  
cd ~
apt-get -y install git mkdir app cd app git clone https://github.com/aspnet/cli-samples.git cd cli-samples dotnet restore cd HelloMvc
 
  

須要顯式指定HelloMvc的端口(即便指定的是5000端口),目前嘗試過不加下面這段代碼,發現默認的5000並不起做用



三、編譯運行HelloMvc
 
    
dotnet run
打開瀏覽器 http://IP:5600防火牆和查看網絡相關命令請查看本篇文章第四點
 


4、其餘
一、開啓、禁用firewalld等相關命令(iptables、docker相同)
systemctl status firewalld或firewalld.service  ##查看firewalld是否啓動。active(running)表明啓動
systemctl start firewalld  ##若是firewalld沒啓動,可使用此命令啓動
systemctl enable firewalld  ##設置爲隨機器啓動
systemctl stop firewalld  ##關閉firewalld
systemctl disable firewalld ##清除隨機器啓動
systemctl restart firewalld ##重啓firewalld
View Code

 

二、防火牆firewalld經常使用命令
firewall-cmd --state           ##查看防火牆狀態,是不是running
firewall-cmd --list-all         ##查看全部規則
firewall-cmd --reload         ##從新載入配置,好比添加規則以後,須要執行此命令
firewall-cmd --get-zones   ##列出支持的zone
firewall-cmd --get-services##列出支持的服務,在列表中的服務是放行的
firewall-cmd --query-service ftp##查看ftp服務是否支持,返回yes或者no
firewall-cmd --add-service=ftp  ##臨時開放ftp服務
firewall-cmd --add-service=ftp --permanent##永久開放ftp服務
firewall-cmd --add-service=http --permanent##永久開放http服務
firewall-cmd --remove-service=ftp --permanent##永久移除ftp服務
firewall-cmd --add-port=80/tcp --permanent  ##永久添加80端口  
firewall-cmd --zone=public --add-port=80/tcp --permanent   ##--zone #做用域
View Code

 

三、防火牆iptables經常使用命令
iptables -L -n  --line-number     #查看防火牆的規則鏈
iptables -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 
iptables -I INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT
iptables -I INPUT -d 172.16.100.1 -p tcp --dport 22 -m state --state NEW -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT              #測試不加此條會致使mysql在內部沒法鏈接

查看/etc/sysconfig/iptables文件(記錄着防火牆的規則鏈)
若是沒有這個文件,請執行下面命令保存
iptables-save > /etc/sysconfig/iptables
查看保存後的規則
cat /etc/sysconfig/iptables
View Code

 

四、部分網絡端口查詢命令

netstat -tunlp -a # 查看全部網絡端口狀況
netstat -l -n  #查看監聽(Listen)的端口,-n 表明顯示端口數字而不是名稱
netstat -antp #查看全部創建的TCP鏈接
View Code

 


相關資料:

 

 

做者:B.it

技術收錄網站:核心技術(http://www.coretn.cn)
出處:http://www.cnblogs.com/ImBit/p/5375577.html
本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接。

相關文章
相關標籤/搜索