跨平台运行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为例。
一、在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、部分网络端口查询命令

相关资料:

1 收藏 评论

相关文章

可能感兴趣的话题



直接登录
跳到底部
返回顶部