跨平臺運行ASP.NET Core 1.0

来源:http://www.cnblogs.com/ImBit/archive/2016/04/15/5375577.html
-Advertisement-
Play Games

前言 首先提一下微軟更名後的叫法: 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 現在伴隨著AS ...


前言 首先提一下微軟更名後的叫法:
  • 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的相容性雖然不太好,但對下麵的例子運行中暫時沒發現有影響。
 

2、安裝docker

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

uname -r
3.10.0-229.el7.x86_64

更新已經安裝的包

sudo yum update  

安裝docker

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

啟動docker

sudo service docker start 或 systemctl start docker

運行docker hello world demo

sudo docker run hello-world

 

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時要執行的命令。 如果是docker run 運行一個容器, 沒有加 -d 參數讓它後臺運行, 這時候 ctrl+c 退出進程也會讓容器停止, 如果先退出但不停止容器可以ctrl+p 然後 ctrl+q。
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=[email protected]
docker push sobit17/sobit-dotnet
docker常用命令

 

5、製作HelloMvc image

在運行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
# git 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 . //記得命令最後有'.'

 


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



sudo yum -y install git
mkdir 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 ~
mkdir app
cd app
git clone https://github.com/aspnet/cli-samples.git
cd cli-samples
dotnet restore
cd HelloMvc

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

 

4、編譯運行HelloMvc

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



dotnet run


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

三、在Ubuntu 14.04中運行  

1、安裝Ubuntu Installers



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 d

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 所謂 LAMP,指的是:Linux+Apache+Mysql+Php (轉載http://www.cnblogs.com/zhj5chengfeng/p/3369460.html) 僅以此文做一個備忘錄 Step1. 安裝 Apache 1. 在 terminal 中輸入一下命令並執行: sudo ...
  • 1.改網卡名 先vim /etc/sysconfig/grub:GRUB_TIMEOUT=5GRUB_DEFAULT=savedGRUB_DISABLE_SUBMENU=trueGRUB_TERMINAL_OUTPUT="console"GRUB_CMDLINE_LINUX="crashkernel ...
  • 由於項目需要,我需要給系統加許可權,這真是一個讓人頭疼的問題,如果要每個業務方法都加上許可權判斷邏輯,那真的不敢想象是多麼大的工作量,日後有變動的話,我會不會發瘋? 所以我必須利用之前學到的AOP編程,在需要進行許可權判斷的業務方法前後執行一些許可權判斷,可是呢AOP已經被我忘記了。 幸好,百度網盤裡有之前... ...
  • 文件夾中使用常見任務,如截圖所示增加紅色框部分。 設置步驟: 我的電腦--〉右鍵--〉屬性--〉高級選項--〉性能設置--〉自定義:勾選在文件夾中使用常見任務。 ...
  • 1.馮諾依曼體繫結構(存儲程式電腦) 1.1 解釋 從硬體角度可以抽象為一下模型: 從硬體角度可以抽象為一下模型: CPU與記憶體通過匯流排連接,CPU中有很多寄存器(總是指向記憶體的某一塊區域),如IP(Instruction Pointer)。假如指向CS(Code Segment,代碼段),CPU ...
  • winform combobox控制項綁定datatable並實現實現模糊查詢,顯示下拉列表,網上太多案例,都不是我所需要的,研究了一下 不用Dev 也能實現不錯的效果。 廢話不多直接代碼加圖片 先看效果圖 NO1. combobox 綁定數據源 NO2.ComboBox添加TextUpdate事件 ...
  • 前言: 最近在做中國移動爬蟲的過程中,首先遇到的就是 在某個請求中,有一個名為“WT_PFC"的cookie鍵值是由前端JavaScript生成的,沒有進入到HttpWebResponse中,也就是說C#不回去執行客戶端腳本 ,HttpWebRequest不是一個真正意義上的web瀏覽器,它只會下載 ...
  • Silverlight網站部署後,客戶端瀏覽器訪問的時候會 下載 網站的xap文件包等信息,把程式代碼放到本地執行,因為本地機器上安裝了silverlight運行庫。 所以如果silverlight前端後臺代碼裡面 如果有HttpWeRequest這樣的請求的話,網站部署後,會以客戶端的ip去請求第 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...