ASP.NET容器化(Windows Server容器初探)

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ASP.NET容器化(Windows Server容器初探)相关的知识,希望对你有一定的参考价值。

前言:

本文为Windows Server环境下的容器体验纪实文章,旨在跟大家分享一些体会和经验,相关视频演示及说明将于下周更新,欢迎大家一起讨论。


Windows容器概述


当今世界,容器技术越来越火热,微软也终于通过Windows Server 2016进军容器市场。Windows 容器包括两个不同的容器类型:

Windows Server容器
通过进程和命名空间隔离技术提供应用程序隔离。Windows Server容器与容器主机共享内核。
Hyper-V 容器
通过在高度优化的虚拟机中运行每个容器,容器主机的内核不与Hyper-V容器共享。
下图大致反映了Windows容器的一些基本原理:

  Windows 容器可以通过Powershell或是Docker进行管理,我们今天关注的重点在Docker方面。

试验环境 

本次试验在一台服务器上的Hyper-V VM中进行:


操作系统:Windows Server 2016 TP4(英文版)
硬件配置:Intel Xeon E5-2650 v3、内存128G、硬盘 500G固态+1.5T机械
Hyper-V VM:  Windows Server 2016 TP4(英文版)
用户权限:管理员

具体步骤

1
安装Hyper-V VM并准备Windows容器运行环境

Windows容器的运行需要依赖于容器操作系统基础镜像;微软提供了一个Powershell脚本,执行该脚本成功后会创建一个Hyper-V虚拟机,同时在该虚拟机中安装好Windows容器所需要的所有依赖和配置。

以下是具体步骤:
1. 检查物理机Hyper-V服务是否安装;如果没有,需要先安装。
ASP.NET容器化(Windows Server容器初探)

2. 以管理员身份运行PowerShell。

C:> powershell.exe ASP.NET容器化(Windows Server容器初探)
3. 检查是否存在虚拟交换机,如果没有请先创建一个。
4. 下载安装脚本。
wget -uri https://aka.ms/tp4/New-ContainerHost -OutFile  c:New-ContainerHost.ps1
5. 下载完成后执行该脚本。
c:New-ContainerHost.ps1 –VmName cloudsoar27 -WindowsImage ServerDatacenterCore -Hyperv

该脚本执行的时候会创建Hyper-V虚拟机,下载并配置Windows容器组件。由于下载量较大,网速慢,需耐心等待。 也可以使用已经下载好的文件(如下图):
ASP.NET容器化(Windows Server容器初探)
注意那两个文本文档,是脚本判断下载是否结束的依据,如果缺失会提示错误的版本。在这里感谢@盆盆大神提供的镜像,省去了我们多少个漫漫长夜的等待!
注:镜像下载路径为
http://pan.baidu.com/s/1dDXjTDZ
当Hyper-V VM创建成功后,脚本后面的步骤如果运行失败了,不用重新运行脚本,启动Hyper-V VM在里面执行Install-ContainerHost.ps1即可。由于网络原因执行失败可多试几次。关于环境搭建的详情可参考
https://msdn.microsoft.com/en-us/virtualization/windowscontainers/quick_ start/container_setup#

2
 Docker命令兼容性测试

Windows Server容器支持以Docker原生命令进行操作,本次所测试的命令包括build, commit, create, exec, images ,logs, ps, pull, rename, restart, rm, rmi, run , start, stop, version等,均能正常执行(commit的速度有点慢)。官网上明确指出dockerhub相关命令不支持。尝试docker login命令得到如下结果:
ASP.NET容器化(Windows Server容器初探)
可以使用docker search * 列出可用镜像列表(事实上把*换成任意字符串比如’asdfasdfasdf’,依旧会得到以下列表)
ASP.NET容器化(Windows Server容器初探)
docker pull命令只能拉取以上列表中的镜像,类似docker pull redis的命令会得到如下结果:
ASP.NET容器化(Windows Server容器初探)
上周我在物理机上(也是本次这台服务器)直接搭建过Windows Container的运行环境,测试时发现容器中的命令行比较“脆弱”,容易发生显示错位、命令自动拼接到上一条的情况。有时候创建带有交互式命令的容器时进去后会立马退出,在容器中安装服务时会卡住不动(甚至使用get-windowsfeature web*之类的查看命令也会卡住)。在Hyper-V VM 中除了有时启动带有交互式终端命令的容器它会自动退出这个问题依然存在外,其他问题暂时还未发现。看来Windows Server Container在Hyper-V虚拟机中的稳定性比在物理机上好。

3
 Windows Server Core+IIS+.NET框架基础镜像

Windows容器也支持commit与Dockerfile两种方式构建镜像,本节主要介绍使用Dockerfile的方式构建Windows Server Core+IIS+.NET Framework基础镜像,后续将在该镜像的基础上构建ASP.NET应用.
如下是Dockerfile文件内容:
ASP.NET容器化(Windows Server容器初探)
Dockerfile主要在Windowsservercore的基础上安装了.NET Framework 3.5,IIS 10.0 以及asp相关应用开发组件。最先用commit方式构建镜像的时候,在容器中安装web-asp-net失败的原因已经找到了,应该是安装web-asp-net需要依赖.NET Extensibility 3.5,如果这个组件没有安装就会先装这个,但是这个组件依赖于.NET Framework 3.5. 在Windowsservercore启动的容器中默认安装的.NET Framework 版本为4.0而不是3.5,导致web-asp-net安装失败,所以要先安装.NET Framework 3.5。这里装多个版本主要是为了兼容不同版本的asp.net应用,当然也可以根据需要选择性安装。
docker build -t iisbase c:iisbase

4
部署ASP.NET应用

本节基于3中创建的基础镜像iisbase构建ASP.NET应用镜像,Dockerfile如下:(source为使用vs2015发布的一个简单的asp.net示例应用)
ASP.NET容器化(Windows Server容器初探)
使用docker run --name test -it -p 8080:80 asp45demo cmd创建容器。然后通过192.168.0.179:8080(Hyper-V VM IP)访问。
ASP.NET容器化(Windows Server容器初探)
有个比较令人困惑的地方是镜像的大小,感觉太‘重’了点。
注:Windowsservercoreiis为commit构建,安装了web-server,web-asp,web-asp-net45。iisbase为Dockerfile构建,安装了web-server,web-asp,web-asp-net45,.net 3.5, web-asp-net。如果不需要支持低版本的asp.net应用,基于Windowsservercoreiis会小不少。

总结


Windows Server Container在Hyper-V VM中的表现比直接在物理机上搭建Docker环境好上不少,常用功能基本都有了。等后续进一步完善Docker命令的兼容性、容器的稳定性以及丰富应用镜像之后,相信市场前景还是很不错的,期待正式版的推出。后续将进一步探究如何使用Windows容器实现开发、测试以及生产的一体化流程,敬请期待!

本文电子书下载:(点击下方阅读原文可在线阅读)
网页下载:
http://www.cloudsoar.com/down/ddoc/v1.1/
百度云盘下载:
http://pan.baidu.com/s/1i3Zede9

以上是关于ASP.NET容器化(Windows Server容器初探)的主要内容,如果未能解决你的问题,请参考以下文章

到 Azure ACI 的基本容器化 ASP.NET 3.1 Core 应用部署失败

.NET开发技能:容器化ASP.NET Core?

Unity容器在asp.net mvc中的IOC应用及AOP应用

如何在 Mac 上将 ASP.Net Core 连接到 SQL Server Docker 容器

ASP.NET Core 5 + SQL Server Docker 容器:无效的撰写项目

超级简便的容器化部署工具(使用 ASP.NET Core 演示)