蔡升荣 發表於 2017-8-18 00:53:00

升级项目到.NET Core 2.0,在Linux上安装Docker,并成功部署

<h1><span style="font-family: &quot;Microsoft YaHei&quot;">概述</span></h1>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">容器,顾名思义是用来存放并容纳东西的器皿;</span></p>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">而容器技术伴着Docker的兴起也渐渐的映入大家的眼帘,它是一个抽象的概念,同时也是默默存在世上多年的技术,不仅能使应用程序间完全的隔离,而且还能在共享底层系统资源的同时发挥它最大的优势。相比于虚拟机来说,同一服务器它可以创建出两倍的实例,这样一来,不仅节省了系统开销,而且利用率和性能也得到了提升,何乐而不为。最重要的一点是还帮助开发人员实现了“一次构建,到处运行”的理想!</span></p>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px"><img src="http://images2017.cnblogs.com/blog/646372/201708/646372-20170801215223552-562008011.png"></span></p>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">那么Docker又是什么呢?</span></p>
<ul>
<li>
<p style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">Docker是基于Go语言开发并开源的容器引擎</p>
</li>
<li>
<p style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">Docker将应用软件运行时所需的一切都打包成互相隔离的容器</p>
</li>
<li>
<p style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">Docker可以自动执行并配置开发/线上环境,快速构建,测试和运行复杂的多容器应用程序</p>
</li>
<li>
<p style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">对拥有数千个节点或容器的应用程序,Docker也能快速的扩展和调配</p>
</li>
<li>
<p style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">可以运行在主流的Linux系统,Mac以及Windows上,并且保证无论软件在哪里部署,都能正常运行并得到相同的结果</p>
</li>
</ul>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">相关概念介绍</span></p>
<ul>
<li>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">Image镜像和Container容器:你可以把两者理解为类和实例对象,或者是ISO系统镜像和虚拟机的关系。不同的Image所包含的软件或者环境是不同的,但是你可以使用Dockerfile(docker特有语法规则所创建的文件)进行管理。而Container则是以Image作为模板,可以独立运行的微型系统,一个Image可以创建出来多个Container容器的实例</span></p>
</li>
<li>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">Registry:Docker Hub镜像仓库,为每个人提供庞大的镜像资源进行拉取和使用</span></p>
</li>
<li>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">Dockerfile:是一个将镜像命令组合在一起的文件,用于Image的自动构建</span></p>
</li>
</ul>
<h1>正文</h1>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">系统环境</span></p>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">宿主机:Windows 10 专业版</span></p>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">Linux服务器:&nbsp;Ubuntu 17.04 (GNU/Linux 4.10.0-28-generic x86_64),从16.10版本升级的,由Hyper-V管理</span></p>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">软件环境</span></p>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">开发工具:Visual Studio 2017 15.3(.NET Core 2.0)</span></p>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">远程管理工具:Putty,基于SSH,操作简单的远程命令控制,省得你把命令给敲错咯</span></p>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">SFTP客户端:WinScp,处理Linux和Windows间的文件传输</span></p>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">容器:Docker 17.06.0-CE</span></p>
<h2><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">一、安装Docker</span></h2>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">a)、设置Docker仓库</span></p>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">1、按惯例,首先更新Ubuntu的包索引</span></p>
<div class="cnblogs_code">
<pre>$ <span style="color: rgba(0, 0, 255, 1)">sudo</span> apt-get update</pre>
</div>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">2、让服务器可以使用Https更新仓库<br></span></p>
<div class="cnblogs_code">
<pre>$ <span style="color: rgba(0, 0, 255, 1)">sudo</span> apt-get <span style="color: rgba(0, 0, 255, 1)">install</span> apt-transport-https ca-certificates curl software-properties-common</pre>
</div>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">3、添加Docker官方的密钥对,如果没问题,会返回“OK”</span></p>
<div class="cnblogs_code">
<pre>$ curl -fsSL https:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">download.docker.com/linux/ubuntu/gpg | sudo apt-key add -</span></pre>
</div>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">4、校验密钥(9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88)是否和官方一致</span></p>
<div class="cnblogs_code">
<pre>$ <span style="color: rgba(0, 0, 255, 1)">sudo</span> apt-key fingerprint 0EBFCD88</pre>
</div>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px"><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px"><img src="http://images2017.cnblogs.com/blog/646372/201708/646372-20170802190625787-451832095.png"></span></span></p>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px"><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">5、设置官方稳定版的仓库来源</span></span></p>
<div class="cnblogs_code">
<pre>$ <span style="color: rgba(0, 0, 255, 1)">sudo</span> add-apt-repository <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">deb https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable</span><span style="color: rgba(128, 0, 0, 1)">"</span></pre>
</div>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">b)、安装Docker</span></p>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">1、再次更新下包索引,因为刚才加了Docker仓库,确保是否命中了Docker源</span></p>
<div class="cnblogs_code">
<pre>$ <span style="color: rgba(0, 0, 255, 1)">sudo</span> apt-get update</pre>
</div>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px"><img src="http://images2017.cnblogs.com/blog/646372/201708/646372-20170802191345803-945922239.png"></span></p>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">2、安装最新版本的Docker-CE社区版</span></p>
<div class="cnblogs_code">
<pre>$ <span style="color: rgba(0, 0, 255, 1)">sudo</span> apt-get <span style="color: rgba(0, 0, 255, 1)">install</span> docker-ce</pre>
</div>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">3、需要安装其他版本的请使用以下命令</span></p>
<div class="cnblogs_code">
<pre>$ <span style="color: rgba(0, 0, 255, 1)">sudo</span> apt-get <span style="color: rgba(0, 0, 255, 1)">install</span> docker-ce=<span style="color: rgba(128, 0, 128, 1)">1.13</span></pre>
</div>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">4、查看是否安装成功</span></p>
<div class="cnblogs_code">
<pre>$ docker version</pre>
</div>
<p style="text-align: left"><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px"><img src="http://images2017.cnblogs.com/blog/646372/201708/646372-20170802192752881-1586170204.png"></span></p>
<p style="text-align: left"><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">5、试着运行一个测试镜像,万能的Hello World!</span></p>
<div class="cnblogs_code">
<pre>$ <span style="color: rgba(0, 0, 255, 1)">sudo</span> docker run hello-world</pre>
</div>
<h2><img src="http://images2017.cnblogs.com/blog/646372/201708/646372-20170802193204444-2067697968.png"></h2>
<h2>二、.NetCore的Docker配置</h2>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">准备工作:首先记录接下来可能会用到的几个常用命令</span></p>
<div class="cnblogs_code">
<pre>sudo docker pull microsoft/dotnet    //从docker仓库拉取一个名称为“microsoft/<span style="color: rgba(0, 0, 0, 1)">dotnet”的镜像

sudo docker build light    </span>//<span style="color: rgba(0, 0, 0, 1)">构建一个名称为light的容器

sudo docker run hello</span>-world    //运行hello-<span style="color: rgba(0, 0, 0, 1)">world容器

sudo docker images    </span>//<span style="color: rgba(0, 0, 0, 1)">查看所有镜像

sudo docker rmi 63sf86332e    </span>//<span style="color: rgba(0, 0, 0, 1)">删除一个imageid的镜像

sudo docker rmi </span>$(docker images -q)    //<span style="color: rgba(0, 0, 0, 1)">删除所有镜像

sudo docker ps </span>-a    //<span style="color: rgba(0, 0, 0, 1)">查看所有容器

sudo docker rm 6f0c67de4b72    </span>//<span style="color: rgba(0, 0, 0, 1)">删除一个containerid的容器

sudo docker rm </span>$(sudo docker ps -a -q)   //删除所有容器</pre>
</div>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">1、拉取dotnet-sdk的最新镜像,速度慢的话请自行搜索daocloud docker hub加速。</span></p>
<div class="cnblogs_code">
<pre>sudo docker pull microsoft/dotnet:latest</pre>
</div>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">完成之后查看一下镜像</span></p>
<div class="cnblogs_code">
<pre>sudo docker images</pre>
</div>
<p><img src="http://images2017.cnblogs.com/blog/646372/201708/646372-20170816235839396-1513901366.png"></p>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">2、进入到这个镜像,查看版本没问题后创建一个控制台程序,然后运行并查看结果</span></p>
<div class="cnblogs_code">
<pre>sudo docker run -itmicrosoft/<span style="color: rgba(0, 0, 0, 1)">dotnet  //每次run,都会重新构造出新的互不影响的容器,请自行查看

dotnet </span>--<span style="color: rgba(0, 0, 0, 1)">version

mkdir test

cd test

dotnet </span><span style="color: rgba(0, 0, 255, 1)">new</span></pre>
</div>
<p><img src="http://images2017.cnblogs.com/blog/646372/201708/646372-20170817224605178-1190012427.png"></p>
<div class="cnblogs_code">
<pre>dotnet <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> console

dotnet run    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">.NetCore2.0已经将dotnet restore变成了隐式命令,需要的时候会自动执行</span></pre>
</div>
<p><img src="http://images2017.cnblogs.com/blog/646372/201708/646372-20170817224928850-498770602.png"></p>
<p><span style="font-family: &quot;Microsoft YaHei&quot;"><span style="font-size: 18px">说明:使用Ctrl+D快捷键或者键入exit命令来退出命令</span></span></p>
<h2>三、升级项目到.NetCore2.0,并发布</h2>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">1、分别修改类库和Web的项目文件,升级到.Net Core 2.0和.Net Standard 2.0,其中包括Nuget上的一些组件,或者直接通过右键项目-&gt;属性-&gt;目标框架进行修改,同时修改Program.cs和Startup.cs文件为2.0默认的方式,完成后他们的样子是酱紫的,是不是很简洁明了。</span></p>
<p><span style="font-family: &quot;Microsoft YaHei&quot;"><span style="font-size: 18px">类库的csproj项目文件:</span></span></p>
<div class="cnblogs_code">
<pre>&lt;Project Sdk=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Microsoft.NET.Sdk</span><span style="color: rgba(128, 0, 0, 1)">"</span>&gt;
&lt;PropertyGroup&gt;
    &lt;TargetFramework&gt;netstandard2.<span style="color: rgba(128, 0, 128, 1)">0</span>&lt;/TargetFramework&gt;
&lt;/PropertyGroup&gt;
&lt;/Project&gt;</pre>
</div>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">Web的csproj项目文件</span></p>
<div class="cnblogs_code">
<pre>&lt;Project Sdk=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Microsoft.NET.Sdk.Web</span><span style="color: rgba(128, 0, 0, 1)">"</span>&gt;
&lt;PropertyGroup&gt;
    &lt;TargetFramework&gt;netcoreapp2.<span style="color: rgba(128, 0, 128, 1)">0</span>&lt;/TargetFramework&gt;
    &lt;RuntimeIdentifiers&gt;win10-x64;ubuntu.<span style="color: rgba(128, 0, 128, 1)">16.10</span>-x64;ubuntu.<span style="color: rgba(128, 0, 128, 1)">16.04</span>-x64&lt;/RuntimeIdentifiers&gt;<br>   <span class="hljs-tag">&lt;<span class="hljs-name">AssetTargetFallback&gt;$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;<span class="hljs-tag">&lt;/<span class="hljs-name">AssetTargetFallback&gt;</span></span></span></span>
&lt;/PropertyGroup&gt;

&lt;ItemGroup&gt;
    &lt;PackageReference Include=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Microsoft.AspNetCore.All</span><span style="color: rgba(128, 0, 0, 1)">"</span> Version=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">2.0.0</span><span style="color: rgba(128, 0, 0, 1)">"</span> /&gt;
    &lt;PackageReference Include=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Microsoft.AspNetCore.Session</span><span style="color: rgba(128, 0, 0, 1)">"</span> Version=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">2.0.0</span><span style="color: rgba(128, 0, 0, 1)">"</span> /&gt;
    &lt;PackageReference Include=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Microsoft.EntityFrameworkCore.SqlServer</span><span style="color: rgba(128, 0, 0, 1)">"</span> Version=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">2.0.0</span><span style="color: rgba(128, 0, 0, 1)">"</span> /&gt;
    &lt;PackageReference Include=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Microsoft.EntityFrameworkCore.Tools</span><span style="color: rgba(128, 0, 0, 1)">"</span> Version=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">2.0.0</span><span style="color: rgba(128, 0, 0, 1)">"</span> /&gt;<br>   &lt;<span class="hljs-name">PackageReference <span class="hljs-attr">Include=<span class="hljs-string">"Microsoft.AspNetCore.Mvc.Razor.ViewCompilation" <span class="hljs-attr">Version=<span class="hljs-string">"2.0.0" <span class="hljs-attr">PrivateAssets=<span class="hljs-string">"All" /&gt;</span></span></span></span></span></span></span>
&lt;/ItemGroup&gt;

&lt;ItemGroup&gt;
    &lt;DotNetCliToolReference Include=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Microsoft.VisualStudio.Web.CodeGeneration.Tools</span><span style="color: rgba(128, 0, 0, 1)">"</span> Version=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">2.0.0</span><span style="color: rgba(128, 0, 0, 1)">"</span> /&gt;
&lt;/ItemGroup&gt;

&lt;ItemGroup&gt;
    &lt;ProjectReference Include=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">..\Light.Common\Light.Common.csproj</span><span style="color: rgba(128, 0, 0, 1)">"</span> /&gt;
    &lt;ProjectReference Include=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">..\Light.Model\Light.Model.csproj</span><span style="color: rgba(128, 0, 0, 1)">"</span> /&gt;
&lt;/ItemGroup&gt;

&lt;/Project&gt;</pre>
</div>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">简洁的Program.cs</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> Microsoft.AspNetCore;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> Microsoft.AspNetCore.Hosting;

</span><span style="color: rgba(0, 0, 255, 1)">namespace</span><span style="color: rgba(0, 0, 0, 1)"> Light.Web
{
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Program
    {
      </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span> Main(<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">[] args)
      {
            BuildWebHost(args).Run();
      }

      </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> IWebHost BuildWebHost(<span style="color: rgba(0, 0, 255, 1)">string</span>[] args) =&gt;<span style="color: rgba(0, 0, 0, 1)">
            WebHost.CreateDefaultBuilder(args)
                .UseStartup</span>&lt;Startup&gt;<span style="color: rgba(0, 0, 0, 1)">()
                .Build();
    }
}</span></pre>
</div>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">下面是我的Startup文件的相关配置项</span></p>
<div class="cnblogs_code"><img src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif"><img id="code_img_opened_cb66cb34-018c-4486-81d5-db09a2cfd8da" class="code_img_opened lazyload" style="display: none" alt="" data-src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif">
<div id="cnblogs_code_open_cb66cb34-018c-4486-81d5-db09a2cfd8da" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> Microsoft.AspNetCore.Builder;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> Microsoft.AspNetCore.Hosting;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> Microsoft.Extensions.Configuration;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> Microsoft.Extensions.DependencyInjection;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> Light.Web.DBContext;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> Microsoft.EntityFrameworkCore;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> Light.Web.Models;

</span><span style="color: rgba(0, 0, 255, 1)">namespace</span><span style="color: rgba(0, 0, 0, 1)"> Light.Web
{
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Startup
    {
      </span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> Startup(IConfiguration configuration)
      {
            Configuration </span>=<span style="color: rgba(0, 0, 0, 1)"> configuration;
      }

      </span><span style="color: rgba(0, 0, 255, 1)">public</span> IConfiguration Configuration { <span style="color: rgba(0, 0, 255, 1)">get</span><span style="color: rgba(0, 0, 0, 1)">; }

      </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> ConfigureServices(IServiceCollection services)
      {
            services.AddDbContext</span>&lt;LightContext&gt;(m =&gt;<span style="color: rgba(0, 0, 0, 1)">
            {
                m.UseSqlServer(Configuration.GetConnectionString(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">LightContextConnection</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">));
            });
            services.AddSession(m </span>=&gt;<span style="color: rgba(0, 0, 0, 1)">
            {
                m.IdleTimeout </span>= TimeSpan.FromHours(<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
            });
            services.AddMvc(m </span>=&gt;<span style="color: rgba(0, 0, 0, 1)">
            {
                m.Filters.Add(</span><span style="color: rgba(0, 0, 255, 1)">typeof</span><span style="color: rgba(0, 0, 0, 1)">(LightActionFilter));
                m.Filters.Add(</span><span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> LightExceptionFilter());
            });
            </span><span style="color: rgba(0, 0, 255, 1)">var</span> serviceProvider =<span style="color: rgba(0, 0, 0, 1)"> services.BuildServiceProvider();
            </span><span style="color: rgba(0, 0, 255, 1)">var</span> dbContext = serviceProvider.GetService&lt;LightContext&gt;<span style="color: rgba(0, 0, 0, 1)">();
            LightContextSeed.SeedAsync(dbContext).Wait();
      }

      </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> Configure(IApplicationBuilder app, IHostingEnvironment env, IServiceProvider serviceProvider)
      {
            </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">
            {
                app.UseExceptionHandler(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/Home/Error</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
            }

            app.UseStaticFiles();
            app.UseSession();
            app.UseMvc(routes </span>=&gt;<span style="color: rgba(0, 0, 0, 1)">
            {
                routes.MapRoute(
                  name: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">default</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
                  template: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">{controller=Home}/{action=Index}/{id?}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
            });
      }
    }
}</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">微软官方的升级向导,供大家参考:https://docs.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/</span></p>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">2、使用cli命令发布项目,这时可以不用指定运行时标识,直接发布,因为项目不是运行在服务器(Windows或Linux)上的。</span></p>
<div class="cnblogs_code">
<pre>dotnet publish -c Release -o ../Publish</pre>
</div>
<p><img alt="" data-src="http://images2017.cnblogs.com/blog/646372/201708/646372-20170817234221584-279957647.png"></p>
<h2>四、使用Docker进行部署</h2>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">1、使用Winscp登陆到服务器上,并将发布之后的文件夹publish上传到服务器上</span></p>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px"><img src="http://images2017.cnblogs.com/blog/646372/201708/646372-20170817234647584-128284064.png"></span></p>
<p><img src="http://images2017.cnblogs.com/blog/646372/201708/646372-20170817234925178-1858483739.png"></p>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">2、创建Dockerfile文件,并将其配置成以下内容</span></p>
<div class="cnblogs_code">
<pre>FROM microsoft/<span style="color: rgba(0, 0, 0, 1)">dotnet
WORKDIR </span>/<span style="color: rgba(0, 0, 0, 1)">app
COPY .</span>/<span style="color: rgba(0, 0, 0, 1)">publish .
ENTRYPOINT [</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">dotnet</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Light.Web.dll</span><span style="color: rgba(128, 0, 0, 1)">"</span>]</pre>
</div>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">3、切换到Dockerfile所在的目录下,并执行构建命令,成功之后会有下图的提示</span></p>
<div class="cnblogs_code">
<pre>sudo docker build -t lightweb .  //注意后边还有一个点呢</pre>
</div>
<p><img src="http://images2017.cnblogs.com/blog/646372/201708/646372-20170817235759303-1784935540.png"></p>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">4、运行刚才构建成功,名字为lightweb的容器,直接绑定服务器的80端口</span></p>
<div class="cnblogs_code">
<pre>sudo docker run -p <span style="color: rgba(128, 0, 128, 1)">80</span>:<span style="color: rgba(128, 0, 128, 1)">80</span> -e <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">ASPNETCORE_URLS=http://+:80</span><span style="color: rgba(128, 0, 0, 1)">"</span> lightweb</pre>
</div>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">运行成功之后是这样的(请暂时忽略Warning),表示该容器内的程序正在使用80端口监听着.......</span></p>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px"><img src="http://images2017.cnblogs.com/blog/646372/201708/646372-20170818000254662-758943563.png"></span></p>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">5、试着用IP访问一下,不知道自己IP的请使用ifconfig命令进行查看</span></p>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px"><img src="http://images2017.cnblogs.com/blog/646372/201708/646372-20170818001124053-221776561.png"></span></p>
<h1>最后</h1>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">在看到最后一张图的时候,其实自己心里还是挺激动的;虽然中间遇到一些差错,比如项目文件中的MvcRazorCompileOnPublish节点,发布成ubuntu时需要改成false,或者直接删掉,再者是图片的名称后缀是大写,但是我程序里边写的是小写,发布之后图片不显示,是因为Linux是严格区分大小写的。囧~另外提醒一下,发布到IIS上时,请及时更新AspNetCoreModule模块为最新的DotNetCore.2.0.0-WindowsHosting.exe。</span></p>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">这里并没有介绍.NetCore2.0的相关知识,想了解的可以移步到张大队长的汇总:.NET Core 2.0 正式发布信息汇总</span></p>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">相信.NetCore2.0的发布会给整个社区带来不一样的变化,需要学习和积累的技术也越来越多,还是那句老话:学无止境。</span></p>

</div>
<div id="MySignature" role="contentinfo">
    服务、思考、安全<br><br>
来源:https://www.cnblogs.com/wangjieguang/p/docker-dotnetcore2.html
頁: [1]
查看完整版本: 升级项目到.NET Core 2.0,在Linux上安装Docker,并成功部署