将 ASP.NET MVC 应用程序迁移到 Windows 容器
在 Windows 容器中运行现有的 .NET Framework 应用程序不需要对应用程序进行任何更改。 若要在 Windows 容器中运行应用程序,请创建包含应用程序的 Docker 映像,然后启动容器。 本主题介绍了如何获取现有的 ASP.NET MVC 应用程序,并在 Windows 容器中进行部署。
从现有的 ASP.NET MVC 应用程序入手,然后使用 Visual Studio 生成已发布的资产。 使用 Docker 创建包含并运行应用程序的映像。 转到在 Windows 容器中运行的网站,验证应用程序是否正常运行。
本文假定读者对 Docker 有一个基本的了解。 阅读 Docker Overview(Docker 概述)即可了解 Docker。
在容器中运行的应用程序是一个随机回答问题的简单网站。 此应用程序是一款不具备身份验证或数据库存储的基本 MVC 应用程序,让你可以专心处理将 Web 层移到容器中。 后续主题将演示如何在容器化应用程序中移动和管理永久性存储。
移动应用程序涉及以下步骤:
完成的应用程序位于 GitHub 上。
先决条件
开发计算机必须具有以下软件:
- Windows 10 周年更新 (或更高版本)或 Windows Server 2016 (或更高版本)
- 用于 Windows 的 Docker - 稳定版 1.13.0 或 1.12 beta 版本 26(或更高版本)
- Visual Studio 2017
重要
如果使用的是 Windows Server 2016,请按容器主机部署 - Windows Server 中的说明操作。
安装并启动 Docker 以后,右键单击任务栏图标,并选择“切换到 Windows 容器”。 这是运行基于 Windows 的 Docker 映像所必需的。 此命令需要几秒钟执行:
发布脚本
在一个位置收集需加载到 Docker 映像中的所有资产。 可以使用 Visual Studio 的“发布”命令来创建应用程序的发布配置文件。 此配置文件会将所有资产汇集到同一目录树中,本教程的后面部分将介绍如何将此目录树复制到目标映像。
发布步骤
- 在 Visual Studio 中右键单击 Web 项目,然后选择“发布”。
- 单击“自定义配置文件”按钮,然后选择“文件系统”作为方法。
- 选择该目录。 按照约定,已下载示例将使用
bin\Release\PublishOutput
。
打开“设置”选项卡的“文件发布选项”部分。在发布期间选择预编译。 这种优化意味着,在复制预编译视图的同时,在 Docker 容器中编译视图。
单击“发布”,Visual Studio 会将所有所需资产复制到目标文件夹。
生成映像
创建名为 Dockerfile 的新文件以定义 Docker 映像。 Dockerfile 包含生成最终映像的说明,并包括任何基本映像名称、所需组件、要运行的应用和其他配置映像。 Dockerfile 是创建映像的命令的输入 docker build
。
在本练习中,将基于 microsoft/aspnet
Docker 中心上的映像生成映像。
基本映像 mcr.microsoft.com/dotnet/framework/aspnet:4.8
为 Windows Server 映像。 它包含 Windows Server Core、IIS 和 ASP.NET 4.8。 在容器中运行此映像时,它会自动启动 IIS 和已安装的网站。
创建映像的 Dockerfile 如下所示:
# The `FROM` instruction specifies the base image. You are
# extending the `mcr.microsoft.com/dotnet/framework/aspnet:4.8` image.
FROM mcr.microsoft.com/dotnet/framework/aspnet:4.8
# The final instruction copies the site you published earlier into the container.
COPY ./bin/Release/PublishOutput/ /inetpub/wwwroot
此 Dockerfile 中没有 ENTRYPOINT
命令。 不需要该命令。 使用 IIS 运行 Windows Server 时,IIS 进程是入口点,该入口点配置为在 aspnet 基础映像中启动。
运行 Docker 生成命令,创建运行 ASP.NET 应用程序的映像。 为此,请在项目的目录中打开一个 PowerShell 窗口,并在解决方案目录中键入以下命令:
docker build -t mvcrandomanswers .
此命令将使用 Dockerfile 中的说明生成新映像,并将映像命名为 mvcrandomanswers(-t 标记)。 这样做可能还会从 Docker 中心拉取基本映像,然后将应用程序添加到基本映像中。
命令完成后,便可以运行 docker images
命令,查看有关新映像的信息:
REPOSITORY TAG IMAGE ID CREATED SIZE
mvcrandomanswers latest 86838648aab6 2 minutes ago 10.1 GB
计算机上的 IMAGE ID 会所不同。 现在,让我们来运行应用程序。
启动容器
通过执行以下 docker run
命令来启动容器:
docker run -d --name randomanswers mvcrandomanswers
-d
参数告知 Docker 在分离模式下启动映像。 这意味着 Docker 映像会以断开连接当前 shell 的状态运行。
在许多 docker 示例中,你可能会看到 -p 来映射容器和主机端口。 默认 aspnet 映像已将容器配置为侦听端口 80 并公开它。
--name randomanswers
为运行中容器命名。 可在大多数命令中使用此名称,而不是容器 ID。
mvcrandomanswers
是要启动的映像名称。
在浏览器中验证
容器启动后,使用 http://localhost
所示的示例连接到正在运行的容器。 在浏览器中键入该 URL,应该可看到正在运行的站点。
注意
某 VPN 或代理软件可能会阻止你导航到站点。 可以暂时禁用它,确保容器正常工作。
GitHub 上的示例目录包含为你执行这些命令的 PowerShell 脚本。 打开 PowerShell 窗口,将目录更改为解决方案目录,然后键入:
./run.ps1
上述命令生成映像,显示计算机上的映像列表,并启动容器。
若要停止容器,请发出 docker stop
命令:
docker stop randomanswers
若要删除该容器,可发出 docker rm
命令:
docker rm randomanswers