十九、部署和托管

在本章中,我们将涵盖以下主题:

  • 部署选项
  • 举办一个 ASP。 IIS 上的 asp.NET Core web 应用
  • 举办一个 ASP。 Kestrel 上的 NET Core web 应用
  • 举办一个 ASP。 Azure 上的 NET Core web 应用
  • 举办一个 ASP。 Docker 容器中的 NET Core web 应用

All examples in this chapter can be found at the following GitHub repo: https://github.com/polatengin/B05277/tree/master/Chapter19.

部署选项

在。net Core 项目的开发期间或之后,我们将其部署到所需的环境中,例如测试、分段、预开发或开发。

.NET Core 应用可以使用以下选项部署到环境中:

  • 优化选项
    • 调试
    • 释放
  • 构建选项
    • 框架依赖
    • 自包含的

准备

在。net 中有两种不同的构建模式:调试和发布。

如果采用 Release 模式,. net Core 编译器可以做很多优化。 Debug 模式在已编译的程序集中包含大量额外的代码,以便开发人员在调试应用时更容易。 Release 模式是调试模式的剥离和额外优化版本。

通常,我们使用 Debug 模式来调试项目,使用 Release 模式来调试生产环境的最终构建。

让我们通过在项目的文件夹中执行以下命令来创建一个示例项目,并检查这些选项之间的差异:

dotnet new web 

The example project can be found at https://github.com/polatengin/B05277/tree/master/Chapter19/0-GettingStarted.

怎么做……

  1. 创建一个名为Deploy.sh的新文件,并添加以下内容:
dotnet run 
  1. 在终端/命令提示符窗口中使用如下命令运行Deploy.sh文件:
./Deploy.sh

dotnet run命令从csproj文件开始编译项目,并包含编译过程中的所有.cs文件。 执行dotnet run命令后,终端/命令提示符窗口应该显示如下消息:

Hosting environment: Production
Content root path: C:/B05277/Chapter19/0/-GettingStarted
Now listening on: http://localhost:5000
Application started. Press *Ctrl* + *C* to shut down.
Application is shutting down...

这条消息向我们显示应用现在已经启动并在http://localhost:5000上运行。

The dotnet run command compiles the project in Debug mode, but does not create compiled artifacts/assemblies on disk.

  1. 如果我们想在编译过程之后创建 DLL 文件,我们应该运行以下命令:
dotnet build 

Usually, we want to create deployment files in the project folder, copy them into the necessary environment, then run it in that environment.

在执行dotnet build命令之后,我们应该看到以下输出:

Microsoft (R) Build Engine version 15.5.179.9764 for .NET Core
Copyright (C) Microsoft Corporation. All rights reserved.
Restore completed in 60.76 ms for C:/B05277/Chapter19/0-GettingStarted/GettingStarted.csproj.
GettingStarted -> C:/B05277/Chapter19/0-GettingStarted/bin/Debug/netcore/app2.0GettingStarted.dll
Build succeeded.
0 Warning(s)
0 Error(s)
Time Elapsed 00:00:01.79

dotnet build命令在项目文件夹中创建bin/Debug/netcoreapp2.0文件夹,并在其中创建 dll。 如果项目没有依赖项,则只创建项目 DLL,否则将在该文件夹中创建项目 DLL 和所有依赖项 DLL。

如果没有声明,dotnet build命令将工程编译到宿主环境中,例如 Win7-x86, Win10-x64, Ubuntu.17.10-x64, OsX.10.12-x64,等等。

The whole Runtime Identifier Catalog is at: https://docs.microsoft.com/en-us/dotnet/core/rid-catalog

如果愿意,您可以在不托管环境的情况下编译项目,只需声明运行时环境即可。

  1. 您可以在csproj文件中声明运行环境如下:
<PropertyGroup> 
  <TargetFramework>netcoreapp2.0</TargetFramework> 
  <RuntimeIdentifier>win7-x64</RuntimeIdentifier> 
</PropertyGroup> 

声明运行时环境的另一种方法是使用.NET Core CLI命令开关,如下所示:

dotnet build --runtime ubuntu-x64 

在使用运行时环境标识符将. net Core 项目编译到特定环境后,我们可以根据环境复制工件(dll),并运行应用。

此外,我们可以在 Release 模式下编译项目。

It's a best practice that every app that is going to be deployed to a prod environment should be compiled in Release mode.

我们还可以使用.NET Core CLI开关将优化模式更改为 Release,如下所示:

dotnet build --configuration Release 

我们可以在bin/Release/netcoreapp2.0文件夹中找到编译版本。

If we used the runtime environment identifier, there will be another folder in the netcoreapp2.0 folder: the runtime environments folder.

如果需要,我们可以将.NET Core CLI Commands混合搭配如下:

dotnet build --runtime ubuntu-x64 --configuration Release 

如果我们能在一台计算机上安装。net Core,它最终会在一个专用的文件夹中,比如 Windows 中的C:/Program Files/dotnet,等等。

在该文件夹中,有一个名为shared的文件夹,其中包含运行。net Core 应用所需的所有。net Core 库。

我们可以将项目的编译工件部署到预先安装的。net Core 计算机中,并在其中运行应用。

这称为框架依赖部署

我们可以将项目部署到没有预装。net Core 的计算机上。 我们所需要做的就是将所有需要的。net Core 库添加到项目的部署文件夹中。

这是自包含部署,它可以通过以下。net Core CLI 命令来完成:

dotnet publish --self-contained 

执行前一个命令后,将会有一个bin/Debug{or Release}/netcoreapp2.0/publish文件夹。 这个文件夹将包含所有。net Core 和与项目相关的依赖 dll,以及我们项目的可执行文件(.exe)。

我们可以把这个文件夹复制到一台没有安装。net Core 的计算机上,我们仍然可以运行这个应用。

dotnet publish can have --runtime, --configuration as well.

它是如何工作的…

. net Core CLI 拥有构建和部署项目所需的所有命令。

在执行应用方面,调试和发布模式是相同的,但在性能和优化方面有很大的不同。

在框架依赖部署和自包含部署中,包大小是非常不同的。 这是因为框架依赖于部署只部署应用的 dll,而不是。NET Core 相关的 dll,如果您使用自包含部署模型,应该部署这些 dll。

自包含部署模型可以让我们在计算机上预先安装所需的。net Core 版本。

举办一个 ASP。 IIS 上的 asp.NET Core web 应用

自 1995 年以来,IIS (Internet Information Server)一直是微软的应用服务器。 应用服务器通过 HTTP 请求提供静态或动态内容。

IIS 是一种灵活的通用应用服务器,运行在 Windows 上。

我们基本上可以将项目部署到 IIS 中,将项目部署在一个文件夹中,并创建一个指向该文件夹的 IIS 网站。

准备

在开始本节之前,应该安装 IIS。 IIS 可以免费安装和使用; 我们只需要在控制面板中打开“打开或关闭”窗口来启用它:

我们应该将World Wide Web ServicesIIS 管理控制台配置为在计算机上拥有 IIS:

单击 OK 按钮后,Windows 将在计算机上启用 IIS,我们可以使用它来为 web 应用提供服务。

另外,我们需要安装。net Core Windows Server Hosting bundle(我们可以从https://docs.microsoft.com/en-us/aspnet/core/publishing/iis?tabs=aspnetcore2x下载安装):

Example project can be found at: https://github.com/polatengin/B05277/tree/master/Chapter19/1-HostingIIS.

怎么做……

  1. 让我们创建一个新的 ASP.NET Core 项目和服务它在 IIS:
dotnet new web 
  1. 打开Program.cs文件,查找以下代码块:
public static IWebHost BuildWebHost(string[] args) => 
WebHost.CreateDefaultBuilder(args) 
.UseStartup<Startup>() 
.Build(); 
  1. 我们应该在该函数中添加一个UseIISIntegration()方法调用,如下所示:
public static IWebHost BuildWebHost(string[] args) => 
WebHost.CreateDefaultBuilder(args) 
.UseStartup<Startup>() 
.UseIISIntegration() 
.Build(); 

The UseIISIntegration() method call is important and required if we're going to deploy our project to IIS.

UseIISIntegration()方法使 ASP.NET Core 应用使用 IIS 作为反向代理,并指定要监听的端口,等等。

当在 IIS 中创建一个网站时,它将从项目根文件夹中的web.config文件中读取配置。

  1. 现在我们在项目根文件夹中创建一个web.config文件。 在里面写下面的代码:
<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
  <system.webServer> 
    <handlers> 
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" /> 
    </handlers> 
    <aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" stdoutLogFile=".logsstdout" forwardWindowsAuthToken="false" /> 
  </system.webServer> 
</configuration> 

前面的代码告诉 IIS 从 ASP 服务网站内容.NET Core 应用。 这个文件及其内容是托管 ASP 的必要条件。 IIS 上的 asp.NET Core 应用。

  1. 让我们用以下。net Core CLI 命令来部署项目:
dotnet publish -c Release

这将创建一个发布文件夹,其中包含一些 DLL 文件,并显示以下输出:

C:/B05277/Chapter19/1-HostingIIS> dotnet publish -c Release
Microsoft (R) Build Engine version 15.5.179.9764 for .NET Core
Copyright (C) Microsoft Corporation. All rights reserved.
Restore completed in 69.62 ms for C:B05277Chapter191-HostingIISHostingIIS.csproj.
HostingIIS -> C:/B05277/Chapter19/1-HostingIIS/bin/Release/netcore/app2.0HostingIIS.dll
HostingIIS -> C:/B05277/Chapter19/1-HostingIIS/bin/Release/netcore/app2.0publish
  1. 现在我们可以打开 IIS 管理控制台来创建一个新的网站:

  1. 首先,通过右键单击它,然后单击 Remove,删除默认的网站。
  2. 要创建一个新网站,右键单击左侧的Sites文件夹,然后单击 Add website。

  3. 通过给网站一个名称并选择已编译的项目文件夹来填充新窗口:

We compiled the project with the -c Release option, and it generated Release mode artifacts in the bin/Release/netcoreapp2.0/publish folder.

  1. 下一步是将。net Framework 的默认值更改为“应用池基本设置中无托管代码”。 我们应该点击 IIS 管理控制台左侧的Application Pools文件夹,然后双击列表中的网站名称:

  1. 现在,我们可以启动首选的 web 浏览器,导航到http://localhost地址,结果如下:

它是如何工作的…

IIS 可以服务于 ASP.NET Core 应用。 默认情况下,它会将端口80分配给第一个创建的网站; 我们可以在网站的绑定设置中将这个默认端口更改为我们想要的任何端口:

如果需要,可以在同一个窗口中设置Host name。 其中Host name为该网站的域名,如microsoft.comgoogle.com

IIS uses the ASP.NET Core Windows Server Hosting bundle to serve the application. If we don't install the required bundle, IIS will display a HTTP500.19 error page instead of our application.

举办一个 ASP。 Kestrel 上的 NET Core web 应用

Kestrel 是微软最新开发的应用服务器。 Kestrel 开发的主要目的是支持 Linux 和 macOS 操作系统。

通过这样做,微软确保所有的 ASP.NET web 开发人员可以使用 Linux 或 macOS 系统来开发和服务应用。

Kestrel 的开发考虑到了跨平台,但它也采用了新的架构和模式。

准备

Kestrel 是 ASP 的一个依赖包。 .NET Core 命令行(dotnet.exe)将在您的计算机上安装。NET Core 时被安装。NET Core web 项目。

dotnet.exe是任何平台(如 Windows、Linux 或 macOS)上的任何。net Core 应用的启动器。

让我们创建一个新的 ASP.NET Core Web Application 并通过执行以下命令启动应用:

dotnet new web 

Example project can be found at: https://github.com/polatengin/B05277/tree/master/Chapter19/2-HostingKestrel.

怎么做……

  1. 打开Program.cs文件,查看public static void Main(string[] args)方法调用; 这是任何。NET Core 应用的主要入口点。

Main方法调用BuildWebHost()方法进行一些基础工作,以便在其中一个应用服务器(如 IIS、Kestrel 等)中为应用提供服务。

BuildWebHost()方法创建一个新的 web 主机,并从Startup类启动其服务:

By default, the Startup class can be found in the Startup.cs file; you can change it to whatever file you want.

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Threading.Tasks; 
using Microsoft.AspNetCore; 
using Microsoft.AspNetCore.Hosting; 
using Microsoft.Extensions.Configuration; 
using Microsoft.Extensions.Logging; 

namespace HostingKestrel 
{ 
    public class Program 
    { 
        public static void Main(string[] args) 
        { 
            BuildWebHost(args).Run(); 
        } 

        public static IWebHost BuildWebHost(string[] args) => 
            WebHost.CreateDefaultBuilder(args) 
                .UseStartup<Startup>() 
                .Build(); 
    } 
} 
  1. 我们可以通过调用。net Core CLI 命令来启动项目,如下所示:
dotnet run 

We can also deploy and publish the project as we saw at the start of this chapter.

启动项目后,我们应该在终端/命令提示符窗口中看到如下输出:

C:/B05277/Chapter19/2-HostingKestrel> dotnet run
Hosting environment: Production
Content root path: C:/B05277/Chapter19/2-HostingKestrel
Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.  

默认情况下,web 应用在端口5000上绑定自己。

我们可以通过在dotnet run命令中添加一些参数来更改默认端口:

In Windows Powershell Window 
C:/B05277/Chapter19/2-HostingKestrel> $env:ASPNETCORE_URLS="http://*:4000"; dotnet run 
Hosting environment: Production 
Content root path: C:/B05277/Chapter19/2-HostingKestrel 
Now listening on: http://[::]:4000 
Application started. Press Ctrl+C to shut down. 

In Windows Command Window  
C:/B05277/Chapter19/2-HostingKestrel> SET ASPNETCORE_URLS=http://*:4000 && dotnet run 
Hosting environment: Production 
Content root path: C:/B05277/Chapter19/2-HostingKestrel 
Now listening on: http://[::]:4000 
Application started. Press Ctrl+C to shut down. 

In Linux, MacOS Terminal Window 
C:/B05277/Chapter19/2-HostingKestrel> ASPNETCORE_URLS="http://*:4000" dotnet run 
Hosting environment: Production 
Content root path: C:/B05277/Chapter19/2-HostingKestrel 
Now listening on: http://[::]:4000 
Application started. Press Ctrl+C to shut down. 
  1. 我们可以用我们最喜欢的浏览器导航到http://localhost:4000,并看到应用正在运行:

现在,我们可以设置负载均衡器、DNS 服务器等等,并将任何域名绑定到端口号为4000的服务器上,并将应用提供给全世界。

它是如何工作的…

dotnet.exe从主入口点(Program.cs文件中的公共静态Main()方法)运行应用。

首先,它通过调用WebHost.CreateDefaultBuilder()Build()方法创建一个新的 web 主机。

The CreateDefaultBuilder() method applies some default parameters and method calls, such as; using Kestrel as a web server, loading IConfiguration from different locations, enabling IIS Integration, configuring log output to console, and so on.

CreateDefaultBuilder()方法本身包括UseKestrel()方法。 UseKestrel()方法是由Microsoft.AspNetCore.Server.Kestrel.dll组件提供的ExtensionMethod方法。

通过打开csproj文件,我们可以看到项目唯一的 NuGet 依赖是Microsoft.AspNetCore.All(https://www.nuget.org/packages/Microsoft.AspNetCore.All)。

Microsoft.AspNetCore.All依赖项是一个带有一些依赖项的空库,例如; Microsoft.AspNetCore.Server.Kestrel,``Microsoft.AspNetCore.SessionMicrosoft.AspNetCore.StaticFilesMicrosoft.EntityFrameworkCoreMicrosoft.Extensions.Logging.Console,等等。

BuildWebHost()方法的最后一行是Build()方法调用,它基本上将 Kestrel 作为 web 服务器运行。

举办一个 ASP。 Azure 上的 NET Core web 应用

云提供商确保开发人员可以轻松扩展他们的应用。

例如,我们可以开发一个社交网络应用,但我们不能确定我们需要多少资源。

大多数情况下,我们将基于收集到的示例使用数据、有根据的猜测等等进行估计。

在获取资源阶段,我们在需求高的情况下增加所需的资源。 当然,资源的增加也会增加拥有应用的成本。

应用的使用模式永远不会是一条平线,因此我们永远不需要相同数量的资源。 所需的资源每天都不一样,甚至不一样; 每小时更新的基础。

云提供商使得在某个时间点只拥有所需数量的资源变得很容易。

这是非常经济的,当我们无法估计一个启动应用的使用情况时,这是有意义的。

准备

我们需要一个 Azure 订阅来托管一个 ASP.NET Core web 应用。 我们可以很容易地从以下网站创建订阅:http://azure.com

在绑定信用卡并启用交易之前,Azure 不会生成账单并在免费试用中运行。 免费试用模式为我们提供了很多免费的 Azure 服务,但不是全部。

创建订阅后,让我们通过导航http://portal.azure.com登录到 Azure Portal:

我们需要一个新的网站为这个例子,所以让我们创建一个。

点击左边的+ New 按钮; 它会打开新资源刀片。 接下来,点击 Web + Mobile 菜单项:

现在,点击 Web App; 它会打开创建 Web 应用刀片。 填充空的文本框,并按照以下指南(https://docs.microsoft.com/en-us/azure/app-service/app-service-web-overview)创建一个新的 web 应用:

Azure 会创建一个新的 web 应用,几秒钟后,我们就会在 Azure 中创建一个新的 web 应用。

让我们创建一个新的 ASP.NET Core web 应用:

dotnet new web 

Example project can be found at: https://github.com/polatengin/B05277/tree/master/Chapter19/3-HostingAzure.

怎么做……

现在我们需要把它部署到 Azure 上。 有几种方法可以做到这一点,比如使用 Visual Studio、使用 Visual Studio Code、使用 TFS、带连续部署选项的 GitHub、FTP 等等。

部署一个 ASP.NET Core web 应用 Azure 与 Visual Studio 代码

根据http://code.visualstudio.com,Visual Studio Code 是一个重新定义和优化的代码编辑器,用于构建和调试现代 web 和云应用。 Visual Studio Code 是免费的,可以在您喜欢的平台上使用——linux、macOS 或 Windows。

在从http://code.visualstudio.com安装 Visual Studio Code 后,我们可以添加 Azure 应用服务工具扩展:

  1. 在将项目发布到 Azure 之前,我们需要添加一个web.config文件,其内容如下:
<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
  <system.webServer> 
    <handlers> 
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" /> 
    </handlers> 
    <aspNetCore processPath="dotnet" arguments=".HostingAzure.dll" stdoutLogEnabled="false" stdoutLogFile=".logsstdout" /> 
  </system.webServer> 
</configuration> 

Notice the arguments parameter of the aspNetCore element. It should contain the deployed assembly name. You should change it if the project's name is different.

  1. 现在是时候使用。net Core CLI 命令将项目部署到本地磁盘了:
dotnet publish -c Release

这个命令将为已部署的项目创建一个bin/release/netcoreapp2.0文件夹。

  1. 让我们用bin/release/netcoreapp2.0文件夹打开 Visual Studio Code。 您应该在 Explorer 选项卡中看到 Azure App Service 面板。 登录 Azure 订阅后,您可以看到之前创建的 web 应用。
  2. 右键单击它并单击 Deploy to Web App 菜单项。

这将打包本地部署并发布到 Azure:

发布成功后,你可以在 OUTPUT 面板中看到部署完成的消息:

If the web.config file didn't include the netcoreapp2.0 folder, you should add this file manually.

  1. 完成这些步骤后,您可以导航到您在 Azure 中创建的 web 应用的 URL,您将看到该应用。

部署一个 ASP.NET Core web 应用 Azure 与 Visual Studio 社区版

Visual Studio 是有史以来最受欢迎的 ide 之一。 社区版是 Visual Studio 的免费版本,可以从https://www.visualstudio.com/vs/下载。

下载并安装 Visual Studio 社区版之后,您就可以创建/打开 ASP.NET Core Web 应用项目:

  1. 加载先前创建的 ASP.NET Core web 应用项目,只需双击项目根文件夹中的.csproj文件。

在 Visual Studio 社区版中将项目发布到 Azure 很容易。

  1. 首先,在解决方案资源管理器中右键单击项目行,然后单击发布:

  1. 在打开的窗口中,我们应该选择 Microsoft Azure App Service 选项,选择 select Existing 选项,然后点击 Publish 按钮:

  1. 在新打开的对话框中,我们可以看到并选择之前在 Azure Portal 中创建的 web 应用:

  1. 单击 OK 按钮后,Visual Studio 将负责打包并将项目发布到 Azure。

它是如何工作的…

Azure 有不同的选项,允许开发人员发布他们的 ASP.NET Core web 应用项目。

举办一个 ASP。 Docker 容器中的 NET Core web 应用

如果在本地数据中心发布项目,那么部署和配置 ASP 就不那么容易了.NET Core web 应用。 在 Docker 出现之前,开发人员通常将他们的应用部署到虚拟服务器上。

首先,他们需要提供一个虚拟服务器,在上面安装完整的操作系统,然后在上面安装所需的服务,比如 IIS、SQL Server,等等。

完成所有这些步骤后,开发人员可以部署应用并将其配置为在该虚拟服务器中运行。 项目需要不同的环境,例如开发、测试、登台、开发等等,这是很常见的。

而且,有时候,开发人员通常会区分环境规范和资源,比如端口号、数据库连接字符串,甚至底层操作系统。

Docker 使创建环境和使用人类可读的文本文件配置环境变得很容易。 这个文本文件称为 DockerFile。 我们可以创建一个环境并通过创建 DockerFile 来声明它的配置。

Docker CLI 可以通过该 DockerFile 组成一个 Docker 映像,将项目部署到其中,并制作一个 Docker 映像。 Docker CLI 也可以从 Docker 映像实例化一个 Docker 容器。 假设 Docker 映像是蓝图,Docker 容器是蓝图的实例。 因此,Docker CLI 可以多次实例化一个 Docker 映像到一个 Docker 容器中。 我们应该在使用 Docker 守护进程之前先安装它; 安装程序可以从https://www.docker.com/community-edition下载。

Docker 守护进程是跨平台的,所以您可以下载、安装并在您拥有的任何操作系统上运行它。

准备

让我们创建一个新的 ASP.NET Core web 应用项目:

dotnet new web 

在 Visual Studio Code 中打开新创建的项目并创建一个名为DockerFile的新文件。

Notice that the filename is DockerFile, with no file extension.

我们可以通过打开终端/命令提示符窗口并执行以下命令来确保 Docker 已经安装并正常运行:

    docker --version

    docker info  

Example project can be found at: https://github.com/polatengin/B05277/tree/master/Chapter19/4-HostingDocker.

怎么做……

DockerFiles 必须以 Docker 映像作为基础。 在我们的例子中,这个基本映像是微软开发的。net Core 2.0 Docker 映像。

We can see all the images by Microsoft at: https://hub.docker.com/r/microsoft/ aspnetcore-build/.

我们的 DockerFile 必须以FROM microsoft/aspnetcore-build行开始。

If we want, we can build our own Docker image from an operating system baseline, but there are a lot of things we should do before deploying the project to it, such as installing HTTP libraries, SSL libraries, .NET Core Runtime, and so on. We can see layers of a DockerFile of aspnetcore-build:2.0 at https://hub.docker.com/r/microsoft/dotnet/~/dockerfile/.

DockerFile中的第二行是工作目录; 在我们的例子中是WORKDIR /app

然后我们应该在DockerFile中添加一行来复制所有的项目文件,另一行用来运行dotnet publish命令,另一行用来运行。net 应用。

以下是DockerFile内容的一个例子:

FROM microsoft/aspnetcore-build AS builder 
WORKDIR /app 

# copy csproj and restore as distinct layers 
COPY *.csproj ./ 
RUN dotnet restore 

# copy everything else and build 
COPY . ./ 
RUN dotnet publish -c Release -o out 

# build runtime image 
FROM microsoft/aspnetcore 
WORKDIR /app 
COPY --from=builder /app/out . 
ENTRYPOINT ["dotnet", "HostingDocker.dll"] 
  1. 现在我们可以打开终端/命令提示符窗口并执行以下命令:
    docker build -t hostingdocker .  

The docker build command can take a Docker image name with the -t argument. Also note the . character at the end of the command.

Docker 命令的输出应该如下所示:

C:/B05277/Chapter19/4-HostingDocker> docker build -t hostingdocker .
    Sending build context to Docker daemon  603.1kB
    Step 1/10 : FROM microsoft/aspnetcore-build AS builder
    latest: Pulling from microsoft/aspnetcore-build
    3e17c6eae66c: Already exists
    fdfb54153de7: Pull complete
    a4ca6e73242a: Pull complete
    93bd198d0a5f: Pull complete
    6030a6f9bb3e: Pull complete
    3244c708b1c9: Pull complete
    675a274a8d69: Pull complete
    5c16d1951794: Pull complete
    e0c6c215cec5: Pull complete
    c8a448f88b0b: Pull complete
    7c41433694e9: Pull complete
    0f54f547def2: Pull complete
    Digest: sha256:393f83b0e5e3b880a97b7a4118c7663a0fd3463433fc9672026710ccbc5fdb88
    Status: Downloaded newer image for microsoft/aspnetcore-build:latest
     ---> e421e10eaa5d
    Step 2/10 : WORKDIR /app
     ---> c1c98dc2991d
    Removing intermediate container 86d31c5a3e46
    Step 3/10 : COPY *.csproj ./
     ---> a4e35715c569
    Step 4/10 : RUN dotnet restore
     ---> Running in c0dc80c24979
      Restoring packages for /app/HostingDocker.csproj...
      Generating MSBuild file /app/obj/HostingDocker.csproj.nuget.g.props.
      Generating MSBuild file /app/obj/HostingDocker.csproj.nuget.g.targets.
      Restore completed in 563.85 ms for /app/HostingDocker.csproj.
     ---> e921c6f6c55e
    Removing intermediate container c0dc80c24979
    Step 5/10 : COPY . ./
     ---> 0af6a5882bf6
    Step 6/10 : RUN dotnet publish -c Release -o out
     ---> Running in 23f8a5c9f5e3
    Microsoft (R) Build Engine version 15.4.8.50001 for .NET Core
    Copyright (C) Microsoft Corporation. All rights reserved.

      HostingDocker -> /app/bin/Release/netcoreapp2.0/HostingDocker.dll
      HostingDocker -> /app/out/
     ---> 458c871a3416
    Removing intermediate container 23f8a5c9f5e3
    Step 7/10 : FROM microsoft/aspnetcore
     ---> 01d033b55240
    Step 8/10 : WORKDIR /app
     ---> Using cache
     ---> 3cb4029d92c4
    Step 9/10 : COPY --from=builder /app/out .
     ---> 7574cfa0f543
    Step 10/10 : ENTRYPOINT dotnet HostingDocker.dll
     ---> Running in cd6120f3325f
     ---> fd60e8356b33
    Removing intermediate container cd6120f3325f
    Successfully built fd60e8356b33
    Successfully tagged hostingdocker:latest

现在我们可以通过执行docker images命令列出所有的 Docker 映像:

  1. 通过执行以下命令,我们可以从hostingdockerDocker 映像创建一个 Docker 容器:
docker run -it -p 5000:80 hostingdocker  

-p交换机连接内部端口5000和外部端口80

  1. 最后,我们可以启动我们最喜欢的浏览器,导航到http://localhost,看看应用是否已经启动并运行:

它是如何工作的…

Docker 可以很容易地隔离应用,并使用所需的配置部署它。

配置可以声明为一个文本文件,它使开发人员能够创建一个管道,通过编译项目并从 DockerFile 创建一个新环境来发布项目的新版本。

所有这些步骤都称为连续部署。