设为首页 收藏本站
查看: 1321|回复: 0

[经验分享] 升级项目到.NET Core 2.0,在Linux上安装Docker,并成功部署

[复制链接]

尚未签到

发表于 2017-12-5 16:03:42 | 显示全部楼层 |阅读模式
概述
  容器,顾名思义是用来存放并容纳东西的器皿;
  而容器技术伴着Docker的兴起也渐渐的映入大家的眼帘,它是一个抽象的概念,同时也是默默存在世上多年的技术,不仅能使应用程序间完全的隔离,而且还能在共享底层系统资源的同时发挥它最大的优势。相比于虚拟机来说,同一服务器它可以创建出两倍的实例,这样一来,不仅节省了系统开销,而且利用率和性能也得到了提升,何乐而不为。最重要的一点是还帮助开发人员实现了“一次构建,到处运行”的理想!
   DSC0000.png
  那么Docker又是什么呢?


  •   Docker是基于Go语言开发并开源的容器引擎

  •   Docker将应用软件运行时所需的一切都打包成互相隔离的容器

  •   Docker可以自动执行并配置开发/线上环境,快速构建,测试和运行复杂的多容器应用程序

  •   对拥有数千个节点或容器的应用程序,Docker也能快速的扩展和调配

  •   可以运行在主流的Linux系统,Mac以及Windows上,并且保证无论软件在哪里部署,都能正常运行并得到相同的结果

  相关概念介绍


  •   Image镜像和Container容器:你可以把两者理解为类和实例对象,或者是ISO系统镜像和虚拟机的关系。不同的Image所包含的软件或者环境是不同的,但是你可以使用Dockerfile(docker特有语法规则所创建的文件)进行管理。而Container则是以Image作为模板,可以独立运行的微型系统,一个Image可以创建出来多个Container容器的实例

  •   Registry:Docker Hub镜像仓库,为每个人提供庞大的镜像资源进行拉取和使用

  •   Dockerfile:是一个将镜像命令组合在一起的文件,用于Image的自动构建


正文
  系统环境
  宿主机:Windows 10 专业版
  Linux服务器: Ubuntu 17.04 (GNU/Linux 4.10.0-28-generic x86_64),从16.10版本升级的,由Hyper-V管理
  软件环境
  开发工具:Visual Studio 2017 15.3(.NET Core 2.0)
  远程管理工具:Putty,基于SSH,操作简单的远程命令控制,省得你把命令给敲错咯
  SFTP客户端:WinScp,处理Linux和Windows间的文件传输
  容器:Docker 17.06.0-CE

一、安装Docker
  a)、设置Docker仓库
  1、按惯例,首先更新Ubuntu的包索引



$ sudo apt-get update
  2、让服务器可以使用Https更新仓库




$ sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
  3、添加Docker官方的密钥对,如果没问题,会返回“OK”



$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  4、校验密钥(9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88)是否和官方一致



$ sudo apt-key fingerprint 0EBFCD88
   DSC0001.png
  5、设置官方稳定版的仓库来源



$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
  b)、安装Docker
  1、再次更新下包索引,因为刚才加了Docker仓库,确保是否命中了Docker源



$ sudo apt-get update
   DSC0002.png
  2、安装最新版本的Docker-CE社区版



$ sudo apt-get install docker-ce
  3、需要安装其他版本的请使用以下命令



$ sudo apt-get install docker-ce=1.13
  4、查看是否安装成功



$ docker version
   DSC0003.png
  5、试着运行一个测试镜像,万能的Hello World!



$ sudo docker run hello-world
DSC0004.png

二、.NetCore的Docker配置
  准备工作:首先记录接下来可能会用到的几个常用命令



sudo docker pull microsoft/dotnet    //从docker仓库拉取一个名称为“microsoft/dotnet”的镜像
sudo docker build light    //构建一个名称为light的容器
sudo docker run hello-world    //运行hello-world容器
sudo docker images    //查看所有镜像
sudo docker rmi 63sf86332e    //删除一个imageid的镜像
sudo docker rmi $(docker images -q)    //删除所有镜像
sudo docker ps -a    //查看所有容器
sudo docker rm 6f0c67de4b72    //删除一个containerid的容器
sudo docker rm $(sudo docker ps -a -q)   //删除所有容器
  1、拉取dotnet-sdk的最新镜像,速度慢的话请自行搜索daocloud docker hub加速。



sudo docker pull microsoft/dotnet:latest
  完成之后查看一下镜像



sudo docker images
DSC0005.png

  2、进入到这个镜像,查看版本没问题后创建一个控制台程序,然后运行并查看结果



sudo docker run -it  microsoft/dotnet  //每次run,都会重新构造出新的互不影响的容器,请自行查看
dotnet --version
mkdir test
cd test
dotnet new
DSC0006.png




dotnet new console
dotnet run    //.NetCore2.0已经将dotnet restore变成了隐式命令,需要的时候会自动执行
DSC0007.png

  说明:使用Ctrl+D快捷键或者键入exit命令来退出命令

三、升级项目到.NetCore2.0,并发布
  1、分别修改类库和Web的项目文件,升级到.Net Core 2.0和.Net Standard 2.0,其中包括Nuget上的一些组件,或者直接通过右键项目->属性->目标框架进行修改,同时修改Program.cs和Startup.cs文件为2.0默认的方式,完成后他们的样子是酱紫的,是不是很简洁明了。
  类库的csproj项目文件:



<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>
</Project>
  Web的csproj项目文件



<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp2.0</TargetFramework>
<RuntimeIdentifiers>win10-x64;ubuntu.16.10-x64;ubuntu.16.04-x64</RuntimeIdentifiers>
   <AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.0" />
<PackageReference Include="Microsoft.AspNetCore.Session" Version="2.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.0.0" />
   <PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.ViewCompilation" Version="2.0.0" PrivateAssets="All" />
</ItemGroup>
<ItemGroup>
<DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Light.Common\Light.Common.csproj" />
<ProjectReference Include="..\Light.Model\Light.Model.csproj" />
</ItemGroup>
</Project>
  简洁的Program.cs



using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
namespace Light.Web
{
public class Program
{
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();
}
}
  下面是我的Startup文件的相关配置项


DSC0008.gif DSC0009.gif


using System;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Light.Web.DBContext;
using Microsoft.EntityFrameworkCore;
using Light.Web.Models;
namespace Light.Web
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<LightContext>(m =>
{
m.UseSqlServer(Configuration.GetConnectionString("LightContextConnection"));
});
services.AddSession(m =>
{
m.IdleTimeout = TimeSpan.FromHours(1);
});
services.AddMvc(m =>
{
m.Filters.Add(typeof(LightActionFilter));
m.Filters.Add(new LightExceptionFilter());
});
var serviceProvider = services.BuildServiceProvider();
var dbContext = serviceProvider.GetService<LightContext>();
LightContextSeed.SeedAsync(dbContext).Wait();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, IServiceProvider serviceProvider)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();
app.UseSession();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
}
}
View Code  微软官方的升级向导,供大家参考:https://docs.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/
  2、使用cli命令发布项目,这时可以不用指定运行时标识,直接发布,因为项目不是运行在服务器(Windows或Linux)上的。



dotnet publish -c Release -o ../Publish
DSC00010.png


四、使用Docker进行部署
  1、使用Winscp登陆到服务器上,并将发布之后的文件夹publish上传到服务器上
   DSC00011.png
DSC00012.png

  2、创建Dockerfile文件,并将其配置成以下内容



FROM microsoft/dotnet
WORKDIR /app
COPY ./publish .
ENTRYPOINT ["dotnet", "Light.Web.dll"]
  3、切换到Dockerfile所在的目录下,并执行构建命令,成功之后会有下图的提示



sudo docker build -t lightweb .  //注意后边还有一个点呢
DSC00013.png

  4、运行刚才构建成功,名字为lightweb的容器,直接绑定服务器的80端口



sudo docker run -p 80:80 -e "ASPNETCORE_URLS=http://+:80" lightweb
  运行成功之后是这样的(请暂时忽略Warning),表示该容器内的程序正在使用80端口监听着.......
   DSC00014.png
  5、试着用IP访问一下,不知道自己IP的请使用ifconfig命令进行查看
   DSC00015.png

最后
  在看到最后一张图的时候,其实自己心里还是挺激动的;虽然中间遇到一些差错,比如项目文件中的MvcRazorCompileOnPublish节点,发布成ubuntu时需要改成false,或者直接删掉,再者是图片的名称后缀是大写,但是我程序里边写的是小写,发布之后图片不显示,是因为Linux是严格区分大小写的。囧~另外提醒一下,发布到IIS上时,请及时更新AspNetCoreModule模块为最新的DotNetCore.2.0.0-WindowsHosting.exe。
  这里并没有介绍.NetCore2.0的相关知识,想了解的可以移步到张大队长的汇总:.NET Core 2.0 正式发布信息汇总
  相信.NetCore2.0的发布会给整个社区带来不一样的变化,需要学习和积累的技术也越来越多,还是那句老话:学无止境。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-420866-1-1.html 上篇帖子: Docker容器管理平台Humpback进阶 下篇帖子: Docker for windows on VMware
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表