彭爱华 分布式实验室


十个问题带你了解Windows Docker教程

微软在5月份Build大会上的官方说法,说是这个夏天会放出Windows Server Container的测试版。也就是说,目前我们还无法看到Windows Docker的测试版本,无法直接上手测试。接下来我就大家关心的十大问题进行介绍:

 title=


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是商标名称,微软不能直接拿来使用。

 title=

Docker是OS虚拟化,主要场景是服务端应用,这些容器(应用)之间通过标准的网络接口进行通信,好像虚拟机一样。

Softgrid是应用程序虚拟化,主要用于客户端应用部署。例如Office,这些应用在同一个会话里运行,完全就是传统的应用,彼此之 间可以进行进程间通信,例如Word可以OLE调用Excel的表单等等。不同的进程,看到的文件系统不会隔离。适用于批量部署客户端应用。

 title=

曾经看到一句很棒的评语,必须分享给诸位:

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浏览器就采用了沙盒技术。

 title=同样在保护模式下运行的Office文档,也运行在 沙盒里。如下图所示。

 title=而容器,则还必须要在移动能力上有所考量,确保让应用,也能变成按需递交的动态服务。以前的硬件虚拟化,能将OS、App等变成文档,从而把服务器资源变成按需递交的服务,现在Windows Docker和linux一样,也能变成image,变成文档,变成按需递交的动态服务。

 title=

从技术角度看,底层原理大同小异。看图吧。

 title=Docker和其他OS虚拟化技术一样,技术实现大致差不多。关键看谁能带动生态圈,能够赢得其他厂商的支持。同时Docker的分层文件 系统实现,也是其特别引人入胜的地方。

 title=

先看看Linux的实现。DaoCloud的大牛孙宏亮老师指出:假设我们下拉了Ubuntu:14.04映像,并通过命令docker run –it ubuntu:14.04 /bin/bash将其启动运行。则Docker为其创建的rootfs以及容器可读写的文件系统。参考这张截图

 title=

从容器的视角来看,虽然只有一个逻辑的完整文件系统,但该文件系统由“2层”组成,分别为读写文件系统和只读文件系统。

Windows Docker采用类似的分层文件系统。参考下图。

 title=

Windows Docker采用NTFS文件系统的重解析点技术(reparse point),顶层的沙盒层(sandbox layer)是可读写的,只允许该容器自己占用,而其他层 则是只读的。在这张图中,底层的基础OS层和中间的应用程序框架层都是只读的,而顶层的沙盒层则可读写,在 容器的视角看来,它独占了完整的文件系统。

这有点类似于Hyper-V的差异磁盘链(顶部的子盘才能读写,其上方的所有父盘和Base盘都是只读的)。

Windows Docker的分层文件系统,我是将其理解为类似符号链接(仅仅用来帮助理解,不要真的轻信),当顶层的沙盒层打开文件时, 相当于打开一个符号链接,而尝试修改时,则COW(Copy on write)。到底采用什么底层文件系统技术,如何实现多个容器并发访问只 读Layer文件的性能,如何cache等,目前一概不知道。Sorry!

 title=

前段时间的热门话题,除了股票,就要算是某在线旅游商的悲剧了,坊间甚至传闻其为数据误删!!!

有客户曾经问到:Docker能否避免这种悲剧?其实Docker和虚拟机一样,都替代不了容灾和备份的机制。不过Docker确实有文件系统隔离 的能力。我在Build大会里看到,演示者在Windows Container里执行删除C盘根目录下所有文件和注册表键值,尽管这个容器被毁了 ,但是根本不会影响其他容器,更不会影响主机,这和linux Docker一样。看图片吧。

 title=

 title=

在另一位孙老师,孙建波老师的文章里我们看到,linux Docker采用了IPC隔离机制。而Windows Docker也采用类似的隔离机制。这个机制就是所谓的会话隔离。

那么Windows里,哪些技术会用到会话隔离呢,盆盆简单总结一下:

  • 首先是终端服务,会话就是为了这个技术而发明的。
  • 快速用户切换,这和终端服务实际上是一样,只不过快速用户切换只会提供最新登录用户的桌面(shell)。
  • 从Windows Vista开始,系统级进程和服务,运行在会话0里,这就是为什么我们无法再用”mstsc /console”命令来登录到服务器的控制台会话。
  • 从Windows 8开始,Metro Application(平板专用的应用),也采用会话隔离技术。

也就是说,会话是为了终端服务这种多用户机制来准备的。

用Sysinternals Suite工具包里的Winobj这个小工具,可以看到会话隔离的效果。 title=

在图中可以看到,不同会话里拥有不同的对象命名空间,例如不同容器,有自己独立的窗口站(终端服务,其他场合只有当前登录用 户才有Winsta窗口站),BaseNamedObjects目录,包含事件、互斥信号和内存段等对象。不同会话里的应用,不能够发送窗口消息(Window Message,以防止粉碎***)。

Windows Docker沿用了会话隔离技术,不同容器在同一个Windows主机上访问同一个命名对象,就不会导致冲突。

在Build大会的演示里,启动了2个容器,都是从同一个Windows Server Core映像里创建出来。在其中一个容器里运行tasklist命令, 显示当前的进程信息,包括会话。 title=

在这个截图中,我们可以看到该容器运行在会话14里。

在另外一个容器里同样运行tasklist。可以看到该容器运行在会话15里。

 title=

类似于两个容器,分别通过远程桌面访问一样,拿到不同的会话(session),从而获得namespace隔离能力。

从两个截图里能看到什么?其中System和空闲进程是共享的,这说明Docker是共享宿主机的内核。当然进程号都一样不代表什么,因 为所有Windows里,这两个进程的PID都一样!而每个容器都有自己的svchost进程、csrss进程和wininit进程等。这些进程都是 per-session的。

 title=

传统的Windows应用大多是有GUI的,所以这些应用可能需要通过图形化方式进行远程操控。Windows Docker会通过容器的RDP服务连 接上来。

 title=图中显示通过RDP服务连接到Process Explorer这个带GUI的系统进程管理工具。由于RDP实际上就是终端服务,所以Process Explorer这个图形化进程相当于又运行在一个新的会话里了!这个说起来有点拗口。

 title=从这张图里我们可以看出,由于Process Explorer是在终端会话里打开的,所以我们可以在容器的任务管理器里看到有两个会话:

  • 会话14是Docker自己的会话,在这里尝试启动Process Exploer,但是啥都看不到,这个是正常的,因为图形化界面无法在Docker客户端 里显示,Linux也采用类似VNC/RDP等办法开专门的通道访问。
  • 而会话15则是通过RDP访问的会话

 title=

和linux Docker,Windows Docker(记住有两个产品,Windows server container和hyper-v container)完全支持linux Docker的接口和工具集。就好比电视机和投影仪,其内部实现固然大相径庭,然其和电脑的之间的接口则几乎完全一致。

创建Windows 容器,和linux一样,有Docker file,直接Docker build,生成Image。

Docker File的简单范例:

<pre style="margin-top:0px;margin-bottom:1em;padding:10px 20px;max-width:100%;border:1px solid rgb(204,204,204);line-height:32px;color:rgb(102,102,102);background-color:rgb(250,250,250);">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服务。

 title=

首先分享灵雀云老大左玥老师的PPT。 title=

可以看到session和JO,是Windows Docker的隔离技术,同时JO技术类似于linux里的CGroup。可以参考chrome的相关技术。chrome就是用到了不少Windows的隔离技术。

再看一张图片。

 title=

从这里可以看出Windows Docker不同版本和linux之间的异同点。其中Hyper-V Container的安全能力高于Windows Server Container。

Windows Server Container和Hyper-V Container之间的差异,可以参考这个图片。最大的差别在于,hyper-v container支持多租户安全能力,同时支持加域。而Windows server container则不能加域,这意味着如果这个应用需要加域的话,则无法用Windows Server Container。

 title=

标签: 容器, linux, Windows, Docker, 会话, Container

相关文章推荐

添加新评论,含*的栏目为必填