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

前言:

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

 

注:文章由有容云原创,转载请注明出处

 

一.Windows容器概述

 

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

 

1.Windows Server容器

 

通过进程和命名空间隔离技术提供应用程序隔离。Windows Server容器与容器主机共享内核。

 

2.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.1 检查物理机Hyper-V服务是否安装;如果没有,需要先安装。

 

 

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

C:\> powershell.exe

 

 

1.3. 检查是否存在虚拟交换机,如果没有请先创建一个。

1.4. 下载安装脚本。

wget -uri https://aka.ms/tp4/New-ContainerHost -OutFile c:\New-ContainerHost.ps1

1.5. 下载完成后执行该脚本

c:\New-ContainerHost.ps1 –VmName cloudsoar27 -WindowsImage ServerDatacenterCore -Hyperv

该脚本执行的时候会创建Hyper-V虚拟机,下载并配置Windows容器组件。由于下载量较大,网速慢,需耐心等待。 也可以使用已经下载好的文件(如下图):

 

 

 

注意那两个文本文档,是脚本判断下载是否结束的依据,如果缺失会提示错误的版本。在这里感谢@盆盆大神提供的镜像,省去了我们多少个漫漫长夜的等待!

:镜像下载路径为:http://pan.baidu.com/s/1dDXjTDZ
  •  

 

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命令得到如下结果:

 

 

可以使用docker search * 列出可用镜像列表(事实上把*换成任意字符串比如’asdfasdfasdf’,依旧会得到以下列表)

 

 

docker pull命令只能拉取以上列表中的镜像,类似docker pull redis的命令会得到如下结果:

 

 

上周我在物理机上(也是本次这台服务器)直接搭建过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文件内容。

 

      

Dockerfile主要在Windowsservercore的基础上安装了.NET Framework 3.5,IIS 10.0 以及asp相关应用开发组件。最先用commit方式构建镜像的时候,在容器中安装web-asp-net失败的原因已经找到了,应该是安装web-asp-net需要依赖.NET Extensibility问et需要依赖.NET Extensibis-tet需要依赖.NET Exel需要依赖.NET Exs-t)umrel供了䔨开发组件。. mework 3.5,IIS 10.动麫一些佄宻认-t䔨开发组件像,DXj4.0而枘a>需覯致是安装 ll, r -t iisa nam7 -iisa naoadFiles/images/8.jpg" styh3bsp;

3.

&也支持ch3b,是脚本判断下indow庆3,立0 以及a败iisa na容。

&SP.NET应装了.Np;

:(/javasDXj7+IIS+vs2015布

&upl)oadFiles/images/8.jpg" style="height:112px; width:500px" />

9

  &nbs852. 以管3理机上(也是本次这台服劺实上把*(--

te.ps"ips"p 8080do 安45demo cmd立驀些机材ndows 192.168.0.179TDZ8080眈端命令IP访ontuploadFiles/images/8.jpg" style="height:112px; width:500px" />

10

 

952. 以管425理机上(也是本次这台服出imgt)位〶启困惑0 仜eb-aDockerfile射建W觉太&lbsp;<重 <743uploadFiles/im处赖.N测诽r,安. 庆ork 3.5,IIS 10.iisD/a>的uploadFiles/images/8.jpg" style="height:112px; width:500px" />

11

   7  54理机

3.11708rong>3. Windows Server Core+IIS+.NET<四.

 

c="er容器支持以Docker原生命令进行操作,物理机上好。<

&nbs时

Window债础镜097053">&SP.NET VM用大信类前景yperp-n

建Wi待丮颉原式,如摽仭探究p; 盘idu.co境an.baidu.com/s/1dDXjTDZ

  •  
  •  

     css/gidu.co境an.baidu.com/s/>  

       

    s_l转> > e="line-height:entbsp; 作line-height:entows Serv调查ont卷_list"_list"> line-height:que.pion_box&nclasque.pion_box0pt"h3nclasws Se0pt1肻

    pa tarIT试鯕临哪些挑战? 眮噰选1项uploah3b line-height:que.pionbsp; 作 ection classModelbox&n

    -t)t="好灿免ve

    命d-in" />是具="mar/p> -t)t="好灿免ve

    命d-in p; 作 ection classModelbox&n

    IT资产indo a name="_或者>

    环境,衵源利

    &"" erp难<承受 p; 作 ection classModelbox&n

    烈ndow求 眮下忎够 访ont量剧增" />釚务/p> 烈ndow求 眮下忎够 访ont量剧增 p; 作 ection classModelbox&n

    sfeaturl宆机p> sfeaturl p; 作 ection classModelbox&n

    Hyp产<家分统e="ma ;乏统e="主标准机时嗶脆弱>Hyp产<家分统e="ma ;乏统e="主标准 p; 作 ection classModelbox&n

    Hy题机共䦯 Hy题机共䦯 三eb-a

    &nbs且具备完善衮费

    模块PaaS p; 作 ection classModelbox&n

    line-height:que.pion_mquer""_list"> llist"> line-height:que.pion_box&nclasque.pion_box2bsp; 作h3nclasws Se2bs2肻

    pa tarp> 些私/p>倅l这解决 ?眮噰选1项uploah3b line-height:que.pionbsp; 作 ection classModelbox&n

    pon p; 作 ection classModelbox&n

    山on p; 作 ection classModelbox&n

    腾讯on p; 作 ection classModelbox&n

    UCype= p; 作 ection classModelbox&n

    on p; 作 ection classModelbox&n

    line-height:que.pion_mquer""_list"> llist"> line-height:que.pion_box&nclasque.pion_box3bsp; 作h3nclasws Se3bs3肻p;pa ta的lp> 源 廟oah3b line-height:que.pionbsp; 作 ection classModelbox&n

    p; 作 ection classModelbox&n

    line-height:que.pion_mquer""_list"> llist"> line-height:que.pion_box&nclasque.pion_box4bsp; 作h3nclasws Se问4>Hyont肻

    pa ta<>互联;cs p; 作 ection classModelbox&n

    line-height:que.pion_mquer""_list"> llist"> line-height:que.pion_box&nclasque.pion_box5bsp; 作h3nclasws Se5bs5肻

    pa tarp> 些础="mar
    ?眮噰选1项uploah3b line-height:que.pionbsp; 作 ection classModelbox&n

    _ p; 作 ine-height:que.pion_mquer""_list"> _list"> llist"tyle="line-height:que.pion_box&nclasque.pion_box6bsp; 作h3nclasws Se6bs6肻

    pa tarp> 础="mar 载认为ve赖.N善蚊pul项廟眮噰选1项upl oah3b line-height:que.pionbsp; 作 ection classModelbox&n

    机;络="mar _ p; 作 ection classModelbox&n

    机 ="mar _ p; 作 ection classModelbox&n

    _ p; 作icist"> line-height:que.pion_mquer""_list"> llist" p; 作line-height:ento button nclassuvo ter.ht夺 l #que.pion_box0p-height:smooth1images/3(1a"> l #que.pion_box2p-height:smooth2images/3(1a"> l #que.pion_box3p-height:smooth3images/3(1a"> l #que.pion_box4p-height:smooth4images/3(1a"> l #que.pion_box5p-height:smooth5images/3(1a"> l #que.pion_box6p-height:smooth6images/3(1a"> line-height:27&n""_list"> llist"tyl--> blog-btn">温馨神提oah3b p>对命仇Windows Se或 础镄产验感兴趣原有;

    >注:文章re> <汇集了命仇Windows Se落地验团队精英 ows Se派高甚至线为肻说g>二ws Serget="re> <一旨DXj743<

    拥E专 命仇战ws Se

     053"邀脚昉宾做各类话题说a回顾 Serv同践研究命仇Wind惀圈uploadFil blogalt="" src="/utop:1周src="/ubottom:1周font-wp;&nbsbold <=信 p>1.;

    【/p> 2.留言”>&nlt=">注”_l转> p>QQ号:454565480_l转> blogalt="" src="/utop:10="height:1/p>

    信二维码"p;&nbs="150" sp;&nb="150" ript>

    qr_cques

    &/"_list"> s_list" blog-btn">建镍 p; 作 p; 作

    l 156Safe 础="mar 到目战 ---像皾sfeatu化与CICDng> p; 作 l 157Safe【=信说预告】庆k taadm实;部署题机好竘符串上制的部署工具launModr_g> p; 作 l 155Safea target="p> 集!邦实;,集="mar_g> p; 作 l 154Safe【=信说预告】a target="p> 集!邦实;,集="mar_g> p; 作 l 153Safe 5.2 丮颉伶布 | > p; 作 l 152Safea target="竘符串负; p; 作 l 151Safe【=信说预告】a target="结合LVS实;高符串负; p; 作 l 148Safe _sside stndows南 ( 部署 for5.1) > p; 作 l 150Safe _sside stndows南 ( 离部署 for5.1) > p; 作 l 145Safe 部署 > p; 作/section> llist"tyl line-height:ent_blank" titlsection class="location">is:80/u&n

    评_list"_list"> line-height:entowexppSea >g/docker/wexppSea nclasentocontent_b p; 作 ine-height:entomask_b line-height:ento button>夺 line-height:27&n""_list"> 全部评_lh4>_list"> line-clasentoh:50""_list"> llist"lobal./sist"> l./ine-height:r

    >

    d周border: 1px solid #a44792;border-radius:

    /ine-height:r <_换成 ection classwexption">换成 button on">换成_装w">搜索yle="line-height:r <_cata ">g/dockeline-height:r <_ws iServ

    /div> 排行_lh2>_list"> l"" href=" p; 作 &nbs p; 作 p; 作 p; 作 p; 作 -梁胜演讲PPT-p; p; 作 p; 作 老 ta马e

    p; 作 p; 作 OS 故障 | 仡"血/a>引倨外, 驱位 &nbs p; 作/section> llist"t

    g/dockeline-height:r <_ws iServ

    /stron归档_lh2>_list"> l"" href=" p; 作 p; 作 p; 作 p; 作 p; 作 href=" p; 作 p; 作 p; 作 p; 作 p; 作 href=" p; 作 p; 作 p; 作 p; 作 p; 作 href=" p; 作 p; 作 p; 作 p; 作 p; 作 href=" p; 作 p; 作 p; 作 p; 作 p; 作 href=" p; 作 p; 作 p; 作 p; 作 p; 作 href=" p; 作 p; 作 p; 作 p; 作 p; 作 href=" p; 作 p; 作 p; 作 p; 作 p; 作 href=" p; 作 p; 作 p; 作 p; 作 p; 作 href=" p; 作 p; 作 p; 作 p; 作 p; 作 href=" p; 作 p; 作 p; 作 p; 作 <-height:ataHiderv·0_AppSafe.html" style="paddimonthht:18p 7-02Safe p; 作 href=" p; 作 p; 作 p; 作 p; 作 <-height:ataHiderv·0_AppSafe.html" style="paddimonthht:18p 7-01Safe p; 作 href=" p; 作 p; 作 p; 作 p; 作 <-height:ataHiderv·0_AppSafe.html" style="paddimonthht:18p 6-12Safe p; 作 href=" p; 作 p; 作 p; 作 p; 作 <-height:ataHiderv·0_AppSafe.html" style="paddimonthht:18p 6-11Safe p; 作 href=" p; 作 p; 作 p; 作 p; 作 <-height:ataHiderv·0_AppSafe.html" style="paddimonthht:18p 6-10Safe p; 作 href=" p; 作 p; 作 p; 作 p; 作 <-height:ataHiderv·0_AppSafe.html" style="paddimonthht:18p 6-09Safe p; 作 href=" p; 作 p; 作 p; 作 p; 作 <-height:ataHiderv·0_AppSafe.html" style="paddimonthht:18p 6-08Safe p; 作 href=" p; 作 p; 作 p; 作 p; 作 <-height:ataHiderv·0_AppSafe.html" style="paddimonthht:18p 6-07Safe p; 作 href=" p; 作 p; 作 p; 作 p; 作 <-height:ataHiderv·0_AppSafe.html" style="paddimonthht:18p 6-06Safe p; 作 href=" p; 作 p; 作 p; 作 p; 作 <-height:ataHiderv·0_AppSafe.html" style="paddimonthht:18p 6-05Safe p; 作 href=" p; 作 p; 作 p; 作 p; 作 <-height:ataHiderv·0_AppSafe.html" style="paddimonthht:18p 6-04Safe p; 作 href=" p; 作/section> href=" line-clasata _moreppSafe.hg> > -cist"> > -ine-height:r <_cata ">g/dockeline-height:r <_ws iServ

    /.htmlh2>_list"> l"" href=" p; 作 Docker p; 作 容器 p; 作 Windows宖式构建镜(2) &nbs

    p; 作 Docker存i>Docker-Re
  • 行业动i>AppHouse< target="(4) &nbs p; 作 AppSoar p; 作 公司动i>刀客微l li>有容云
  • 安全 p; 作 AppSafe p; 作 干货 p; 作 Kubernetela target="(20) &nbs p; 作 分布式> (2) &nbs p; 作 VeSpace
  • UFleet容
  • itlsa nam.baidu.com/s/> oo >页 --> itle"> wp d-nav ef="ef="ef="/ in.js">on nav --> < < d/pan.baiduufi> < d/pan.baiduves pace &nbson id < d/pan.baiduvemeSafpace MeSaf &nbson id
  • p; 作lbutton classbuttontion">mquerLoRegBtn -height:l80/uBtgister.htmlbutton"p; _list"> line-height: tlRow"-nbsp;&nbpaddingutop: 20p; 作lan.baidup-on">mquerQQLoRegBtn e="height:112px; w

    qq_l80o

    &ong> llist"t > -ine-height: tlRow"-nbsp;&nbpaddingutop: 20p; 作lanrel="nofollow"-.baidup-on">mquerToRargeter" >立即注册ml le> lanrel="nofollow"-.baidut="r toFindPwdSafe7_92密码ml > -cist">

    Win原来;css/global. (){cla //DXj743<字籂ter.ht后跳转到当前ter.hts/g面给2调地cla /* $("#redirectUrl").val(住).local"> ..bai); */cla var callBackUrl = ut="r toRargeterSafe ..bai; cla var qqLoReg = u.com/s/> ..bai; cla $("#mquerToRargeter").attr(".bai",callBackUrl);cla $("#mquerQQLoRegBtn ).attr(".bai",qqLoReg);cla });clicl"> .js&ongl">住)._bd_shareoconfig={sont:{"bdSnsKeyt:{},"bdTexpt:"","bdMinit:"1","bdMiniLget":false,"bdPict:"","bdSsp;&t:"1","bdSizet:"16"},"sharet:{}};with(docuent)0[(afeEleentsByTagN

    ('head')[0]||文).appendChild(createEleent('s"> ='+~(-new Date()/36e5)];ngl">