【编者的话】微软在5月份Build大会上的官方说法,说是这个夏天会放出Windows Server Container的测试版。也就是说,目前我们还无法看到Windows Docker的测试版本,无法直接上手测试。
接下来我就大家关心的十大问题进行介绍:
Hyper-V和VMware/Xen/KVM等类似,都是硬件虚拟化,安全但笨重。
Windows Docker是OS虚拟化技术,具备一定的隔离能力,性能更好、容易移植。
两者不是互相取代的关系。
注意:Windows Docker并不是我们在Docker 1.6时见到的Windows Docker Client,也不是Boot2docker这个Windows下的linux虚拟机,而是真正的Windows版本的Docker。其实其正式名称并不叫Docker,而是叫做Windows Server Container,还有Hyper-V Container,有2个产品,其中Windows Server Container类似于linux Docker,而Hyper-V Container有些类似于clear linux或者Hyper Docker。
这是因为Docker是商标名称,微软不能直接拿来使用。
Docker是OS虚拟化,主要场景是服务端应用,这些容器(应用)之间通过标准的网络接口进行通信,好像虚拟机一样。
Softgrid是应用程序虚拟化,主要用于客户端应用部署。例如Office,这些应用在同一个会话里运行,完全就是传统的应用,彼此之 间可以进行进程间通信,例如Word可以OLE调用Excel的表单等等。不同的进程,看到的文件系统不会隔离。适用于批量部署客户端应用。
曾经看到一句很棒的评语,必须分享给诸位:
Sandboxing is focused on just security with code isolation. Containers have some security code isolation, but this is not the only or primary purpose. One way to think about containers is as a layered/quarantined filesystem which makes it quick/easy/lightweight to run an application and also makes the application (in the container) very portable.
从下图中我们可以看出,在Windows 10里,IE的继任者Edge浏览器就采用了沙盒技术。
同样在保护模式下运行的Office文档,也运行在 沙盒里。如下图所示。
而容器,则还必须要在移动能力上有所考量,确保让应用,也能变成按需递交的动态服务。以前的硬件虚拟化,能将OS、App等变成文档,从而把服务器资源变成按需递交的服务,现在Windows Docker和linux一样,也能变成image,变成文档,变成按需递交的动态服务。
4. Windows Docker和其他OS虚拟化工具之间是什么关系,例如很早就听闻的VPS等。
从技术角度看,底层原理大同小异。看图吧。
Docker和其他OS虚拟化技术一样,技术实现大致差不多。关键看谁能带动生态圈,能够赢得其他厂商的支持。同时Docker的分层文件 系统实现,也是其特别引人入胜的地方。这个截图的下载地址在 这里 。
先看看Linux的实现。DaoCloud的大牛孙宏亮老师指出:假设我们下拉了Ubuntu:14.04映像,并通过命令Docker run –it ubuntu:14.04 /bin/bash将其启动运行。则Docker为其创建的rootfs以及容器可读写的文件系统。参考这张截图
从容器的视角来看,虽然只有一个逻辑的完整文件系统,但该文件系统由“2层”组成,分别为读写文件系统和只读文件系统。孙老师的雄文链接 在此 。
Windows Docker采用类似的分层文件系统。参考下图。
Windows Docker采用NTFS文件系统的重解析点技术(reparse point),顶层的沙盒层(sandbox layer)是可读写的,只允许该容器自己占用,而其他层 则是只读的。在这张图中,底层的基础OS层和中间的应用程序框架层都是只读的,而顶层的沙盒层则可读写,在 容器的视角看来,它独占了完整的文件系统。
这有点类似于Hyper-V的差异磁盘链(顶部的子盘才能读写,其上方的所有父盘和Base盘都是只读的)。
Windows Docker的分层文件系统,我是将其理解为类似符号链接(仅仅用来帮助理解,不要真的轻信),当顶层的沙盒层打开文件时, 相当于打开一个符号链接,而尝试修改时,则COW(Copy on write)。到底采用什么底层文件系统技术,如何实现多个容器并发访问只 读Layer文件的性能,如何cache等,目前一概不知道。sorry!
前段时间的热门话题,除了股票,就要算是某在线旅游商的悲剧了,坊间甚至传闻其为数据误删!!!
有客户曾经问到:Docker能否避免这种悲剧?其实Docker和虚拟机一样,都替代不了容灾和备份的机制。不过Docker确实有文件系统隔离 的能力。我在Build大会里看到,演示者在Windows Container里执行删除C盘根目录下所有文件和注册表键值,尽管这个容器被毁了 ,但是根本不会影响其他容器,更不会影响主机,这和linux Docker一样。看图片吧
在另一位孙老师,孙建波老师的文章里我们看到,linux Docker采用了IPC隔离机制。而Windows Docker也采用类似的隔离机制。这个机制就是所谓的会话隔离。
那么Windows里,哪些技术会用到会话隔离呢,盆盆简单总结一下:
也就是说,会话是为了终端服务这种多用户机制来准备的。
用Sysinternals Suite工具包里的Winobj这个小工具,可以看到会话隔离的效果。
在图中可以看到,不同会话里拥有不同的对象命名空间,例如不同容器,有自己独立的窗口站(终端服务,其他场合只有当前登录用 户才有Winsta窗口站),BaseNamedObjects目录,包含事件、互斥信号和内存段等对象。不同会话里的应用,不能够发送窗口消息 (Window Message,以防止粉碎攻击)。
Windows Docker沿用了会话隔离技术,不同容器在同一个Windows主机上访问同一个命名对象,就不会导致冲突。
在Build大会的演示里,启动了2个容器,都是从同一个Windows Server Core映像里创建出来。在其中一个容器里运行tasklist命令, 显示当前的进程信息,包括会话。
在这个截图中,我们可以看到该容器运行在会话14里。
在另外一个容器里同样运行tasklist。可以看到该容器运行在会话15里。
类似于两个容器,分别通过远程桌面访问一样,拿到不同的会话(session),从而获得namespace隔离能力。
从两个截图里能看到什么?其中System和空闲进程是共享的,这说明Docker是共享宿主机的内核。当然进程号都一样不代表什么,因 为所有Windows里,这两个进程的PID都一样!而每个容器都有自己的svchost进程,csrss进程,和wininit进程等。这些进程都是 per-session的。
传统的Windows应用大多是有GUI的,所以这些应用可能需要通过图形化方式进行远程操控。Windows Docker会通过容器的RDP服务连 接上来。
图中显示通过RDP服务连接到Process Explorer这个带GUI的系统进程管理工具。由于RDP实际上就是终端服务,所以Process Explorer这个图形化进程相当于又运行在一个新的会话里了!这个说起来有点拗口。
从这张图里我们可以看出,由于Process Explorer是在终端会话里打开的,所以我们可以在容器的任务管理器里看到有两个会话:
和linux Docker,Windows Docker(记住有两个产品,Windows server container和hyper-v container)完全支持linux Docker的接口和工具集。就好比电视机和投影仪,其内部实现固然大相径庭,然其和电脑的之间的接口则几乎完全一致。
创建Windows 容器,和linux一样,有Docker file,直接Docker build,生成Image。
Docker File的简单范例:
From Windowsservercore
WORKDIR /
COPY bin/Debug/ /Deapp
CMD /DemoApp/Demoapp.exe
今后微软的Windows azure云,可以直接支持Docker,不管是Windows还是linux,都可以直接用最新的visual studio把代码签到azure的linux或者Windows容器里。当然也可以直接用azure的visual studio online服务。
首先分享灵雀云老大左玥老师的PPT。
可以看到session和JO,是Windows Docker的隔离技术,同时JO技术类似于linux里的CGroup。可以参考chrome的相关技术。chrome就是用到了不少Windows的隔离技术。
再看一张图片。
从这里可以看出Windows Docker不同版本和linux之间的异同点。其中Hyper-V Container的安全能力高于Windows Server Container。
Windows Server Container和Hyper-V Container之间的差异,可以参考这个图片。最大的差别在于,hyper-v container支持多租户安全能力,同时支持加域。而Windows server container则不能加域,这意味着如果这个应用需要加域的话,则无法用Windows Server Container。
问: 从前部分看讲解的来看,个人觉得Windows Server Docker主要用到的是Dandbox沙盒技术,对吗?
答:应该说和linux Docker一样,既有沙盒技术,又有分层文件系统。
问: Windows也有在容器里面使用的Image了吗?下载下来之后在liunx的Dockr里面能用起来吗?linux的Image在Windows Server Docker里面能跑起来吗?
答:Windows Docker和linux不兼容。不能将linux image放在Windows里运行。因为Docker是共享内核的,两者实现完全不同。
问:支持GUI吗?
答: 能支持GUI,就和Linux docker一样。但是由于Docker Client本身不能支持GUI,所以需要用RDP Client连接。
问:Windows的Docker只是用Windows做基础的,没有像linux那样去抹平不同发行版的差异?
答: 由于Docker实质是OS虚拟化技术,所以依赖于OS kernel,Windows和linux互相不兼容。目前的其中一个解决办法是,从代码源头解决,例如同一个代码,既可以签入到Windows容器,也可以嵌入到linux容器上(跑linux版本的.NET)。
问:Win PC上是不是不用再像目前安装Docker那样先安装虚拟机之类的?
答:不是,Windows Docker是原生的Windows版本的Docker机制,和linux Docker等价,不是采用Boot2Docker这样的虚拟机。
问:Windows Docker是已经有Windows的image吗?
答:对,会有Windows sever image,例如我们熟悉的Windows server core,还会有今后的Windows nano server。
问:这些image是不是都不带GUI?管理起来的话,微软目前有自己的容器管理平台了吗?
答:可以有GUI,但是云端的环境,倾向于弱化GUI,这就是微软为什么要推出完全没有GUI的Windows Nano Server的原因,Nano Server,不但没有GUI,连Console都没有,需要通过PowerShell命令行等远程管理。另外,Windows Docker支持传统的linux Docker接口。
问:Windows Docker有哪些比较典型的应用场景么?
答:Windows Docker的典型场景,和linux几乎一样,都是实现应用的动态服务化,打断应用和底层硬件设备之间的紧密耦合的纽带。
问:Windows Docker有哪些比较典型的应用场景么?
答:Windows Docker的典型场景,和linux几乎一样,都是实现应用的动态服务化,打断应用和底层硬件设备之间的紧密耦合的纽带。
===========================
以上内容根据2015年7月21日晚微信群分享内容整理。分享人 彭爱华,微软云计算解决方案顾问,微软高级讲师。 DockOne每周都会组织定向的技术分享,欢迎感兴趣的同学加微信:liyingjiesx,进群参与,您有想听的话题可以给我们留言。