伴随着Windows Server 2016 Technical Preview 3 (TP3)版本的发布,微软首次提供了Windows平台下地原生容器。它集成了Docker对Windows Server的支持,这意味着你可以在Windows环境下运行Docker容器。
首先需要明白的是,这不是第一次提供Windows下的容器。Odin(一家软件托管公司)已经通过自己的系统提供Windows容器超过十年了。考虑到他们没有获得微软提供的任何源代码,这不是一件简单的事。
其次,Windows容器(即使是Docker)仅仅被用来运行Windows应用。即使有共同的特性,所有现有基于Linux的容器不能在Windows中运行,对于那些起步者我认为这是一个通常的转换点。
还有两种Windows容器技术也是如此,一种基于Hyper-V,另一种可以直接运行在Window Server 2016(指的是Windows Server容器)。后者已经在这个发行版本中提供,所以我们将在这里测试它。
整个安装过程非常简单,选择安装类型,选择一个驱动,直到完成安装。在我的体验中,我认为这是我所接触过安装最简单的Windows,所有设置和运行时间少于5分钟。当然,这是一个良好的开端。
这是我第一次使用Windows 2016,如果你熟悉Windows 10和Windows Server 2012,你会觉得(至少在视觉上)它是两个的混合体。事实上,自从2012 R2版本后已经有很多问题得到了修复。对于Server来说磁贴导航是(现在仍然是)非常糟糕的主意,尤其是在远程管理的时候。正如上面的截图所示,微软已经回归到了更加熟悉和直观地正常的启动菜单驱动系统。
一旦你的Windows 2016 TP3基础版本安装完成后,你就可以安装Windows Server容器组件Docker和创建需要的容器镜像了。微软有一个引导来帮助你完成整个简单的过程。虽然只有三个步骤,由于最后一步需要下载容器的基础镜像(大于3GB),所以会耗费一些时间。
注意:
确保根据以下的引导来安装镜像。如果不这样,容器不会像预期一样工作。
让我们来看一下PowerShell脚本具体是做什么的。虽然从节省时间的角度来看单行安装不错,你需要彻底地检查每一个步骤来看看它做了什么工作。尤其是当它是生产服务器的时候,你永远不应该盲目地安装你没有检查过或不理解的任何脚本。
第一步是建立一个虚拟交换机用于容器的联网。它通过使用DHCP来分配127.16.0.1/12范围的IP地址和NAT来使得外部可访问主机。接着,安装容器组件(Install-Feature -FeatureName Containers)然后安装一个“zdp.cab”,如果它是可用的。这相当含糊,这个文件并不存在于我的系统中。谷歌搜索也没有找到相关的结果,最接近的是“Zero Day Package”,说明它只是简单的更新汇总文件。
然后安装器下载了“ContainerBaseImage.wim”并放到了C盘。这会耗费一些时间,因为这个基础镜像依然超过了3GB。PowerShell脚本中一个有趣的注释是微软为了性能禁用了进度条。这让我很好奇,我测试了下载(使用wget)并启用了进度条,这耗费了两个核心70%的性能,所以他们并没有开玩笑。一旦.wim文件下载完成就安装基本容器镜像(使用“Install-ContainerOsImage”命令)。
接下来Docker已经完成了下载并已经被安装了。然后再NSSM也就是“Non-Sucking Service Manager”的帮助下启动服务。最后这个基础镜像已经在Docker中被标记了,然后就可以使用了。
在Conteix,我们已经使用Windows Odin容器超过10年,所以容器的概念并不是新的。但是这里仍然有几个关键的区别,当然这也在随着产品的发展在不断变化。最主要的是基础镜像(.wim文件)必须与当前主机版本和补丁级别完全匹配。如果要为你的服务器打补丁,你需要重新下载并安装容器镜像。我希望这只是一个简单的问题并且微软能在发布正式版本的时候有办法自动更新补丁级别。
然后,并不是一切都一帆风顺。在预览版中可能会出现重新执行一些指令甚至删除重新创建容器的情况。所有的命令都是通过PowerShell执行,你需要保证PowerShell运行在管理员权限下。
让我们来开始创建基础容器:
New-Container -Name "WinContainerTest" -ContainerImageName WindowsServerCore -SwitchName "Virtual Switch"
这并不会启动容器,所以现在我们来执行Start-Container命令:
Start-Container WinContainerTest
PowerShell最开始会显示一个进度条。在我的系统里,非常快只耗费了5分钟就启动了。可能是我现在缺乏PowerShell的使用经验,通过容器做一些操作稍显困难。尽管通过名字可以创建和启动它,通过PowerShell访问它之前你需要获得它的ID。Get-Container还是会返回一些输出(如下所示),或者一个对象。
(在我看来)没办法直接通过命令来获得ID。所以,我们需要先通过PowerShell对象保存数据然后将对象获得的ID输入PowerShell。命令如下:
$container = Get-Container "WinContainerTest"
Enter-PSSession -ContainerId $container.ContainerId -RunAsAdministrator
我们已经进入容器了。为了突出它,我简答地执行了 ipconfig 命令:
[c2d9f681-aa4]: PS C:/Windows/system32> ipconfig
Windows IP Configuration
Ethernet adapter vEthernet (Virtual Switch-C2D9F681-AA47-4652-B8EC-EED812EF8B25-0):
Connection-specific DNS Suffix . :
Link-local IPv6 Address . . . . . : fe80::3de8:8a78:5788:8191
IPv4 Address. . . . . . . . . . . : 172.16.0.2
Subnet Mask . . . . . . . . . . . : 255.240.0.0
Default Gateway . . . . . . . . . : 172.16.0.1
[c2d9f681-aa4]: PS C:/Windows/system32>
通过简单地测试,最终显示WIndows 2016 TP3 有一个基础的可使用的容器系统。
是Docker新手吗?请确认你已经阅读了我的“What is Docker”这篇文章,它会帮助你加快速度。在nutshell中,Docker是一个应用级容器而在Linux世界中它在过去的18个月中获得了巨大的增长。一旦你开始使用Docker,你就会明白为什么会这样。应用部署变得易于管理和能够非常严格的控制。这也会使得Windows平台应用极大受益。
https://msdn.microsoft.com/vir ... ocker
让我们来看一下我们有什么镜像:
C:/Users/Administrator> docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
windowsservercore 10.0.10514.0 0d53944cb84d 3 weeks ago 9.697 GB
windowsservercore latest 0d53944cb84d 3 weeks ago 9.697 GB
PS C:/Users/Administrator>
可以看到一个基础的windowsservercore镜像,所以让我们启动Docker容器并和它快速交互一下(使用-it标志):
docker run -it --name dockerdemo windowsservercore powershell.exe
我们使用基础核心镜像,并执行PowerShell。虽然它好像没有做很多事,如果你执行ipconfig命令你就能看到容器的网络详情。以下是我屏幕的输出:
PS C:/Windows/system32> ipconfig
Windows IP Configuration
Ethernet adapter vEthernet (Virtual Switch-b68c41a9a1a36852173aca061b3e7d70d06c288724c9d04701110b9aa8033d22-0):
Connection-specific DNS Suffix . :
Link-local IPv6 Address . . . . . : fe80::8817:363c:10d9:b94e
IPv4 Address. . . . . . . . . . . : 172.16.0.2
Subnet Mask . . . . . . . . . . . : 255.240.0.0
Default Gateway . . . . . . . . . : 172.16.0.1
PS C:/Windows/system32>
在测试的时候我遇到了几个错误,比如不能通过名字和ID引用Docker容器。对于第一个版本,也将会出现像这样的状况,但并没有什么大的问题。为了解决问题,我简单地重启了Docker服务:
net stop docker
net start docker
这个操作每次都能解决所有的小问题,所以如果你要在早期的Windows平台下做很多Docker相关的开发请记住这个方便的方法。
让我们来看一下这里还有哪些镜像:
docker search microsoft
PS C:/Users/Administrator> docker search microsoft
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
microsoft/iis Internet Information Services (IIS) instal... 1 [OK] [OK]
microsoft/dnx-clr .NET Execution Environment (DNX) installed... 1 [OK] [OK]
microsoft/ruby Ruby installed in a Windows Server Contain... 1 [OK]
microsoft/rubyonrails Ruby on Rails installed in a Windows Serve... 1 [OK]
microsoft/python Python installed in a Windows Server Conta... 1 [OK]
microsoft/go Go Programming Language installed in a Win... 1 [OK]
microsoft/mongodb MongoDB installed in a Windows Server Cont... 1 [OK]
microsoft/redis Redis installed in a Windows Server Contai... 1 [OK]
microsoft/sqlite SQLite installed in a Windows Server Conta... 1 [OK]
PS C:/Users/Administrator>
非常棒!作为一名Python程序员,我热衷于快速:
docker pull microsoft/python
现在镜像下载下来,我们将会运行一个快速可交互的Python shell,它在推出时会销毁:
docker run -it --rm microsoft/python cmd
非常不幸,没有像预期一样运行。我甚至不得不指出“cmd”才能使得容器运行,到目前为止也没有找到让python运行的正确方式。显然这是他们正在努力地领域。
对于微软来说这是一个早期的领域,所以我不能对产品太严苛。在容器成为可作为生产环境系统的道路上还有很长的路要走。同时,到目前为止显示有许多承诺。我本未预料到在今年容器出现在预览版所以我还是有点小惊喜。必须重申,这是一个技术预览版。会有许多bugs和缺陷,目前为止它还不是一个完整地系统。值得庆幸的是,微软有一个“Work In Progress”页面,它列出了当前所有的警告和已知问题。
如果他们做好了这个,容器在将所有东西安装进一台服务器和完全虚拟化之间提供了一个极大的中间地带。hypervised和容器化环境的混合模型将会成为可能,而且它很有可能在Linux领域大量使用。我坚信通过Docker提供清洁和重复使用的应用部署将会产生许多开发商。
减少大量底层服务器的占用空间需要强烈关注微软的动作,至少他们所展现的东西显示他们还需要努力。一些Linux为基础的操作系统(比如COS)很轻量只有454MB来运行Docker容器。然而Windows 2016的基础安装需要11GB之多,而如果要安装Docker和容器功能则超过了20GB。基础容器镜像压缩后超过了3GB,所以这方面依然还有许多工作来做。
总体而言,我们期待下一次的更新,我们将持续密切关注Windows Server容器技术的发展和成熟进度。
Tim Butler
有超过20年IT行业经验,我曾参与研发高并发系统。我目前的工作时为大公司和澳大利亚政府部门研发高可用高性能的web、email和VM平台。
希云是Docker领域的专家,致力于通过Docker技术提供更好的云计算产品和服务。希云品牌下的产品包括了
COS容器操作系统
cSphere容器管理平台
CDT基于容器的开发测试平台
CShow基于容器的项目演示平台
CHub企业版Registry
并提供相关的培训和咨询服务
微镜像服务
Docker企业培训
应用Docker化咨询
软件SaaS化咨询
PaaS化咨询
欢迎企业垂询:
电话:400-686-1560
邮箱: contactus@csphere.cn
微信关注cSphere-CN,回复数字“1”即可查看【Docker持续部署图文详解】
尊重知识,请必须全文转载,不得删改,包括本行。